yarv-diff:260
From: ko1 atdot.net
Date: 15 Feb 2006 11:07:00 -0000
Subject: [yarv-diff:260] r423 - trunk
Author: ko1
Date: 2006-02-15 20:06:59 +0900 (Wed, 15 Feb 2006)
New Revision: 423
Modified:
trunk/
trunk/ChangeLog
trunk/compile.c
trunk/insns.def
trunk/test.rb
trunk/vm.c
trunk/yarvcore.c
Log:
r635@lermite: ko1 | 2006-02-15 19:50:29 +0900
* insns.def, compile.c, vm.c : remove methoddef, singletonmethoddef
instructions and make new insn definemethod
* yarvcore.c : set toplevel visibility to private
Property changes on: trunk
___________________________________________________________________
Name: svk:merge
- 81cd9672-7512-7e48-ae48-6936450e977d:/local/yarv/trunk:633
+ 81cd9672-7512-7e48-ae48-6936450e977d:/local/yarv/trunk:635
Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog 2006-02-15 10:51:10 UTC (rev 422)
+++ trunk/ChangeLog 2006-02-15 11:06:59 UTC (rev 423)
@@ -9,6 +9,14 @@
* test/rss: imported from Ruby CVS trunk HEAD.
+2006-02-15(Wed) 19:47:51 +0900 Koichi Sasada <ko1 atdot.net>
+
+ * insns.def, compile.c, vm.c : remove methoddef, singletonmethoddef
+ instructions and make new insn definemethod
+
+ * yarvcore.c : set toplevel visibility to private
+
+
2006-02-15(Wed) 17:39:16 +0900 Koichi Sasada <ko1 atdot.net>
* eval_intern.h :
Modified: trunk/compile.c
===================================================================
--- trunk/compile.c 2006-02-15 10:51:10 UTC (rev 422)
+++ trunk/compile.c 2006-02-15 11:06:59 UTC (rev 423)
@@ -4024,8 +4024,9 @@
debugp_param("defn/iseq", iseqval);
- ADD_INSN2(ret, nd_line(node), methoddef, ID2SYM(node->nd_mid),
- iseqval);
+ ADD_INSN (ret, nd_line(node), putnil);
+ ADD_INSN3(ret, nd_line(node), definemethod,
+ ID2SYM(node->nd_mid), iseqval, INT2FIX(0));
if (!poped) {
ADD_INSN(ret, nd_line(node), putnil);
}
@@ -4040,8 +4041,8 @@
debugp_param("defs/iseq", iseqval);
COMPILE(ret, "defs: recv", node->nd_recv);
- ADD_INSN2(ret, nd_line(node), singletonmethoddef,
- ID2SYM(node->nd_mid), iseqval);
+ ADD_INSN3(ret, nd_line(node), definemethod,
+ ID2SYM(node->nd_mid), iseqval, INT2FIX(1));
if (!poped) {
ADD_INSN(ret, nd_line(node), putnil);
}
Modified: trunk/insns.def
===================================================================
--- trunk/insns.def 2006-02-15 10:51:10 UTC (rev 422)
+++ trunk/insns.def 2006-02-15 11:06:59 UTC (rev 423)
@@ -794,101 +794,20 @@
/**
@c setting
- @e define method id as body
- @j \bh m body `B
+ @e define (singleton) method id as body
+ @j ij\bh m body `B
*/
DEFINE_INSN
-methoddef
-(ID id, VALUE body)
-()
-()
-{
- NODE *newbody;
- yarv_iseq_t *miseq;
- NODE *cref = get_cref(GET_ISEQ(), GET_LFP());
- int noex = cref->nd_visi;
- VALUE klass = cref->nd_clss;
-
- /* dup */
- GetISeqVal(body, miseq);
-
- COPY_CREF(miseq->cref_stack, cref);
- miseq->klass = th_get_cbase(th);
- miseq->defined_method_id = rb_to_id(miseq->name);
-
- /* make new node */
- newbody = NEW_NODE(YARV_METHOD_NODE, NOEX_PUBLIC, body, 0);
- // printf("define: %s: %s\n", rb_id2name(id), node_name(nd_type(newbody)));
-
- //debugp_(-1, "self", GET_SELF());
- //printf("%s\n", body_name(nd_type(newbody)));
- //fflush(stdout);
-
- if (GET_ISEQ()->type == ISEQ_TYPE_METHOD) {
- noex = NOEX_PUBLIC;
- klass = CLASS_OF(GET_SELF());
- }
- else {
- klass = cref->nd_clss;
- }
-
- rb_add_method(klass, id, newbody, noex);
-
- if (noex == NOEX_MODFUNC) {
- rb_add_method(rb_singleton_class(klass), id, newbody, NOEX_PUBLIC);
- }
-
- INC_VM_STATE_VERSION();
-}
-
-/**
- @c setting
- @e define singleton method id as body to obj.
- @j \bh m body obj `B
- */
-DEFINE_INSN
-singletonmethoddef
-(ID id, VALUE body)
+definemethod
+(ID id, VALUE body, num_t is_singleton)
(VALUE obj)
()
{
- VALUE klass;
- NODE *newbody;
- yarv_iseq_t *siseq;
- int noex = NOEX_PUBLIC;
-
- if (FIXNUM_P(obj) || SYMBOL_P(obj)) {
- rb_raise(rb_eTypeError,
- "can't define singleton method \"%s\" for %s",
- rb_id2name(id), rb_obj_classname(obj));
- }
-
- if (OBJ_FROZEN(obj)) {
- rb_error_frozen("object");
- }
-
- klass = rb_singleton_class(obj);
- if (st_lookup(RCLASS(klass)->m_tbl, id, (void *)&newbody)) {
- if (ruby_safe_level >= 4) {
- rb_raise(rb_eSecurityError, "redefining method prohibited");
- }
- if (RTEST(ruby_verbose)) {
- rb_warning("redefine %s", rb_id2name(id));
- }
- }
-
- GetISeqVal(body, siseq);
- COPY_CREF(siseq->cref_stack, get_cref(GET_ISEQ(), GET_LFP()));
- siseq->klass = CLASS_OF(obj);
- siseq->defined_method_id = id;
-
- newbody = NEW_NODE(YARV_METHOD_NODE, NOEX_PUBLIC, body, 0);
-
- rb_add_method(klass, id, newbody, noex);
-
- INC_VM_STATE_VERSION();
+ eval_define_method(th, obj, id, body, is_singleton,
+ get_cref(GET_ISEQ(), GET_LFP()));
}
+
/**
@c setting
@e make alias (if v_p is Qtrue, make valias)
Modified: trunk/test.rb
===================================================================
--- trunk/test.rb 2006-02-15 10:51:10 UTC (rev 422)
+++ trunk/test.rb 2006-02-15 11:06:59 UTC (rev 423)
@@ -1,13 +1,38 @@
+class C
+ def m
+ end
+ alias mm m
+ private :mm
+end
-def m
- Thread.new{
- eval("return")
- }
+p C.new.m # private method `m' called for #<C:0x00002a95eae8c0> (NoMethodError)
+
+__END__
+
+class C
+ def m
+ 1.times{
+ def m1
+ end
+ }
+ end
end
-m.join
+C.new.m
+C.new.m1
+
__END__
+fork do
+ break
+end
+__END__
+Thread.new{
+ eval("return")
+}.join
+
+__END__
+
Thread.new{}.kill
__END__
Thread.new{}
Modified: trunk/vm.c
===================================================================
--- trunk/vm.c 2006-02-15 10:51:10 UTC (rev 422)
+++ trunk/vm.c 2006-02-15 11:06:59 UTC (rev 423)
@@ -864,6 +864,16 @@
return lfp_set_special_cref(lfp, cref_stack);
}
+void
+debug_cref(NODE *cref)
+{
+ while (cref) {
+ dp(cref->nd_clss);
+ printf("%d\n", cref->nd_visi);
+ cref = cref->nd_next;
+ }
+}
+
static NODE *
get_cref(yarv_iseq_t *iseq, VALUE *lfp)
{
@@ -1012,6 +1022,52 @@
return klass;
}
+EVALBODY_HELPER_FUNCTION void
+eval_define_method(yarv_thread_t *th, VALUE obj,
+ ID id, VALUE body, num_t is_singleton, NODE *cref)
+{
+ NODE *newbody;
+ yarv_iseq_t *miseq;
+ int noex = cref->nd_visi;
+ VALUE klass = cref->nd_clss;
+ GetISeqVal(body, miseq);
+
+ if (is_singleton) {
+ if (FIXNUM_P(obj) || SYMBOL_P(obj)) {
+ rb_raise(rb_eTypeError,
+ "can't define singleton method \"%s\" for %s",
+ rb_id2name(id), rb_obj_classname(obj));
+ }
+ if (OBJ_FROZEN(obj)) {
+ rb_error_frozen("object");
+ }
+
+ klass = rb_singleton_class(obj);
+ noex = NOEX_PUBLIC;
+
+ if (st_lookup(RCLASS(klass)->m_tbl, id, (void *)&newbody)) {
+ if (ruby_safe_level >= 4) {
+ rb_raise(rb_eSecurityError, "redefining method prohibited");
+ }
+ if (RTEST(ruby_verbose)) {
+ rb_warning("redefine %s", rb_id2name(id));
+ }
+ }
+ }
+
+ /* dup */
+ COPY_CREF(miseq->cref_stack, cref);
+ miseq->klass = klass;
+ miseq->defined_method_id = id;
+ newbody = NEW_NODE(YARV_METHOD_NODE, 0, body, 0);
+ rb_add_method(klass, id, newbody, noex);
+
+ if (!is_singleton && noex == NOEX_MODFUNC) {
+ rb_add_method(rb_singleton_class(klass), id, newbody, NOEX_PUBLIC);
+ }
+ INC_VM_STATE_VERSION();
+}
+
EVALBODY_HELPER_FUNCTION VALUE
eval_search_super_klass(VALUE klass, VALUE recv)
{
Modified: trunk/yarvcore.c
===================================================================
--- trunk/yarvcore.c 2006-02-15 10:51:10 UTC (rev 422)
+++ trunk/yarvcore.c 2006-02-15 11:06:59 UTC (rev 423)
@@ -445,10 +445,12 @@
/* set class nest stack */
if (type == ISEQ_TYPE_TOP) {
+ /* toplevel is private */
iseq->cref_stack = NEW_BLOCK(rb_cObject);
+ iseq->cref_stack->nd_visi = NOEX_PRIVATE;
}
else if (type == ISEQ_TYPE_METHOD || type == ISEQ_TYPE_CLASS) {
- iseq->cref_stack = NEW_BLOCK(0);
+ iseq->cref_stack = NEW_BLOCK(0); /* place holder */
}
else if (parent) {
yarv_iseq_t *piseq;
--
ML: yarv-diff quickml.atdot.net
Info: http://www.atdot.net/~ko1/quickml