ruby-changes:2540
From: ko1@a...
Date: 27 Nov 2007 13:44:09 +0900
Subject: [ruby-changes:2540] ko1 - Ruby:r14031 (trunk): * compile.c, insns.def: change return value of "defined?"
ko1 2007-11-27 13:43:54 +0900 (Tue, 27 Nov 2007)
New Revision: 14031
Modified files:
trunk/ChangeLog
trunk/bootstraptest/test_syntax.rb
trunk/compile.c
trunk/insns.def
trunk/test/ruby/test_defined.rb
Log:
* compile.c, insns.def: change return value of "defined?"
for $&, $1, ... . If such variables are defined,
return "global-variable".
* test/ruby/test_defined.rb: add tests.
* bootstraptest/test_syntax.rb: fix a test.
http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/compile.c?r1=14031&r2=14030
http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ChangeLog?r1=14031&r2=14030
http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/bootstraptest/test_syntax.rb?r1=14031&r2=14030
http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/test/ruby/test_defined.rb?r1=14031&r2=14030
http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/insns.def?r1=14031&r2=14030
Index: insns.def
===================================================================
--- insns.def (revision 14030)
+++ insns.def (revision 14031)
@@ -795,8 +795,6 @@
{
VALUE klass;
char *expr_type = 0;
- char buf[0x10];
-
val = Qnil;
switch (type) {
@@ -868,12 +866,9 @@
break;
}
case DEFINED_REF:{
- int nth = FIX2INT(obj);
- VALUE backref = lfp_svar_get(th, GET_LFP(), 1);
-
- if (rb_reg_nth_match(nth, backref) != Qnil) {
- snprintf(buf, 0x10, "$%d", nth);
- expr_type = buf;
+ val = vm_getspecial(th, GET_LFP(), Qfalse, FIX2INT(obj));
+ if (val != Qnil) {
+ expr_type = "global-variable";
}
break;
}
Index: ChangeLog
===================================================================
--- ChangeLog (revision 14030)
+++ ChangeLog (revision 14031)
@@ -1,3 +1,13 @@
+Tue Nov 27 12:47:23 2007 Koichi Sasada <ko1@a...>
+
+ * compile.c, insns.def: change return value of "defined?"
+ for $&, $1, ... . If such variables are defined,
+ return "global-variable".
+
+ * test/ruby/test_defined.rb: add tests.
+
+ * bootstraptest/test_syntax.rb: fix a test.
+
Tue Nov 27 11:54:46 2007 Koichi Sasada <ko1@a...>
* insns.def: fix typo.
Index: bootstraptest/test_syntax.rb
===================================================================
--- bootstraptest/test_syntax.rb (revision 14030)
+++ bootstraptest/test_syntax.rb (revision 14031)
@@ -248,7 +248,7 @@
end
C.new.test + [defined?(C.new.m3)]
}
-assert_equal %q{[nil, nil, nil, nil, "$1", "$2", nil, nil]}, %q{
+assert_equal %q{[nil, nil, nil, nil, "global-variable", "global-variable", nil, nil]}, %q{
$ans = [defined?($1), defined?($2), defined?($3), defined?($4)]
/(a)(b)/ =~ 'ab'
$ans + [defined?($1), defined?($2), defined?($3), defined?($4)]
Index: compile.c
===================================================================
--- compile.c (revision 14030)
+++ compile.c (revision 14031)
@@ -2333,10 +2333,12 @@
needstr);
return 1;
+ case NODE_BACK_REF:
case NODE_NTH_REF:
ADD_INSN(ret, nd_line(node), putnil);
ADD_INSN3(ret, nd_line(node), defined, INT2FIX(DEFINED_REF),
- INT2FIX(node->nd_nth), needstr);
+ INT2FIX(node->nd_nth << 1 | type == NODE_BACK_REF),
+ needstr);
return 1;
case NODE_ZSUPER:
Index: test/ruby/test_defined.rb
===================================================================
--- test/ruby/test_defined.rb (revision 14030)
+++ test/ruby/test_defined.rb (revision 14031)
@@ -48,5 +48,34 @@
assert(defined_test) # not iterator
assert(!defined_test{}) # called as iterator
+
+ /a/ =~ ''
+ assert_equal nil, defined?($&)
+ assert_equal nil, defined?($`)
+ assert_equal nil, defined?($')
+ assert_equal nil, defined?($+)
+ assert_equal nil, defined?($1)
+ assert_equal nil, defined?($2)
+ /a/ =~ 'a'
+ assert_equal 'global-variable', defined?($&)
+ assert_equal 'global-variable', defined?($`)
+ assert_equal 'global-variable', defined?($')
+ assert_equal nil, defined?($+)
+ assert_equal nil, defined?($1)
+ assert_equal nil, defined?($2)
+ /(a)/ =~ 'a'
+ assert_equal 'global-variable', defined?($&)
+ assert_equal 'global-variable', defined?($`)
+ assert_equal 'global-variable', defined?($')
+ assert_equal 'global-variable', defined?($+)
+ assert_equal 'global-variable', defined?($1)
+ assert_equal nil, defined?($2)
+ /(a)b/ =~ 'ab'
+ assert_equal 'global-variable', defined?($&)
+ assert_equal 'global-variable', defined?($`)
+ assert_equal 'global-variable', defined?($')
+ assert_equal 'global-variable', defined?($+)
+ assert_equal 'global-variable', defined?($1)
+ assert_equal nil, defined?($2)
end
end
--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml