1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

signal delivered to main_thread

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/v1_1r@166 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
matz 1998-04-14 04:55:53 +00:00
parent d453b1a042
commit a1a693e138
16 changed files with 490 additions and 324 deletions

View file

@ -1,3 +1,21 @@
Tue Apr 14 11:34:50 1998 Yukihiro Matsumoto <matz@netlab.co.jp>
* struct.c (struct_s_def): supports subclassing of Struct.
* io.c (io_s_new): supports subclassing of IO.
Mon Apr 13 11:07:39 1998 Yukihiro Matsumoto <matz@netlab.co.jp>
* eval.c (f_binding): need to restore method name.
* eval.c (rb_call0): raises SystemStackError, not Fatal.
* io.c (obj_display): same as `print self'.
* io.c (f_p): can now be called in the method form.
* re.c (reg_regsub): needed to be mbchar aware.
Mon Apr 13 13:18:32 1998 Yukihiro Matsumoto <matz@netlab.co.jp>
* eval.c (thread_trap_eval): all handlers executed under main_thread.
@ -10,6 +28,10 @@ Sun Apr 12 22:14:07 1998 Kazunori NISHI <kazunori@swlab.csce.kyushu-u.ac.jp>
* array.c (ary_uniq_bang): should be `==', not `='. embarrassing.
Sat Apr 11 02:13:30 1998 Yukihiro Matsumoto <matz@netlab.co.jp>
* array.c (ary_subseq): SEGVed for `[][1,1]'.
Fri Apr 10 21:29:06 1998 Tadayoshi Funaba <tadf@kt.rim.or.jp>
* array.c (ary_subseq): add check for beg larger than array length.

View file

@ -66,7 +66,7 @@ OBJS = array.o \
$(MISSING)
all: miniruby$(binsuffix) rbconfig.rb
@cd ext; ../miniruby$(binsuffix) ./extmk.rb @EXTSTATIC@
@./miniruby$(binsuffix) -Xext extmk.rb @EXTSTATIC@
miniruby$(binsuffix): $(OBJS) $(MAINOBJ) dmyext.o
@rm -f $@
@ -86,8 +86,7 @@ install: rbconfig.rb
clean:; @rm -f $(OBJS) $(LIBRUBY) $(MAINOBJ) rbconfig.rb
@rm -f ext/extinit.c ext/extinit.o dmyext.o
@if test -f ./miniruby$(binsuffix); then \
cd ext; \
../miniruby$(binsuffix) ./extmk.rb clean; \
./miniruby$(binsuffix) -Xext extmk.rb clean; \
fi
realclean: clean

View file

@ -306,9 +306,6 @@ ary_subseq(ary, beg, len)
beg = RARRAY(ary)->len + beg;
if (beg < 0) beg = 0;
}
if (beg >= RARRAY(ary)->len) {
IndexError("out of range %d", beg);
}
if (len < 0) {
IndexError("negative length %d", RARRAY(ary)->len);
}
@ -318,6 +315,9 @@ ary_subseq(ary, beg, len)
if (beg + len > RARRAY(ary)->len) {
len = RARRAY(ary)->len - beg;
}
if (len < 0) {
len = 0;
}
ary2 = ary_new2(len);
MEMCPY(RARRAY(ary2)->ptr, RARRAY(ary)->ptr+beg, VALUE, len);

12
dir.c
View file

@ -100,7 +100,6 @@ dir_closed()
if (dirp == NULL) dir_closed();\
}
#if 0
static VALUE
dir_read(dir)
VALUE dir;
@ -109,13 +108,16 @@ dir_read(dir)
struct dirent *dp;
GetDIR(dir, dirp);
errno = 0;
dp = readdir(dirp);
if (dp)
return str_taint(str_new(dp->d_name, NAMLEN(dp)));
else
return Qnil;
else {
if (errno == 0) /* end of stream */
return Qnil;
rb_sys_fail(0);
}
}
#endif
static VALUE
dir_each(dir)
@ -428,9 +430,7 @@ Init_Dir()
rb_define_singleton_method(cDir, "open", dir_s_open, 1);
rb_define_singleton_method(cDir, "foreach", dir_foreach, 1);
#if 0
rb_define_method(cDir,"read", dir_read, 0);
#endif
rb_define_method(cDir,"each", dir_each, 0);
rb_define_method(cDir,"rewind", dir_rewind, 0);
rb_define_method(cDir,"tell", dir_tell, 0);

47
eval.c
View file

@ -369,6 +369,7 @@ extern VALUE eException;
extern VALUE eRuntimeError;
extern VALUE eSyntaxError;
static VALUE eLocalJumpError;
static VALUE eSysStackError;
extern VALUE eSecurityError;
extern VALUE TopSelf;
@ -404,7 +405,8 @@ struct BLOCK {
VALUE orig_thread;
#endif
struct BLOCK *prev;
} *the_block;
};
static struct BLOCK *the_block;
#define PUSH_BLOCK(v,b) { \
struct BLOCK _block; \
@ -513,10 +515,11 @@ dyna_var_asgn(id, value)
return value;
}
static struct iter {
struct iter {
int iter;
struct iter *prev;
} *the_iter;
};
static struct iter *the_iter;
#define ITER_NOT 0
#define ITER_PRE 1
@ -532,7 +535,7 @@ static struct iter {
the_iter = _iter.prev; \
}
static struct tag {
struct tag {
jmp_buf buf;
struct FRAME *frame;
struct iter *iter;
@ -540,7 +543,8 @@ static struct tag {
VALUE retval;
ID dst;
struct tag *prev;
} *prot_tag;
};
static struct tag *prot_tag;
#define PUSH_TAG(ptag) { \
struct tag _tag; \
@ -675,9 +679,13 @@ rb_check_safe_str(x)
TypeError("wrong argument type %s (expected String)",
rb_class2name(CLASS_OF(x)));
}
if (rb_safe_level() > 0 && str_tainted(x)) {
Raise(eSecurityError, "Insecure operation - %s",
rb_id2name(the_frame->last_func));
if (str_tainted(x)) {
if (safe_level > 0){
Raise(eSecurityError, "Insecure operation - %s",
rb_id2name(the_frame->last_func));
}
Warning("Insecure operation - %s",
rb_id2name(the_frame->last_func));
}
}
@ -2402,7 +2410,7 @@ rb_eval(self, node)
rb_id2name(node->nd_cname));
}
}
if (safe_level >= 4) {
if (safe_level >= 3) {
Raise(eSecurityError, "extending class prohibited");
}
rb_clear_cache();
@ -2412,6 +2420,7 @@ rb_eval(self, node)
klass = rb_define_class_id(node->nd_cname, super);
rb_const_set(the_class, node->nd_cname, klass);
rb_set_class_path(klass,the_class,rb_id2name(node->nd_cname));
obj_call_init(klass);
}
return module_setup(klass, node->nd_body);
@ -2430,7 +2439,7 @@ rb_eval(self, node)
if (TYPE(module) != T_MODULE) {
TypeError("%s is not a module", rb_id2name(node->nd_cname));
}
if (safe_level >= 4) {
if (safe_level >= 3) {
Raise(eSecurityError, "extending module prohibited");
}
}
@ -2438,6 +2447,7 @@ rb_eval(self, node)
module = rb_define_module_id(node->nd_cname);
rb_const_set(the_class, node->nd_cname, module);
rb_set_class_path(module,the_class,rb_id2name(node->nd_cname));
obj_call_init(module);
}
result = module_setup(module, node->nd_body);
@ -3238,7 +3248,7 @@ rb_call0(klass, recv, id, argc, argv, body, nosuper)
}
if ((++tick & 0xfff) == 0 && stack_length() > STACK_LEVEL_MAX)
Fatal("stack level too deep");
Raise(eSysStackError, "stack level too deep");
PUSH_ITER(itr);
PUSH_FRAME();
@ -4738,6 +4748,9 @@ f_binding(self)
data->orig_thread = thread_current();
#endif
data->iter = f_iterator_p();
if (the_frame->prev) {
data->frame.last_func = the_frame->prev->last_func;
}
data->frame.argv = ALLOC_N(VALUE, data->frame.argc);
MEMCPY(data->frame.argv, the_block->frame.argv, VALUE, data->frame.argc);
@ -4802,6 +4815,7 @@ proc_s_new(klass)
break;
}
}
obj_call_init(proc);
return proc;
}
@ -5122,6 +5136,7 @@ void
Init_Proc()
{
eLocalJumpError = rb_define_class("LocalJumpError", eException);
eSysStackError = rb_define_class("SystemStackError", eException);
cProc = rb_define_class("Proc", cObject);
rb_define_singleton_method(cProc, "new", proc_s_new, 0);
@ -5200,7 +5215,6 @@ struct thread {
struct FRAME *frame;
struct SCOPE *scope;
int vmode;
struct RVarmap *dyna_vars;
struct BLOCK *block;
struct iter *iter;
@ -5208,6 +5222,7 @@ struct thread {
VALUE klass;
VALUE trace;
int misc; /* misc. states (vmode/trap_immediate) */
char *file;
int line;
@ -5354,7 +5369,7 @@ thread_save_context(th)
th->klass = the_class;
th->dyna_vars = the_dyna_vars;
th->block = the_block;
th->vmode = scope_vmode;
th->misc = scope_vmode | (trap_immediate<<8);
th->iter = the_iter;
th->tag = prot_tag;
th->errat = errat;
@ -5414,7 +5429,8 @@ thread_restore_context(th, exit)
the_class = th->klass;
the_dyna_vars = th->dyna_vars;
the_block = th->block;
scope_vmode = th->vmode;
scope_vmode = th->misc&SCOPE_MASK;
trap_immediate = th->misc>>8;
the_iter = th->iter;
prot_tag = th->tag;
errat = th->errat;
@ -5445,6 +5461,7 @@ thread_restore_context(th, exit)
case 3:
rb_trap_eval(th_cmd, th_sig);
errno = EINTR;
break;
case 4:
@ -6058,7 +6075,6 @@ catch_timer(sig)
#endif
if (!thread_critical) {
if (trap_immediate) {
trap_immediate = 0;
thread_schedule();
}
else thread_pending = 1;
@ -6259,6 +6275,7 @@ thread_trap_eval(cmd, sig)
thread_ready(main_thread);
if (curr_thread == main_thread) {
rb_trap_eval(cmd, sig);
return;
}
thread_save_context(curr_thread);
if (setjmp(curr_thread->context)) {

View file

@ -328,7 +328,9 @@ fdbm_store(obj, keystr, valstr)
dbmp->di_size = -1;
dbm = dbmp->di_dbm;
if (dbm_store(dbm, key, val, DBM_REPLACE)) {
#ifdef HAVE_DBM_CLAERERR
dbm_clearerr(dbm);
#endif
if (errno == EPERM) rb_sys_fail(Qnil);
Fail("dbm_store failed");
}

View file

@ -1,5 +1,6 @@
$LDFLAGS = "-L/usr/local/lib"
have_library("gdbm", "dbm_open") or have_library("dbm", "dbm_open")
if have_func("dbm_open")
have_func("dbm_clearerr")
create_makefile("dbm")
end

View file

@ -44,6 +44,7 @@ static VALUE gColorSel;
static VALUE gColorSelDialog;
static VALUE gImage;
static VALUE gDrawArea;
static VALUE gEditable;
static VALUE gEntry;
static VALUE gEventBox;
static VALUE gFixed;
@ -4429,6 +4430,98 @@ darea_size(self, w, h)
return self;
}
static VALUE
edit_sel_region(self, start, end)
VALUE self, start, end;
{
gtk_editable_select_region(GTK_EDITABLE(get_widget(self)),
NUM2INT(start), NUM2INT(end));
return self;
}
static VALUE
edit_insert_text(self, new_text)
VALUE self;
{
gint pos;
Check_Type(new_text, T_STRING);
gtk_editable_insert_text(GTK_EDITABLE(get_widget(self)),
RSTRING(new_text)->ptr,
RSTRING(new_text)->len,
&pos);
return INT2NUM(pos);
}
static VALUE
edit_delete_text(self, start, end)
VALUE self, start, end;
{
gtk_editable_delete_text(GTK_EDITABLE(get_widget(self)),
NUM2INT(start), NUM2INT(end));
return self;
}
static VALUE
edit_get_chars(self, start, end)
VALUE self, start, end;
{
gchar *s;
s = gtk_editable_get_chars(GTK_EDITABLE(get_widget(self)),
NUM2INT(start), NUM2INT(end));
return str_new2(s);
}
static VALUE
edit_cut_clipboard(self, time)
VALUE self, time;
{
gtk_editable_cut_clipboard(GTK_EDITABLE(get_widget(self)),NUM2INT(time));
return self;
}
static VALUE
edit_copy_clipboard(self, time)
VALUE self, time;
{
gtk_editable_copy_clipboard(GTK_EDITABLE(get_widget(self)),NUM2INT(time));
return self;
}
static VALUE
edit_paste_clipboard(self, time)
VALUE self, time;
{
gtk_editable_paste_clipboard(GTK_EDITABLE(get_widget(self)),NUM2INT(time));
return self;
}
static VALUE
edit_claim_selection(self, claim, time)
VALUE self, claim, time;
{
gtk_editable_claim_selection(GTK_EDITABLE(get_widget(self)),
RTEST(claim), NUM2INT(time));
return self;
}
static VALUE
edit_delete_selection(self)
VALUE self;
{
gtk_editable_delete_selection(GTK_EDITABLE(get_widget(self)));
return self;
}
static VALUE
edit_changed(self)
VALUE self;
{
gtk_editable_changed(GTK_EDITABLE(get_widget(self)));
return self;
}
static VALUE
entry_initialize(self)
VALUE self;
@ -5625,7 +5718,8 @@ Init_gtk()
gColorSelDialog = rb_define_class_under(mGtk, "ColorSelectionDialog", gWindow);
gImage = rb_define_class_under(mGtk, "Image", gMisc);
gDrawArea = rb_define_class_under(mGtk, "DrawingArea", gWidget);
gEntry = rb_define_class_under(mGtk, "Entry", gWidget);
gEditable = rb_define_class_under(mGtk, "Editable", gWidget);
gEntry = rb_define_class_under(mGtk, "Entry", gEditable);
gEventBox = rb_define_class_under(mGtk, "EventBox", gBin);
gFixed = rb_define_class_under(mGtk, "Fixed", gContainer);
gGamma = rb_define_class_under(mGtk, "GammaCurve", gVBox);
@ -5666,7 +5760,7 @@ Init_gtk()
gProgressBar = rb_define_class_under(mGtk, "ProgressBar", gWidget);
gScrolledWin = rb_define_class_under(mGtk, "ScrolledWindow", gContainer);
gTable = rb_define_class_under(mGtk, "Table", gContainer);
gText = rb_define_class_under(mGtk, "Text", gWidget);
gText = rb_define_class_under(mGtk, "Text", gEditable);
gToolbar = rb_define_class_under(mGtk, "Toolbar", gContainer);
gTooltips = rb_define_class_under(mGtk, "Tooltips", cData);
gTree = rb_define_class_under(mGtk, "Tree", gContainer);
@ -5958,6 +6052,18 @@ Init_gtk()
rb_define_method(gDrawArea, "initialize", darea_initialize, 0);
rb_define_method(gDrawArea, "size", darea_size, 2);
/* Editable */
rb_define_method(gEditable, "select_region", edit_sel_region, 2);
rb_define_method(gEditable, "insert_text", edit_insert_text, 3);
rb_define_method(gEditable, "delete_text", edit_delete_text, 2);
rb_define_method(gEditable, "get_chars", edit_get_chars, 2);
rb_define_method(gEditable, "cut_clipboard", edit_cut_clipboard, 1);
rb_define_method(gEditable, "copy_clipboard", edit_copy_clipboard, 1);
rb_define_method(gEditable, "paste_clipboard", edit_paste_clipboard, 1);
rb_define_method(gEditable, "claim_selection", edit_claim_selection, 2);
rb_define_method(gEditable, "delete_selection", edit_delete_selection, 0);
rb_define_method(gEditable, "changed", edit_changed, 0);
/* Entry */
rb_define_method(gEntry, "initialize", entry_initialize, 0);
rb_define_method(gEntry, "set_text", entry_set_text, 1);

View file

@ -94,6 +94,7 @@ sock_new(class, fd)
fp->f2 = rb_fdopen(fd, "w");
fp->mode = FMODE_READWRITE;
io_unbuffered(fp);
obj_call_init((VALUE)sock);
return (VALUE)sock;
}
@ -543,7 +544,6 @@ tcp_s_open(class, host, serv)
VALUE s;
Check_SafeStr(host);
s = open_inet(class, host, serv, INET_CLIENT);
obj_call_init(s);
return s;
}
@ -562,7 +562,6 @@ socks_s_open(class, host, serv)
Check_SafeStr(host);
s = open_inet(class, host, serv, INET_SOCKS);
obj_call_init(s);
return s;
}
#endif
@ -579,7 +578,6 @@ tcp_svr_s_open(argc, argv, class)
s = open_inet(class, arg1, arg2, INET_SERVER);
else
s = open_inet(class, 0, arg1, INET_SERVER);
obj_call_init(s);
return s;
}
@ -812,7 +810,6 @@ udp_s_open(class)
VALUE s;
s = sock_new(class, socket(AF_INET, SOCK_DGRAM, 0));
obj_call_init(s);
return s;
}
@ -958,7 +955,6 @@ unix_s_sock_open(sock, path)
{
VALUE s;
s = open_unix(sock, path, 0);
obj_call_init(s);
return s;
}
@ -985,7 +981,6 @@ unix_svr_s_open(sock, path)
{
VALUE s;
s = open_unix(sock, path, 1);
obj_call_init(s);
return s;
}
@ -1144,20 +1139,15 @@ sock_s_open(class, domain, type, protocol)
setup_domain_and_type(domain, &d, type, &t);
fd = socket(d, t, NUM2INT(protocol));
if (fd < 0) rb_sys_fail("socket(2)");
s = sock_new(class, fd);
obj_call_init(s);
return s;
return sock_new(class, fd);
}
static VALUE
sock_s_for_fd(class, fd)
VALUE class, fd;
{
VALUE s = sock_new(class, NUM2INT(fd));
obj_call_init(s);
return s;
return sock_new(class, NUM2INT(fd));
}
static VALUE

1
file.c
View file

@ -73,6 +73,7 @@ file_open(fname, mode)
fptr->mode = io_mode_flags(mode);
fptr->f = rb_fopen(fname, mode);
fptr->path = strdup(fname);
obj_call_init((VALUE)port);
return (VALUE)port;
}

68
io.c
View file

@ -1002,6 +1002,7 @@ pipe_open(pname, mode)
fptr->f2 = f;
io_unbuffered(fptr);
}
obj_call_init((VALUE)port);
return (VALUE)port;
}
#else
@ -1089,6 +1090,7 @@ pipe_open(pname, mode)
fptr->finalize = pipe_finalize;
pipe_add_fptr(fptr);
#endif
obj_call_init((VALUE)port);
return (VALUE)port;
}
}
@ -1454,14 +1456,21 @@ f_puts(argc, argv)
}
static VALUE
f_p(obj, val)
VALUE obj, val;
f_p(argc, argv, self)
int argc;
VALUE *argv;
VALUE self;
{
VALUE str = rb_inspect(val);
VALUE str;
if (argc > 0) {
rb_scan_args(argc, argv, "1", &self);
}
str = rb_inspect(self);
Check_Type(str, T_STRING);
io_write(rb_defout, str);
io_write(rb_defout, str_new2("\n"));
return Qnil;
}
@ -1469,7 +1478,26 @@ void
rb_p(obj) /* for debug print within C code */
VALUE obj;
{
f_p(Qnil, obj);
f_p(0, 0, obj);
}
static VALUE
obj_display(argc, argv, self)
int argc;
VALUE *argv;
VALUE self;
{
VALUE out;
VALUE str;
rb_scan_args(argc, argv, "01", &out);
if (NIL_P(out)) {
out = rb_defout;
}
io_write(out, self);
return Qnil;
}
static void
@ -1512,29 +1540,31 @@ io_stdio_set(val, id, var)
}
static VALUE
prep_stdio(f, mode)
prep_stdio(f, mode, klass)
FILE *f;
int mode;
VALUE klass;
{
OpenFile *fp;
NEWOBJ(obj, struct RFile);
OBJSETUP(obj, cIO, T_FILE);
OBJSETUP(obj, klass, T_FILE);
MakeOpenFile(obj, fp);
fp->f = f;
fp->mode = mode;
obj_call_init((VALUE)obj);
return (VALUE)obj;
}
static VALUE
io_s_new(argc, argv)
io_s_new(argc, argv, klass)
int argc;
VALUE *argv;
VALUE klass;
{
VALUE fnum, mode;
char *m = "r";
VALUE io;
rb_scan_args(argc, argv, "11", &fnum, &mode);
@ -1542,10 +1572,7 @@ io_s_new(argc, argv)
Check_SafeStr(mode);
m = RSTRING(mode)->ptr;
}
io = prep_stdio(rb_fdopen(NUM2INT(fnum), m), io_mode_flags(m));
obj_call_init(io);
return io;
return prep_stdio(rb_fdopen(NUM2INT(fnum), m), io_mode_flags(m), klass);
}
static VALUE filename, file;
@ -1635,9 +1662,9 @@ next_argv()
fchown(fileno(fw), st.st_uid, st.st_gid);
}
#endif
rb_defout = prep_stdio(fw, FMODE_WRITABLE);
rb_defout = prep_stdio(fw, FMODE_WRITABLE, cIO);
}
file = prep_stdio(fr, FMODE_READABLE);
file = prep_stdio(fr, FMODE_READABLE, cIO);
}
}
else {
@ -2135,8 +2162,8 @@ io_s_pipe()
#endif
rb_sys_fail(0);
r = prep_stdio(fdopen(pipes[0], "r"), FMODE_READABLE);
w = prep_stdio(fdopen(pipes[1], "w"), FMODE_WRITABLE);
r = prep_stdio(fdopen(pipes[0], "r"), FMODE_READABLE, cIO);
w = prep_stdio(fdopen(pipes[1], "w"), FMODE_WRITABLE, cIO);
ary = ary_new2(2);
ary_push(ary, r);
@ -2396,7 +2423,8 @@ Init_IO()
rb_define_global_function("`", f_backquote, 1);
rb_define_global_function("pipe", io_s_pipe, 0);
rb_define_global_function("p", f_p, 1);
rb_define_method(mKernel, "p", f_p, -1);
rb_define_method(mKernel, "display", obj_display, -1);
cIO = rb_define_class("IO", cObject);
rb_include_module(cIO, mEnumerable);
@ -2466,11 +2494,11 @@ Init_IO()
rb_define_method(cIO, "ioctl", io_ioctl, -1);
rb_define_method(cIO, "fcntl", io_fcntl, -1);
rb_stdin = prep_stdio(stdin, FMODE_READABLE);
rb_stdin = prep_stdio(stdin, FMODE_READABLE, cIO);
rb_define_hooked_variable("$stdin", &rb_stdin, 0, io_stdio_set);
rb_stdout = prep_stdio(stdout, FMODE_WRITABLE);
rb_stdout = prep_stdio(stdout, FMODE_WRITABLE, cIO);
rb_define_hooked_variable("$stdout", &rb_stdout, 0, io_stdio_set);
rb_stderr = prep_stdio(stderr, FMODE_WRITABLE);
rb_stderr = prep_stdio(stderr, FMODE_WRITABLE, cIO);
rb_define_hooked_variable("$stderr", &rb_stderr, 0, io_stdio_set);
rb_defout = rb_stdout;
rb_define_hooked_variable("$>", &rb_defout, 0, io_defset);

