mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
2000-02-18
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@621 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
f0886df4a4
commit
3d6fde3365
14 changed files with 254 additions and 55 deletions
115
variable.c
115
variable.c
|
@ -1216,23 +1216,33 @@ rb_const_defined(klass, id)
|
|||
return rb_autoload_defined(id);
|
||||
}
|
||||
|
||||
static void
|
||||
rb_mod_av_set(klass, id, val, dest)
|
||||
VALUE klass;
|
||||
ID id;
|
||||
VALUE val;
|
||||
char *dest;
|
||||
{
|
||||
if (!OBJ_TAINTED(klass) && rb_safe_level() >= 4)
|
||||
rb_raise(rb_eSecurityError, "Insecure: can't set %s", dest);
|
||||
if (OBJ_FROZEN(klass)) rb_error_frozen("class/module");
|
||||
if (!RCLASS(klass)->iv_tbl) {
|
||||
RCLASS(klass)->iv_tbl = st_init_numtable();
|
||||
}
|
||||
else if (st_lookup(RCLASS(klass)->iv_tbl, id, 0)) {
|
||||
rb_warn("already initialized %s %s", dest, rb_id2name(id));
|
||||
}
|
||||
|
||||
st_insert(RCLASS(klass)->iv_tbl, id, val);
|
||||
}
|
||||
|
||||
void
|
||||
rb_const_set(klass, id, val)
|
||||
VALUE klass;
|
||||
ID id;
|
||||
VALUE val;
|
||||
{
|
||||
if (!OBJ_TAINTED(klass) && rb_safe_level() >= 4)
|
||||
rb_raise(rb_eSecurityError, "Insecure: can't set constant");
|
||||
if (OBJ_FROZEN(klass)) rb_error_frozen("class/module");
|
||||
if (!RCLASS(klass)->iv_tbl) {
|
||||
RCLASS(klass)->iv_tbl = st_init_numtable();
|
||||
}
|
||||
else if (st_lookup(RCLASS(klass)->iv_tbl, id, 0)) {
|
||||
rb_warn("already initialized constant %s", rb_id2name(id));
|
||||
}
|
||||
|
||||
st_insert(RCLASS(klass)->iv_tbl, id, val);
|
||||
rb_mod_av_set(klass, id, val, "constant");
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -1302,6 +1312,89 @@ rb_define_global_const(name, val)
|
|||
rb_define_const(rb_cObject, name, val);
|
||||
}
|
||||
|
||||
void
|
||||
rb_shared_variable_declare(klass, id, val)
|
||||
VALUE klass;
|
||||
ID id;
|
||||
VALUE val;
|
||||
{
|
||||
rb_mod_av_set(klass, id, val, "shared variable");
|
||||
}
|
||||
|
||||
void
|
||||
rb_shared_variable_set(klass, id, val)
|
||||
VALUE klass;
|
||||
ID id;
|
||||
VALUE val;
|
||||
{
|
||||
VALUE value;
|
||||
VALUE tmp;
|
||||
|
||||
tmp = klass;
|
||||
while (tmp) {
|
||||
if (RCLASS(tmp)->iv_tbl && st_lookup(RCLASS(tmp)->iv_tbl,id,0)) {
|
||||
st_insert(RCLASS(tmp)->iv_tbl,id,val);
|
||||
return;
|
||||
}
|
||||
tmp = RCLASS(tmp)->super;
|
||||
}
|
||||
|
||||
rb_raise(rb_eNameError,"uninitialized shared variable %s",rb_id2name(id));
|
||||
}
|
||||
|
||||
VALUE
|
||||
rb_shared_variable_get(klass, id)
|
||||
VALUE klass;
|
||||
ID id;
|
||||
{
|
||||
VALUE value;
|
||||
VALUE tmp;
|
||||
|
||||
tmp = klass;
|
||||
while (tmp) {
|
||||
if (RCLASS(tmp)->iv_tbl && st_lookup(RCLASS(tmp)->iv_tbl,id,&value)) {
|
||||
return value;
|
||||
}
|
||||
tmp = RCLASS(tmp)->super;
|
||||
}
|
||||
|
||||
rb_raise(rb_eNameError,"uninitialized shared variable %s",rb_id2name(id));
|
||||
return Qnil; /* not reached */
|
||||
}
|
||||
|
||||
int
|
||||
rb_shared_variable_defined(klass, id)
|
||||
VALUE klass;
|
||||
ID id;
|
||||
{
|
||||
VALUE value;
|
||||
VALUE tmp;
|
||||
|
||||
tmp = klass;
|
||||
while (tmp) {
|
||||
if (RCLASS(tmp)->iv_tbl && st_lookup(RCLASS(tmp)->iv_tbl,id,0)) {
|
||||
return Qtrue;
|
||||
}
|
||||
tmp = RCLASS(tmp)->super;
|
||||
}
|
||||
|
||||
return Qfalse;
|
||||
}
|
||||
|
||||
void
|
||||
rb_define_shared_variable(klass, name, val)
|
||||
VALUE klass;
|
||||
const char *name;
|
||||
VALUE val;
|
||||
{
|
||||
ID id = rb_intern(name);
|
||||
|
||||
if (!rb_is_shared_id(id)) {
|
||||
rb_raise(rb_eNameError, "wrong shared variable name %s", name);
|
||||
}
|
||||
rb_shared_variable_declare(klass, id, val);
|
||||
}
|
||||
|
||||
VALUE
|
||||
rb_iv_get(obj, name)
|
||||
VALUE obj;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue