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:
parent
d453b1a042
commit
a1a693e138
16 changed files with 490 additions and 324 deletions
22
ChangeLog
22
ChangeLog
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
|
|
6
array.c
6
array.c
|
@ -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
12
dir.c
|
@ -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
47
eval.c
|
@ -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)) {
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
110
ext/gtk/gtk.c
110
ext/gtk/gtk.c
|
@ -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);
|
||||
|
|
|
@ -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
1
file.c
|
@ -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
68
io.c
|
@ -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);
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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 ()
|
||||
|
|
|
@ -675,8 +675,6 @@ if defined? Process.kill
|
|||
x = $!
|
||||
end
|
||||
ok(x && x =~ /Interrupt/)
|
||||
else
|
||||
ok(false)
|
||||
end
|
||||
|
||||
check "eval"
|
||||
|
|
16
struct.c
16
struct.c
|
@ -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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue