yarv-diff:235
From: ko1 atdot.net
Date: 13 Feb 2006 14:09:40 -0000
Subject: [yarv-diff:235] r396 - in trunk: . yarvtest
Author: ko1
Date: 2006-02-13 23:09:39 +0900 (Mon, 13 Feb 2006)
New Revision: 396
Modified:
trunk/
trunk/ChangeLog
trunk/insns.def
trunk/signal.c
trunk/test.rb
trunk/yarvcore.c
trunk/yarvtest/test_class.rb
Log:
r585@leremita: ko1 | 2006-02-13 23:09:19 +0900
* insns.def : traverse all iseq to find super method ([yarv-dev:859])
* yarvtest/test_class.rb : add a test for above
* yarvcore.c : add clear iseq->defined_method_id
* signal.c : fix to prohibit double segv handler kicked
Property changes on: trunk
___________________________________________________________________
Name: svk:merge
- 81cd9672-7512-7e48-ae48-6936450e977d:/local/yarv/trunk:583
+ 81cd9672-7512-7e48-ae48-6936450e977d:/local/yarv/trunk:585
Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog 2006-02-13 13:10:40 UTC (rev 395)
+++ trunk/ChangeLog 2006-02-13 14:09:39 UTC (rev 396)
@@ -4,6 +4,17 @@
# from Mon, 03 May 2004 01:24:19 +0900
#
+2006-02-13(Mon) 22:49:42 +0900 Koichi Sasada <ko1 atdot.net>
+
+ * insns.def : traverse all iseq to find super method ([yarv-dev:859])
+
+ * yarvtest/test_class.rb : add a test for above
+
+ * yarvcore.c : add clear iseq->defined_method_id
+
+ * signal.c : fix to prohibit double segv handler kicked
+
+
2006-02-13(Mon) 22:09:12 +0900 Koichi Sasada <ko1 atdot.net>
* compile.c : support NODE_DECL, NODE_CLASS with NODE_CLON3 prefix
Modified: trunk/insns.def
===================================================================
--- trunk/insns.def 2006-02-13 13:10:40 UTC (rev 395)
+++ trunk/insns.def 2006-02-13 14:09:39 UTC (rev 396)
@@ -818,6 +818,7 @@
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);
@@ -883,6 +884,7 @@
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);
@@ -1254,12 +1256,12 @@
#if !YARV_AOT_COMPILED
if (0) {
if (0) {
- LABEL_IS_SC(start_init_in_send_for_opt_1):
+ LABEL_IS_SC(start_init_in_send_for_opt_1):
num = 1;
recv = TOPN(1);
}
else if (0) {
- LABEL_IS_SC(start_init_in_send_for_opt_2):
+ LABEL_IS_SC(start_init_in_send_for_opt_2):
num = 2;
recv = TOPN(2);
}
@@ -1269,52 +1271,49 @@
mn = rb_method_node(klass, id);
}
if (0) {
- LABEL_IS_SC(start_init_in_super):
+ LABEL_IS_SC(start_init_in_super):
{
yarv_iseq_t *iseq = GET_ISEQ();
- yarv_iseq_t *ip = iseq->local_iseq;
+ yarv_iseq_t *ip = iseq;
num = tmp_num;
flag = VM_CALL_FCALL_BIT;
recv = GET_SELF();
- if (ip->klass == 0) {
- ip = iseq;
- /* super in define_method */
- while (!ip->defined_method_id) {
- ip = ip->parent_iseq;
- }
- id = ip->defined_method_id;
- klass = eval_search_super_klass(ip->klass, recv);
- if (TOPN(num) == Qfalse) {
- yarv_control_frame_t *lcfp = GET_CFP();
- int i;
+ while (ip && !ip->defined_method_id) {
+ ip = ip->parent_iseq;
+ }
+ if (ip == 0) {
+ rb_raise(rb_eNoMethodError, "super called outside of method");
+ }
- while (lcfp->iseq != ip) {
- VALUE *tdfp = GET_PREV_DFP(lcfp->dfp);
- while (1) {
- lcfp = YARV_PREVIOUS_CONTROL_FRAME(lcfp);
- if (lcfp->dfp == tdfp) {
- break;
- }
+ id = ip->defined_method_id;
+ klass = eval_search_super_klass(ip->klass, recv);
+
+ if (ip != ip->local_iseq /* defined by method_defined() */ &&
+ TOPN(num) == Qfalse) {
+ /* for ZSUPER */
+ yarv_control_frame_t *lcfp = GET_CFP();
+ int i;
+
+ while (lcfp->iseq != ip) {
+ VALUE *tdfp = GET_PREV_DFP(lcfp->dfp);
+ while (1) {
+ lcfp = YARV_PREVIOUS_CONTROL_FRAME(lcfp);
+ if (lcfp->dfp == tdfp) {
+ break;
}
}
-
- POPN(num);
- num = ip->argc;
- for (i = 0; i < ip->argc; i++) {
- PUSH(lcfp->dfp[i - ip->local_size]);
- }
}
+ POPN(num);
+ num = ip->argc;
+ for (i = 0; i < ip->argc; i++) {
+ PUSH(lcfp->dfp[i - ip->local_size]);
+ }
}
- else {
- id = rb_to_id(ip->name);
- klass = eval_search_super_klass(ip->klass, recv);
- }
-
- blockptr = tmp_blockptr;
- mn = rb_method_node(klass, id);
}
+ blockptr = tmp_blockptr;
+ mn = rb_method_node(klass, id);
}
#endif
#endif
Modified: trunk/signal.c
===================================================================
--- trunk/signal.c 2006-02-13 13:10:40 UTC (rev 395)
+++ trunk/signal.c 2006-02-13 14:09:39 UTC (rev 396)
@@ -448,6 +448,7 @@
#endif
#ifdef SIGSEGV
+static int segv_received = 0;
static RETSIGTYPE
sigsegv(int sig)
{
@@ -457,8 +458,13 @@
return;
}
#endif
-
- rb_bug("Segmentation fault");
+ if (segv_received) {
+ fprintf(stderr, "SEGV recieved in SEGV handler\n");
+ }
+ else {
+ segv_received = 1;
+ rb_bug("Segmentation fault");
+ }
}
#endif
Modified: trunk/test.rb
===================================================================
--- trunk/test.rb 2006-02-13 13:10:40 UTC (rev 395)
+++ trunk/test.rb 2006-02-13 14:09:39 UTC (rev 396)
@@ -1,9 +1,25 @@
+super
__END__
+class C
+ def m a, b
+ p [a, b]
+ end
+end
+class D < C
+ def m a
+ super
+ end
+end
+D.new.m 1, 2
+
__END__
+__END__
+
+
def m
proc{
break :ok
Modified: trunk/yarvcore.c
===================================================================
--- trunk/yarvcore.c 2006-02-13 13:10:40 UTC (rev 395)
+++ trunk/yarvcore.c 2006-02-13 14:09:39 UTC (rev 396)
@@ -429,6 +429,7 @@
VALUE parent, VALUE type, VALUE opt)
{
iseq->name = name;
+ iseq->defined_method_id = 0;
iseq->file_name = file_name;
iseq->iseq_mark_ary = rb_ary_new();
iseq->catch_table_ary = rb_ary_new();
Modified: trunk/yarvtest/test_class.rb
===================================================================
--- trunk/yarvtest/test_class.rb 2006-02-13 13:10:40 UTC (rev 395)
+++ trunk/yarvtest/test_class.rb 2006-02-13 14:09:39 UTC (rev 396)
@@ -294,6 +294,32 @@
end
C.new.b.m(:ok1, :ok2)
} if false # ruby 1.9 dumped core
+ ae %q{ # [yarv-dev:859]
+ $ans = []
+ class A
+ def m_a
+ $ans << "m_a"
+ end
+ def def_m_a
+ $ans << "def_m_a"
+ end
+ end
+ class B < A
+ def def_m_a
+ B.class_eval{
+ super
+ define_method(:m_a) do
+ super
+ end
+ }
+ super
+ end
+ end
+ b = B.new
+ b.def_m_a
+ b.m_a
+ $ans
+ }
end
def test_zsuper
--
ML: yarv-diff quickml.atdot.net
Info: http://www.atdot.net/~ko1/quickml