View file

@ -13,12 +13,12 @@
class Delegator
def initialize(obj)
preserved = ::Kernel.instance_methods
for t in self.type.ancestors
preserved |= t.instance_methods
break if t == Delegator
end
preserved |= ::Kernel.instance_methods
preserved -= ["to_s", "nil?", "to_a", "hash", "dup", "==", "=~"]
preserved -= ["__getobj__","to_s","nil?","to_a","hash","dup","==","=~"]
for method in obj.methods
next if preserved.include? method
eval "def self.#{method}(*args,&block); __getobj__.__send__(:#{method}, *args,&block); end"

500
parse.y

File diff suppressed because it is too large Load diff

View file

@ -141,7 +141,7 @@ The variable ruby-indent-level controls the amount of indentation.
(use-local-map ruby-mode-map)
(setq mode-name "ruby")
(setq major-mode 'ruby-mode)
(ruby-mode-variable)
(ruby-mode-variables)
(run-hooks 'ruby-mode-hook))
(defun ruby-current-indentation ()

View file

@ -675,8 +675,6 @@ if defined? Process.kill
x = $!
end
ok(x && x =~ /Interrupt/)
else
ok(false)
end
check "eval"

View file

@ -121,8 +121,8 @@ struct_set(obj, val)
VALUE struct_alloc();
static VALUE
make_struct(name, member)
VALUE name, member;
make_struct(name, member, klass)
VALUE name, member, klass;
{
VALUE nstr;
ID id;
@ -132,7 +132,7 @@ make_struct(name, member)
if (!rb_is_const_id(id)) {
NameError("identifier %s needs to be constant", RSTRING(name)->ptr);
}
nstr = rb_define_class_under(cStruct, RSTRING(name)->ptr, cStruct);
nstr = rb_define_class_under(klass, RSTRING(name)->ptr, klass);
rb_iv_set(nstr, "__size__", INT2FIX(RARRAY(member)->len));
rb_iv_set(nstr, "__member__", member);
@ -174,11 +174,11 @@ struct_define(name, va_alist)
}
va_end(ar);
return make_struct(nm, ary);
return make_struct(nm, ary, cStruct);
}
static VALUE
struct_s_def(argc, argv)
struct_s_def(argc, argv, klass)
int argc;
VALUE *argv;
{
@ -193,8 +193,8 @@ struct_s_def(argc, argv)
ID id = rb_to_id(rest->ptr[i]);
rest->ptr[i] = INT2FIX(id);
}
st = make_struct(name, rest);
obj_call_init((VALUE)st);
st = make_struct(name, rest, klass);
obj_call_init(st);
return st;
}
@ -218,7 +218,7 @@ struct_alloc(klass, values)
st->ptr = ALLOC_N(VALUE, n);
st->len = n;
MEMCPY(st->ptr, RARRAY(values)->ptr, VALUE, RARRAY(values)->len);
memclear(st->ptr+RARRAY(values)->len, n - RARRAY(values)->len);
memclear(st->ptr+RARRAY(values)->len, n-RARRAY(values)->len);
obj_call_init((VALUE)st);
return (VALUE)st;