mirror of
https://github.com/ruby/ruby.git
synced 2026-10-28 16:36:20 +08:00
[Bug #21818] Currently exceptions can be sent across ractors, but because of a limitation in the TypedData API, the exception backtrace is duped as an empty backtrace. The problem is that backtraces are embedded objects, hence the classic `rb_class_alloc(klass)` API is insufficient because we need to know the size of the Backtrace object we're duping to instantiate the copy. This is worked around by changing Ractors to call `#clone` on objects rather than use `rb_obj_clone`, and to implement `Thread::Backtrace#clone` to properly clone the variable size object.
43 lines
1006 B
Cheetah
43 lines
1006 B
Cheetah
%# -*- c -*-
|
|
/* DO NOT EDIT THIS FILE DIRECTLY: source is at template/id.c.tmpl */
|
|
/**********************************************************************
|
|
|
|
id.c -
|
|
|
|
$Author$
|
|
created at: Wed Dec 5 02:36:10 2012
|
|
|
|
Copyright (C) 2004-2007 Koichi Sasada
|
|
|
|
**********************************************************************/
|
|
<%
|
|
defs = File.join(File.dirname(File.dirname(erb.filename)), "defs/id.def")
|
|
ids = eval(File.read(defs), nil, defs)
|
|
ops = ids[:token_op].uniq {|id, op, token| token && op}
|
|
%>
|
|
% ops.each do |_id, _op, token|
|
|
% next unless token
|
|
#define t<%=token%> RUBY_TOKEN(<%=token%>)
|
|
% end
|
|
|
|
static const struct {
|
|
unsigned short token;
|
|
RBIMPL_ATTR_NONSTRING() const char name[3];
|
|
const char term;
|
|
} op_tbl[] = {
|
|
% ops.each do |_id, op, token|
|
|
% next unless token
|
|
{t<%=token%>, "<%=op%>"},
|
|
% end
|
|
};
|
|
|
|
static void
|
|
Init_id(void)
|
|
{
|
|
rb_encoding *enc = rb_usascii_encoding();
|
|
|
|
% ids[:predefined].each do |token, name|
|
|
REGISTER_SYMID(id<%=token%>, "<%=name%>");
|
|
% end
|
|
}
|