mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
clone
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:
parent
3f8dd52fe0
commit
b0faee9b9c
4 changed files with 30 additions and 17 deletions
1
intern.h
1
intern.h
|
@ -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
2
io.c
|
@ -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
5
ruby.h
|
@ -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;
|
||||
|
|
39
variable.c
39
variable.c
|
@ -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;
|
||||
|
|
Loading…
Add table
Reference in a new issue