1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_3@512 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
matz 1999-08-10 08:47:18 +00:00
parent 3f8dd52fe0
commit b0faee9b9c
4 changed files with 30 additions and 17 deletions

View file

@ -309,6 +309,7 @@ VALUE rb_f_untrace_var _((int, VALUE*));
VALUE rb_gvar_set2 _((const char*, VALUE));
VALUE rb_f_global_variables _((void));
void rb_alias_variable _((ID, ID));
void rb_clone_generic_ivar _((VALUE,VALUE));
void rb_mark_generic_ivar _((VALUE));
void rb_mark_generic_ivar_tbl _((void));
void rb_free_generic_ivar _((VALUE));

2
io.c
View file

@ -1772,7 +1772,7 @@ rb_io_clone(io)
char *mode;
NEWOBJ(obj, struct RFile);
OBJSETUP(obj, CLASS_OF(io), T_FILE);
CLONESETUP(obj, io);
GetOpenFile(io, orig);
MakeOpenFile(obj, fptr);

5
ruby.h
View file

@ -209,10 +209,11 @@ VALUE rb_newobj _((void));
RBASIC(obj)->flags = (t);\
if (rb_safe_level() >= 3) FL_SET(obj, FL_TAINT);\
}
#define CLONESETUP(clone,obj) {\
#define CLONESETUP(clone,obj) do {\
OBJSETUP(clone,rb_singleton_class_clone(RBASIC(obj)->klass),RBASIC(obj)->flags);\
rb_singleton_class_attached(RBASIC(clone)->klass, (VALUE)clone);\
}
if (FL_TEST(obj, FL_EXIVAR)) rb_clone_generic_ivar((VALUE)clone,(VALUE)obj);\
} while (0)
struct RBasic {
unsigned long flags;

View file

@ -717,11 +717,9 @@ generic_ivar_set(obj, id, val)
VALUE val;
{
st_table *tbl;
int special = Qfalse;
if (rb_special_const_p(obj)) {
special_generic_ivar = 1;
special = Qtrue;
}
if (!generic_iv_tbl) {
generic_iv_tbl = st_init_numtable();
@ -771,6 +769,18 @@ generic_ivar_remove(obj, id)
return val;
}
void
rb_mark_generic_ivar(obj)
VALUE obj;
{
st_table *tbl;
if (!generic_iv_tbl) return;
if (st_lookup(generic_iv_tbl, obj, &tbl)) {
rb_mark_tbl(tbl);
}
}
static int
givar_mark_i(key, value)
ID key;
@ -780,17 +790,6 @@ givar_mark_i(key, value)
return ST_CONTINUE;
}
void
rb_mark_generic_ivar(obj)
VALUE obj;
{
st_table *tbl;
if (st_lookup(generic_iv_tbl, obj, &tbl)) {
rb_mark_tbl(tbl);
}
}
static int
givar_i(obj, tbl)
VALUE obj;
@ -805,8 +804,8 @@ givar_i(obj, tbl)
void
rb_mark_generic_ivar_tbl()
{
if (special_generic_ivar == 0) return;
if (!generic_iv_tbl) return;
if (special_generic_ivar == 0) return;
st_foreach(generic_iv_tbl, givar_i, 0);
}
@ -820,6 +819,18 @@ rb_free_generic_ivar(obj)
st_free_table(tbl);
}
void
rb_clone_generic_ivar(clone, obj)
VALUE clone, obj;
{
st_table *tbl;
if (!generic_iv_tbl) return;
if (st_lookup(generic_iv_tbl, obj, &tbl)) {
st_add_direct(generic_iv_tbl, clone, st_copy(tbl));
}
}
VALUE
rb_ivar_get(obj, id)
VALUE obj;