summaryrefslogtreecommitdiff
path: root/variable.c
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2003-06-20 07:11:44 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2003-06-20 07:11:44 +0000
commitf289fddace1c84075e6794e24a3d46aee6b35d69 (patch)
treed84ee3ea9c21646d38e396bb875c4bcc591a81f4 /variable.c
parent65ba3eba645a61ae9995f9f1e88cab6150c858a7 (diff)
* parse.y (new_yield): distinguish "yield 1,2" and "yield [1,2]".
[ruby-dev:20360] * eval.c (rb_eval): support new_yield() change. * variable.c (rb_const_get_0): warn for Foo::BAR when BAR is a toplevel constant (i.e. a constant defined under Object). [ruby-list:36935] * parse.y (no_blockarg): separate no block argument check and ret_args argument processing. * range.c (rb_range_beg_len): out_of_range check after adjusting end point. [ruby-dev:20370] * parse.y (call_args): the first argument to arg_cancat() should be NODE_LIST. [ruby-core:01151] * eval.c (rb_eval): should dispatch based on ID type. * eval.c (rb_yield_0): should restore scope_vmode during yield. [ruby-dev:20361] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3967 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'variable.c')
-rw-r--r--variable.c46
1 files changed, 44 insertions, 2 deletions
diff --git a/variable.c b/variable.c
index f0ace3afb1..5c65c0425b 100644
--- a/variable.c
+++ b/variable.c
@@ -1284,10 +1284,11 @@ rb_const_get_at(klass, id)
return Qnil; /* not reached */
}
-VALUE
-rb_const_get(klass, id)
+static VALUE
+rb_const_get_0(klass, id, exclude)
VALUE klass;
ID id;
+ int exclude;
{
VALUE value, tmp;
int mod_retry = 0;
@@ -1295,6 +1296,10 @@ rb_const_get(klass, id)
tmp = klass;
retry:
while (tmp) {
+ if (exclude && tmp == rb_cObject && klass != rb_cObject) {
+ rb_warn("toplevel constant %s referenced by %s::%s",
+ rb_id2name(id), rb_class2name(klass), rb_id2name(id));
+ }
while (RCLASS(tmp)->iv_tbl && st_lookup(RCLASS(tmp)->iv_tbl,id,&value)) {
if (value == Qundef) {
rb_autoload_load(tmp, id);
@@ -1316,6 +1321,22 @@ rb_const_get(klass, id)
}
VALUE
+rb_const_get_from(klass, id)
+ VALUE klass;
+ ID id;
+{
+ return rb_const_get_0(klass, id, Qtrue);
+}
+
+VALUE
+rb_const_get(klass, id)
+ VALUE klass;
+ ID id;
+{
+ return rb_const_get_0(klass, id, Qfalse);
+}
+
+VALUE
rb_mod_remove_const(mod, name)
VALUE mod, name;
{
@@ -1440,6 +1461,27 @@ rb_const_defined_at(klass, id)
}
int
+rb_const_defined_from(klass, id)
+ VALUE klass;
+ ID id;
+{
+ VALUE tmp = klass, value;
+
+ while (tmp) {
+ if (tmp == rb_cObject && klass != rb_cObject) {
+ break;
+ }
+ if (RCLASS(tmp)->iv_tbl && st_lookup(RCLASS(tmp)->iv_tbl, id, &value)) {
+ if (value == Qundef && NIL_P(autoload_file(klass, id)))
+ return Qfalse;
+ return Qtrue;
+ }
+ tmp = RCLASS(tmp)->super;
+ }
+ return Qfalse;
+}
+
+int
rb_const_defined(klass, id)
VALUE klass;
ID id;