yarv-diff:274
From: ko1 atdot.net
Date: 17 Feb 2006 17:51:30 -0000
Subject: [yarv-diff:274] r438 - in trunk: . yarvtest
Author: ko1
Date: 2006-02-18 02:51:30 +0900 (Sat, 18 Feb 2006)
New Revision: 438
Modified:
trunk/
trunk/ChangeLog
trunk/eval_proc.c
trunk/insns.def
trunk/test.rb
trunk/vm.c
trunk/vm_macro.def
trunk/yarvcore.c
trunk/yarvtest/test_class.rb
Log:
r664@lermite: ko1 | 2006-02-18 02:43:39 +0900
* insns.def, vm.c, vm_macro.def : change BMETHOD algorithm
([yarv-dev:914])
* yarvtest/test_class.rb : add a test for above
Property changes on: trunk
___________________________________________________________________
Name: svk:merge
- 81cd9672-7512-7e48-ae48-6936450e977d:/local/yarv/trunk:663
+ 81cd9672-7512-7e48-ae48-6936450e977d:/local/yarv/trunk:664
Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog 2006-02-17 17:51:07 UTC (rev 437)
+++ trunk/ChangeLog 2006-02-17 17:51:30 UTC (rev 438)
@@ -4,6 +4,14 @@
# from Mon, 03 May 2004 01:24:19 +0900
#
+2006-02-18(Sat) 02:40:18 +0900 Koichi Sasada <ko1 atdot.net>
+
+ * insns.def, vm.c, vm_macro.def : change BMETHOD algorithm
+ ([yarv-dev:914])
+
+ * yarvtest/test_class.rb : add a test for above
+
+
2006-02-17(Fri) 23:59:51 +0900 Koichi Sasada <ko1 atdot.net>
* vm.c, yarv.h : change th_invoke_proc() interface
Modified: trunk/eval_proc.c
===================================================================
--- trunk/eval_proc.c 2006-02-17 17:51:07 UTC (rev 437)
+++ trunk/eval_proc.c 2006-02-17 17:51:30 UTC (rev 438)
@@ -632,8 +632,6 @@
node = method->body;
}
else if (yarv_obj_is_proc(body)) {
- // struct BLOCK *block;
- // TODO: body = proc_clone(body);
yarv_proc_t *proc;
GetProcVal(body, proc);
if (BUILTIN_TYPE(proc->block.iseq) != T_NODE) {
Modified: trunk/insns.def
===================================================================
--- trunk/insns.def 2006-02-17 17:51:07 UTC (rev 437)
+++ trunk/insns.def 2006-02-17 17:51:30 UTC (rev 438)
@@ -1203,7 +1203,7 @@
flag = VM_CALL_FCALL_BIT;
recv = GET_SELF();
- while (ip && !ip->defined_method_id) {
+ while (ip && !ip->klass) {
ip = ip->parent_iseq;
}
@@ -1212,13 +1212,10 @@
}
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 */
+
+ if (ip != ip->local_iseq) {
+ /* defined by method_defined() */
yarv_control_frame_t *lcfp = GET_CFP();
- int i;
while (lcfp->iseq != ip) {
VALUE *tdfp = GET_PREV_DFP(lcfp->dfp);
@@ -1229,16 +1226,26 @@
}
}
}
- POPN(num);
- num = ip->argc;
- for (i = 0; i < ip->argc; i++) {
- PUSH(lcfp->dfp[i - ip->local_size]);
+
+ /* dirty hack */
+ id = (ID) ((VALUE *)(lcfp+1)->block_iseq)[0];
+ klass = ((VALUE *)(lcfp+1)->block_iseq)[1];
+
+ if (TOPN(num) == Qfalse) {
+ /* for ZSUPER */
+ int i;
+ POPN(num);
+ num = ip->argc;
+ for (i = 0; i < ip->argc; i++) {
+ PUSH(lcfp->dfp[i - ip->local_size]);
+ }
}
}
+ klass = eval_search_super_klass(ip->klass, recv);
+ flag = VM_CALL_SUPER_BIT | VM_CALL_FCALL_BIT;
+ blockptr = tmp_blockptr;
+ mn = rb_method_node(klass, id);
}
- flag = VM_CALL_SUPER_BIT | VM_CALL_FCALL_BIT;
- blockptr = tmp_blockptr;
- mn = rb_method_node(klass, id);
}
LABEL_IS_SC(start_method_dispatch):
#endif
@@ -1287,10 +1294,9 @@
yarv_iseq_t *iseq;
int argc = num;
- if (block == 0) {
+ if (GET_ISEQ()->local_iseq->type != ISEQ_TYPE_METHOD || block == 0) {
th_localjump_error("no block given (yield)", Qnil, 0);
}
-
iseq = block->iseq;
if (BUILTIN_TYPE(iseq) != T_NODE) {
Modified: trunk/test.rb
===================================================================
--- trunk/test.rb 2006-02-17 17:51:07 UTC (rev 437)
+++ trunk/test.rb 2006-02-17 17:51:30 UTC (rev 438)
@@ -1,17 +1,4 @@
-__END__
-
-Object.instance_eval do
- define_method(:hoge) do
- p self
- p caller(0)
- break :ok
- end
-end
-
-p hoge()
-__END__
-
class A
def hoge
:hoge
Modified: trunk/vm.c
===================================================================
--- trunk/vm.c 2006-02-17 17:51:07 UTC (rev 437)
+++ trunk/vm.c 2006-02-17 17:51:30 UTC (rev 438)
@@ -376,6 +376,24 @@
return procval;
}
+static inline VALUE
+th_invoke_bmethod(yarv_thread_t *th, ID id, VALUE procval, VALUE recv,
+ VALUE klass, int argc, VALUE *argv)
+{
+ yarv_control_frame_t *cfp = th->cfp;
+ yarv_proc_t *proc;
+ VALUE val;
+ VALUE values[2] = {
+ id, RCLASS(klass)->super,
+ };
+
+ /* dirty hack */
+ (cfp-1)->block_iseq = (void *)values;
+ GetProcVal(procval, proc);
+ val = th_invoke_proc(th, proc, recv, argc, argv);
+ return val;
+}
+
VALUE
th_call0(yarv_thread_t *th, VALUE klass, VALUE recv,
VALUE id, ID oid, int argc, const VALUE *argv,
@@ -436,18 +454,8 @@
break;
}
case NODE_BMETHOD:{
- yarv_control_frame_t *reg_cfp;
- int i;
-
- th_set_finish_env(th);
-
- reg_cfp = th->cfp;
-
- for (i = 0; i < argc; i++) {
- *reg_cfp->sp++ = argv[i];
- }
- macro_eval_invoke_bmethod(body->nd_cval, recv, klass,
- blockptr, argc);
+ val = th_invoke_bmethod(th, id, body->nd_cval,
+ recv, klass, argc, (VALUE *)argv);
break;
}
default:
Modified: trunk/vm_macro.def
===================================================================
--- trunk/vm_macro.def 2006-02-17 17:51:07 UTC (rev 437)
+++ trunk/vm_macro.def 2006-02-17 17:51:30 UTC (rev 438)
@@ -215,44 +215,6 @@
}
}
-MACRO macro_eval_invoke_bmethod(procval, recv, klass, blockptr, num)
-{
- if (0) {
- VALUE *sp = GET_SP();
- VALUE *rsp = sp - num - 1;
- yarv_proc_t *proc;
- GetProcVal(procval, proc);
-
- if (BUILTIN_TYPE(proc->block.iseq) == T_NODE) {
- val =
- th_invoke_yield_cfunc(th, &proc->block, proc->block.self,
- num, STACK_ADDR_FROM_TOP(num));
- }
- else {
- if (proc->block.iseq->argc != num) {
- rb_raise(rb_eArgError, "wrong number of arguments (%lu for %d)",
- (unsigned long)num, proc->block.iseq->argc);
- }
- push_frame(th, proc->block.iseq, FRAME_MAGIC_PROC,
- recv, (VALUE) proc->block.dfp,
- proc->block.iseq->iseq_encoded, th->cfp->sp,
- proc->block.lfp, proc->block.iseq->local_size - num);
- reg_cfp->sp = rsp;
- RESTORE_REGS();
- }
- }
- else {
- VALUE *argv = GET_SP() - num;
- yarv_proc_t *proc;
-
- GetProcVal(procval, proc);
- val = th_invoke_proc(th, proc, recv, num, argv);
- reg_cfp->sp = argv;
- reg_cfp->sp[-1] = val;
- RESTORE_REGS();
- }
-}
-
MACRO macro_eval_invoke_method(recv, klass, id, num, mn, blockptr)
{
/* method missing */
@@ -321,9 +283,10 @@
break;
}
case NODE_BMETHOD:{
- macro_eval_invoke_bmethod(node->nd_cval, recv, klass, blockptr,
- num);
- NEXT_INSN();
+ VALUE *argv = GET_SP() - num;
+ val = th_invoke_bmethod(th, id, node->nd_cval,
+ recv, klass, num, argv);
+ INC_SP(-num-1);
break;
}
case NODE_ZSUPER:{
Modified: trunk/yarvcore.c
===================================================================
--- trunk/yarvcore.c 2006-02-17 17:51:07 UTC (rev 437)
+++ trunk/yarvcore.c 2006-02-17 17:51:30 UTC (rev 438)
@@ -375,8 +375,8 @@
if (iseq->iseq != iseq->iseq_encoded) {
FREE_UNLESS_NULL(iseq->iseq_encoded);
}
+
FREE_UNLESS_NULL(iseq->iseq);
-
FREE_UNLESS_NULL(iseq->insn_info_tbl);
FREE_UNLESS_NULL(iseq->local_tbl);
FREE_UNLESS_NULL(iseq->catch_table);
Modified: trunk/yarvtest/test_class.rb
===================================================================
--- trunk/yarvtest/test_class.rb 2006-02-17 17:51:07 UTC (rev 437)
+++ trunk/yarvtest/test_class.rb 2006-02-17 17:51:30 UTC (rev 438)
@@ -320,6 +320,29 @@
b.m_a
$ans
}
+ ae %q{
+ class A
+ def hoge
+ :hoge
+ end
+ def foo
+ :foo
+ end
+ end
+ class B < A
+ def memoize(name)
+ B.instance_eval do
+ define_method(name) do
+ [name, super]
+ end
+ end
+ end
+ end
+ b = B.new
+ b.memoize(:hoge)
+ b.memoize(:foo)
+ [b.foo, b.hoge]
+ }
end
def test_zsuper
--
ML: yarv-diff quickml.atdot.net
Info: http://www.atdot.net/~ko1/quickml