yarv-diff:174
From: ko1 atdot.net
Date: 28 Dec 2005 01:55:07 -0000
Subject: [yarv-diff:174] r333 - in trunk: . rb template yarvtest
Author: ko1
Date: 2005-12-28 10:55:06 +0900 (Wed, 28 Dec 2005)
New Revision: 333
Modified:
trunk/ChangeLog
trunk/compile.c
trunk/compile.h
trunk/disasm.c
trunk/eval.c
trunk/eval_error.h
trunk/eval_jump.h
trunk/eval_method.h
trunk/insns.def
trunk/rb/allload.rb
trunk/rb/insns2vm.rb
trunk/template/insns.inc.tmpl
trunk/template/insns_info.inc.tmpl
trunk/template/minsns.inc.tmpl
trunk/template/opt_sc.inc.tmpl
trunk/template/optinsn.inc.tmpl
trunk/template/optunifs.inc.tmpl
trunk/template/vmtc.inc.tmpl
trunk/test.rb
trunk/variable.c
trunk/vm.c
trunk/vm_evalbody.h
trunk/vm_macro.def
trunk/yarvcore.c
trunk/yarvcore.h
trunk/yarvtest/test_class.rb
trunk/yarvtest/test_method.rb
Log:
* compile.c, compile.h : refactoring (remove self passing, etc)
* disasm.c : support showing ID of method/dynamic local variables
* rb/allload.rb : add verbose version (it's enable by $DEBUG)
* template/insns.inc.tmpl, template/insns_info.inc.tmpl,
template/minsns.inc.tmpl, template/opt_sc.inc.tmpl,
template/optinsn.inc.tmpl, template/optunifs.inc.tmpl,
template/vmtc.inc.tmpl : fix a comment
* variable.c (mod_av_set) : fix to clear inline cache ([yarv-dev:720])
* eval_method.h : fix to clear inline method cache
* vm.c, rb/insns2vm.rb, template/insns_info.inc.tmpl, compile.c,
insns.def, vm_evalbody.h, vm_macro.def :
fix operands types (ulong -> num_t, ...)
* vm_macro.def : fix to check SPECIAL_CONST_P() at splat array
([yarv-dev:722])
* yarvcore.c : fix to throw syntax error
* yarvcore.h, eval.c, eval_error.h, eval_jump.h :
add yarv_vm_t#exit_code to fix problem at cleanup ([yarv-dev:723])
* insns.def : fix to invoke zsuper in method defined by define_method
([yarv-dev:704])
* yarvtest/test_class.rb : add tests for above
* yarvtest/test_method.rb : fix comments
Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog 2005-12-26 17:08:23 UTC (rev 332)
+++ trunk/ChangeLog 2005-12-28 01:55:06 UTC (rev 333)
@@ -4,6 +4,43 @@
# from Mon, 03 May 2004 01:24:19 +0900
#
+2005-12-28(Wed) 10:36:45 +0900 Koichi Sasada <ko1 atdot.net>
+
+ * compile.c, compile.h : refactoring (remove self passing, etc)
+
+ * disasm.c : support showing ID of method/dynamic local variables
+
+ * rb/allload.rb : add verbose version (it's enable by $DEBUG)
+
+ * template/insns.inc.tmpl, template/insns_info.inc.tmpl,
+ template/minsns.inc.tmpl, template/opt_sc.inc.tmpl,
+ template/optinsn.inc.tmpl, template/optunifs.inc.tmpl,
+ template/vmtc.inc.tmpl : fix a comment
+
+ * variable.c (mod_av_set) : fix to clear inline cache ([yarv-dev:720])
+
+ * eval_method.h : fix to clear inline method cache
+
+ * vm.c, rb/insns2vm.rb, template/insns_info.inc.tmpl, compile.c,
+ insns.def, vm_evalbody.h, vm_macro.def :
+ fix operands types (ulong -> num_t, ...)
+
+ * vm_macro.def : fix to check SPECIAL_CONST_P() at splat array
+ ([yarv-dev:722])
+
+ * yarvcore.c : fix to throw syntax error
+
+ * yarvcore.h, eval.c, eval_error.h, eval_jump.h :
+ add yarv_vm_t#exit_code to fix problem at cleanup ([yarv-dev:723])
+
+ * insns.def : fix to invoke zsuper in method defined by define_method
+ ([yarv-dev:704])
+
+ * yarvtest/test_class.rb : add tests for above
+
+ * yarvtest/test_method.rb : fix comments
+
+
2005-12-27(Tue) 01:52:07 +0900 Koichi Sasada <ko1 atdot.net>
* array.c, intern.h, insns.def : expose rb_ary_replace and use it
Modified: trunk/compile.c
===================================================================
--- trunk/compile.c 2005-12-26 17:08:23 UTC (rev 332)
+++ trunk/compile.c 2005-12-28 01:55:06 UTC (rev 333)
@@ -13,6 +13,7 @@
#include "yarvcore.h"
#include "compile.h"
#include "insns.inc"
+#include "insns_info.inc"
#ifdef HAVE_STDARG_PROTOTYPES
@@ -79,8 +80,8 @@
static void debug_list(LINK_ANCHOR *anchor);
#endif
-void dump_disasm_anchor(LINK_ANCHOR *anc);
-void dump_disasm_list(LINK_ELEMENT* elem);
+static void dump_disasm_anchor(LINK_ANCHOR *anc);
+static void dump_disasm_list(LINK_ELEMENT* elem);
static int insn_data_length(INSN *insnobj);
static int insn_data_line_no(INSN *insnobj);
@@ -93,8 +94,8 @@
int insn_id, int argc, ...);
static LABEL *new_label_body(yarv_iseq_t *iseq, int line);
-static int iseq_compile_each(VALUE self, LINK_ANCHOR *anchor, NODE* n, int);
-static int iseq_setup(VALUE self, LINK_ANCHOR *anchor);
+static int iseq_compile_each(yarv_iseq_t *iseq, LINK_ANCHOR *anchor, NODE* n, int);
+static int iseq_setup(yarv_iseq_t *iseq, LINK_ANCHOR *anchor);
static int iseq_optimize(yarv_iseq_t *iseq, LINK_ANCHOR *anchor);
static int iseq_insns_unification(yarv_iseq_t *iseq, LINK_ANCHOR *anchor);
@@ -104,8 +105,8 @@
static int set_exception_table(yarv_iseq_t *iseq);
static int set_localtbl(yarv_iseq_t *iseq, ID* tbl);
static int set_localtbl_eval(yarv_iseq_t *iseq, ID* tbl);
-static int set_arguments(VALUE self, yarv_iseq_t *iseq, LINK_ANCHOR *anchor, NODE *node);
-static NODE* set_block_local_tbl(VALUE self, yarv_iseq_t *iseq, NODE *node, LINK_ANCHOR *anchor);
+static int set_arguments(yarv_iseq_t *iseq, LINK_ANCHOR *anchor, NODE *node);
+static NODE* set_block_local_tbl(yarv_iseq_t *iseq, NODE *node, LINK_ANCHOR *anchor);
static int set_exception_tbl(yarv_iseq_t *iseq);
static int set_optargs_table(yarv_iseq_t *iseq);
@@ -146,7 +147,7 @@
iseq->node = node;
if(iseq->type == ISEQ_TYPE_BLOCK){
- node = set_block_local_tbl(self, iseq, node, list_anchor);
+ node = set_block_local_tbl(iseq, node, list_anchor);
}
if(node && nd_type(node) == NODE_SCOPE){
@@ -164,7 +165,7 @@
if(nd_type(sn_body->nd_head) == NODE_ARGS){
/* some method attribute process */
ndargs = sn_body->nd_head;
- set_arguments(self, iseq, list_anchor, ndargs);
+ set_arguments(iseq, list_anchor, ndargs);
/* with sn_body->nd_head */
if(iseq->type == ISEQ_TYPE_METHOD){
@@ -201,7 +202,7 @@
/* some method attribute process */
debugs("empty method\n");
- set_arguments(self, iseq, list_anchor, sn_body);
+ set_arguments(iseq, list_anchor, sn_body);
ADD_INSN(list_anchor, nd_line(sn_body), putnil);
iseq->rewind_frame_size = iseq->local_size + MREWIND_DSIZE();
@@ -272,14 +273,14 @@
if(iseq->type == ISEQ_TYPE_RESCUE ||
iseq->type == ISEQ_TYPE_ENSURE){
- ADD_INSN2(list_anchor, 0, getdynamic, I2F(1), I2F(0));
- ADD_INSN1(list_anchor, 0, throw, I2F(0) /* continue throw */);
+ ADD_INSN2(list_anchor, 0, getdynamic, INT2FIX(1), INT2FIX(0));
+ ADD_INSN1(list_anchor, 0, throw, INT2FIX(0) /* continue throw */);
}
else{
ADD_INSN(list_anchor, iseq->compile_data->last_line, end);
}
- return iseq_setup(self, list_anchor);
+ return iseq_setup(iseq, list_anchor);
}
VALUE th_eval(void *);
@@ -659,10 +660,10 @@
{
INSN *iobj = 0;
#if OPT_BASIC_OPERATIONS
- if(block == 0 && flag == I2F(0)){
+ if(block == 0 && flag == INT2FIX(0)){
ID mid = SYM2ID(id);
- if(argc == I2F(1)){
+ if(argc == INT2FIX(1)){
if(0){
}
else if(mid == idPLUS){
@@ -696,7 +697,7 @@
iobj = new_insn_body(iseq, line_no, BIN(opt_aref), 0);
}
}
- else if(argc == I2F(0)){
+ else if(argc == INT2FIX(0)){
if(mid == idLength){
iobj = new_insn_body(iseq, line_no, BIN(opt_length), 0);
}
@@ -704,7 +705,7 @@
iobj = new_insn_body(iseq, line_no, BIN(opt_succ), 0);
}
}
- else if(argc == I2F(2)){
+ else if(argc == INT2FIX(2)){
if(mid == idASET){
iobj = new_insn_body(iseq, line_no, BIN(opt_aset), 0);
}
@@ -746,11 +747,8 @@
}
static int
-iseq_setup(VALUE self, LINK_ANCHOR *anchor)
+iseq_setup(yarv_iseq_t *iseq, LINK_ANCHOR *anchor)
{
- yarv_iseq_t *iseq;
- GetISeqVal(self, iseq);
-
// debugs("[compile step 2] (iseq_array_to_linkedlist)\n");
// iseq_array_to_linkedlist_each(anchor, seq_ary);
@@ -791,7 +789,7 @@
GC_CHECK();
if(CPDEBUG > 1){
- VALUE str = iseq_disasm(self);
+ VALUE str = iseq_disasm(iseq->self);
printf("%s\n", StringValueCStr(str));
fflush(stdout);
}
@@ -979,7 +977,7 @@
}
static int
-set_block_initializer(VALUE self, yarv_iseq_t *iseq, NODE *node, LINK_ANCHOR *anchor)
+set_block_initializer(yarv_iseq_t *iseq, NODE *node, LINK_ANCHOR *anchor)
{
DECL_ANCHOR(anc);
LINK_ELEMENT *elem;
@@ -996,7 +994,7 @@
}
static NODE*
-set_block_local_tbl(VALUE self, yarv_iseq_t *iseq, NODE *node, LINK_ANCHOR *anchor)
+set_block_local_tbl(yarv_iseq_t *iseq, NODE *node, LINK_ANCHOR *anchor)
{
NODE *rnode;
@@ -1022,8 +1020,8 @@
/* idx-th param, current level*/
ADD_INSN2(anchor, nd_line(node),
- getdynamic, I2F(iseq->local_size - i), I2F(0));
- set_block_initializer(self, iseq, nargs->nd_head, anchor);
+ getdynamic, INT2FIX(iseq->local_size - i), INT2FIX(0));
+ set_block_initializer(iseq, nargs->nd_head, anchor);
}
i++;
nargs = nargs->nd_next;
@@ -1036,8 +1034,8 @@
if(nd_type(node->nd_var->nd_args) != NODE_DASGN_CURR){
ADD_INSN2(anchor, nd_line(node), getdynamic,
- I2F(iseq->local_size - i), I2F(0));
- set_block_initializer(self, iseq, node->nd_var->nd_args, anchor);
+ INT2FIX(iseq->local_size - i), INT2FIX(0));
+ set_block_initializer(iseq, node->nd_var->nd_args, anchor);
}
}
break;
@@ -1049,8 +1047,8 @@
/* for 1.x compatibility */
default:{
/* first param, current level*/
- ADD_INSN2(anchor, nd_line(node), getdynamic, I2F(iseq->local_size), I2F(0));
- set_block_initializer(self, iseq, nargs, anchor);
+ ADD_INSN2(anchor, nd_line(node), getdynamic, INT2FIX(iseq->local_size), INT2FIX(0));
+ set_block_initializer(iseq, nargs, anchor);
break;
}
}
@@ -1083,11 +1081,9 @@
}
static int
-get_dyna_var_idx(VALUE self, ID id, int *level, int *ls)
+get_dyna_var_idx(yarv_iseq_t *iseq, ID id, int *level, int *ls)
{
- yarv_iseq_t *iseq;
int lv = 0, idx;
- GetISeqVal(self, iseq);
while(iseq){
if((idx = get_dyna_var_idx_at_raw(iseq, id)) >= 0){
@@ -1105,8 +1101,7 @@
*/
static int
-set_arguments(VALUE self, yarv_iseq_t *iseq,
- LINK_ANCHOR *optargs, NODE *node)
+set_arguments(yarv_iseq_t *iseq, LINK_ANCHOR *optargs, NODE *node)
{
int i, j;
@@ -1300,7 +1295,7 @@
char type = types[j];
// printf("--> [%c - (%d-%d)]\n", type, k, j);
switch(type){
- case 'L':{ /* label(destination position) */
+ case TS_OFFSET:{ /* label(destination position) */
lobj = (LABEL*)operands[j];
if(lobj->set != Qtrue){
rb_bug("unknown label");
@@ -1311,7 +1306,7 @@
generated_iseq[pos+1+j] = lobj->position - (pos + len);
break;
}
- case 'H':{
+ case TS_CDHASH:{
/*
* [[obj, label], ...]
*/
@@ -1333,10 +1328,12 @@
iseq_add_mark_object(iseq, map);
break;
}
- case 'U': /* ulong */
+ case TS_LINDEX:
+ case TS_DINDEX:
+ case TS_NUM: /* ulong */
generated_iseq[pos+1+j] = FIX2INT(operands[j]);
break;
- case 'B': /* BLOCK */
+ case TS_BLOCKISEQ: /* BLOCK */
{
VALUE v = operands[j];
yarv_iseq_t *block = 0;
@@ -1346,8 +1343,7 @@
generated_iseq[pos+1+j] = (VALUE)block;
break;
}
- case 'V': /* VALUE */
- case 'C': /* class path */
+ case TS_VALUE: /* VALUE */
{
VALUE v = operands[j];
generated_iseq[pos+1+j] = v;
@@ -1357,17 +1353,17 @@
}
break;
}
- case 'M': /* inline cache */
+ case TS_IC: /* inline cache */
{
VALUE v = (VALUE)NEW_INLINE_CACHE_ENTRY();
generated_iseq[pos+1+j] = v;
iseq_add_mark_object(iseq, v);
break;
}
- case 'I': /* ID */
+ case TS_ID: /* ID */
generated_iseq[pos+1+j] = SYM2ID(operands[j]);
break;
- case 'G':
+ case TS_GENTRY:
{
struct global_entry *entry = (struct global_entry*)(operands[j] & (~1));
generated_iseq[pos+1+j] = (VALUE)entry;
@@ -1875,7 +1871,7 @@
static int
-compile_dstr(VALUE self, yarv_iseq_t *iseq, LINK_ANCHOR *ret, NODE *node)
+compile_dstr(yarv_iseq_t *iseq, LINK_ANCHOR *ret, NODE *node)
{
NODE *list = node->nd_next;
VALUE lit = node->nd_lit;
@@ -1896,34 +1892,33 @@
list = list->nd_next;
}
if(cnt > 1){
- ADD_INSN1(ret, nd_line(node), concatstrings, I2F(cnt));
+ ADD_INSN1(ret, nd_line(node), concatstrings, INT2FIX(cnt));
}
return COMPILE_OK;
}
static int
-compile_branch_condition(VALUE self, yarv_iseq_t *iseq,
- LINK_ANCHOR *ret, NODE *cond,
+compile_branch_condition(yarv_iseq_t *iseq, LINK_ANCHOR *ret, NODE *cond,
LABEL *then_label, LABEL *else_label)
{
switch(nd_type(cond)){
case NODE_NOT:
- compile_branch_condition(self, iseq, ret, cond->nd_body, else_label, then_label);
+ compile_branch_condition(iseq, ret, cond->nd_body, else_label, then_label);
break;
case NODE_AND:{
LABEL *label = NEW_LABEL(nd_line(cond));
- compile_branch_condition(self, iseq, ret, cond->nd_1st, label, else_label);
+ compile_branch_condition(iseq, ret, cond->nd_1st, label, else_label);
ADD_LABEL(ret, label);
- compile_branch_condition(self, iseq, ret, cond->nd_2nd, then_label, else_label);
+ compile_branch_condition(iseq, ret, cond->nd_2nd, then_label, else_label);
break;
}
case NODE_OR:{
LABEL *label = NEW_LABEL(nd_line(cond));
- compile_branch_condition(self, iseq, ret, cond->nd_1st, then_label, label);
+ compile_branch_condition(iseq, ret, cond->nd_1st, then_label, label);
ADD_LABEL(ret, label);
- compile_branch_condition(self, iseq, ret, cond->nd_2nd, then_label, else_label);
+ compile_branch_condition(iseq, ret, cond->nd_2nd, then_label, else_label);
break;
}
case NODE_LIT: /* NODE_LIT is always not true */
@@ -1947,7 +1942,7 @@
}
static int
-compile_array(VALUE self, yarv_iseq_t *iseq,
+compile_array(yarv_iseq_t *iseq,
LINK_ANCHOR *ret, NODE *node_root, VALUE opt_p)
{
NODE *node = node_root;
@@ -1974,7 +1969,7 @@
ADD_INSN1(ret, nd_line(node_root), duparray, ary);
}
else{
- ADD_INSN1(anchor, line, newarray, I2F(len));
+ ADD_INSN1(anchor, line, newarray, INT2FIX(len));
APPEND_LIST(ret, anchor);
}
@@ -1998,8 +1993,7 @@
}
static int
-make_masgn_lhs(VALUE self, yarv_iseq_t *iseq,
- LINK_ANCHOR *ret, NODE *node)
+make_masgn_lhs(yarv_iseq_t *iseq, LINK_ANCHOR *ret, NODE *node)
{
switch(nd_type(node)){
@@ -2012,7 +2006,7 @@
ret->last = ret->last->prev;
dupidx = iobj->operands[1]; // RARRAY(iobj->operands)->ptr[1]; /* send sym, num, ... */
- dupidx = I2F(FIX2INT(dupidx) + 1);
+ dupidx = INT2FIX(FIX2INT(dupidx) + 1);
iobj->operands[1] = dupidx;
ADD_INSN1(ret, nd_line(node), topn, dupidx);
@@ -2041,12 +2035,12 @@
}
static int
-compile_massign(VALUE self, yarv_iseq_t *iseq, LINK_ANCHOR *ret,
+compile_massign(yarv_iseq_t *iseq, LINK_ANCHOR *ret,
NODE *rhsn, NODE *splatn, NODE *lhsn, int llen)
{
if(lhsn != 0){
- compile_massign(self, iseq, ret, rhsn, splatn, lhsn->nd_next, llen + 1);
- make_masgn_lhs(self, iseq, ret, lhsn->nd_head);
+ compile_massign(iseq, ret, rhsn, splatn, lhsn->nd_next, llen + 1);
+ make_masgn_lhs(iseq, ret, lhsn->nd_head);
}
else{
int lhs_splat = 0;
@@ -2091,18 +2085,18 @@
}
if(lhs_splat){
- ADD_INSN1(ret, 0, newarray, I2F(si));
+ ADD_INSN1(ret, 0, newarray, INT2FIX(si));
}
break;
}
case NODE_TO_ARY:
COMPILE (ret, "rhs to ary", rhsn->nd_head);
- ADD_INSN2(ret, 0, expandarray, I2F(llen), INT2FIX(lhs_splat));
+ ADD_INSN2(ret, 0, expandarray, INT2FIX(llen), INT2FIX(lhs_splat));
break;
case NODE_SPLAT:
COMPILE (ret, "rhs to ary (splat)", rhsn->nd_head);
- ADD_INSN2(ret, nd_line(rhsn), expandarray, I2F(llen), INT2FIX(lhs_splat));
+ ADD_INSN2(ret, nd_line(rhsn), expandarray, INT2FIX(llen), INT2FIX(lhs_splat));
break;
case NODE_ARGSCAT:{
@@ -2122,11 +2116,11 @@
if(llen > idx){
COMPILE (ret, "rhs to ary (argscat/splat)", rhsn->nd_body);
- ADD_INSN2(ret, nd_line(rhsn), expandarray, I2F(llen - idx), INT2FIX(lhs_splat));
+ ADD_INSN2(ret, nd_line(rhsn), expandarray, INT2FIX(llen - idx), INT2FIX(lhs_splat));
}
else if(lhs_splat){
COMPILE (ret, "rhs to ary (argscat/splat)", rhsn->nd_body);
- ADD_INSN2(ret, nd_line(rhsn), expandarray, I2F(llen - idx), INT2FIX(lhs_splat));
+ ADD_INSN2(ret, nd_line(rhsn), expandarray, INT2FIX(llen - idx), INT2FIX(lhs_splat));
}
break;
}
@@ -2140,14 +2134,14 @@
}
if(lhs_splat){
- make_masgn_lhs(self, iseq, ret, splatn);
+ make_masgn_lhs(iseq, ret, splatn);
}
}
return COMPILE_OK;
}
static int
-compile_colon2(VALUE self, yarv_iseq_t *iseq, NODE *node,
+compile_colon2(yarv_iseq_t *iseq, NODE *node,
LINK_ANCHOR *pref, LINK_ANCHOR *body)
{
switch(nd_type(node)){
@@ -2162,7 +2156,7 @@
ADD_INSN1(body, nd_line(node), getconstant, ID2SYM(node->nd_mid));
break;
case NODE_COLON2:
- compile_colon2(self, iseq, node->nd_head, pref, body);
+ compile_colon2(iseq, node->nd_head, pref, body);
debugi("compile_colon2 - colon2", node->nd_mid);
ADD_INSN1(body, nd_line(node), getconstant, ID2SYM(node->nd_mid));
break;
@@ -2174,8 +2168,8 @@
}
static int
-defined_expr(VALUE self, yarv_iseq_t *iseq,
- LINK_ANCHOR *ret, NODE *node, LABEL *lfinish, VALUE needstr)
+defined_expr(yarv_iseq_t *iseq, LINK_ANCHOR *ret,
+ NODE *node, LABEL *lfinish, VALUE needstr)
{
char *estr = 0;
@@ -2209,30 +2203,30 @@
case NODE_IVAR:
ADD_INSN (ret, nd_line(node), putnil);
- ADD_INSN3(ret, nd_line(node), defined, I2F(DEFINED_IVAR), ID2SYM(node->nd_vid), needstr);
+ ADD_INSN3(ret, nd_line(node), defined, INT2FIX(DEFINED_IVAR), ID2SYM(node->nd_vid), needstr);
return 1;
case NODE_GVAR:
ADD_INSN (ret, nd_line(node), putnil);
- ADD_INSN3(ret, nd_line(node), defined, I2F(DEFINED_GVAR),
+ ADD_INSN3(ret, nd_line(node), defined, INT2FIX(DEFINED_GVAR),
((VALUE)node->nd_entry) | 1, needstr);
return 1;
case NODE_CVAR:
ADD_INSN (ret, nd_line(node), putnil);
- ADD_INSN3(ret, nd_line(node), defined, I2F(DEFINED_CVAR),
+ ADD_INSN3(ret, nd_line(node), defined, INT2FIX(DEFINED_CVAR),
ID2SYM(node->nd_vid), needstr);
return 1;
case NODE_CONST:
ADD_INSN (ret, nd_line(node), putnil);
- ADD_INSN3(ret, nd_line(node), defined, I2F(DEFINED_CONST),
+ ADD_INSN3(ret, nd_line(node), defined, INT2FIX(DEFINED_CONST),
ID2SYM(node->nd_vid), needstr);
return 1;
case NODE_COLON2:
if(rb_is_const_id(node->nd_mid)){
LABEL *lcont = NEW_LABEL(nd_line(node));
- defined_expr(self, iseq, ret, node->nd_head, lfinish, Qfalse);
+ defined_expr(iseq, ret, node->nd_head, lfinish, Qfalse);
ADD_INSNL(ret, nd_line(node), if, lcont);
ADD_INSN (ret, nd_line(node), putnil);
@@ -2240,12 +2234,12 @@
ADD_LABEL(ret, lcont);
COMPILE(ret, "defined/colon2#nd_head", node->nd_head);
- ADD_INSN3(ret, nd_line(node), defined, I2F(DEFINED_CONST),
+ ADD_INSN3(ret, nd_line(node), defined, INT2FIX(DEFINED_CONST),
ID2SYM(node->nd_mid), needstr);
}
else{
LABEL *lcont = NEW_LABEL(nd_line(node));
- defined_expr(self, iseq, ret, node->nd_head, lfinish, Qfalse);
+ defined_expr(iseq, ret, node->nd_head, lfinish, Qfalse);
ADD_INSNL(ret, nd_line(node), if, lcont);
ADD_INSN (ret, nd_line(node), putnil);
@@ -2253,14 +2247,14 @@
ADD_LABEL(ret, lcont);
COMPILE(ret, "defined/colon2#nd_head", node->nd_head);
- ADD_INSN3(ret, nd_line(node), defined, I2F(DEFINED_METHOD),
+ ADD_INSN3(ret, nd_line(node), defined, INT2FIX(DEFINED_METHOD),
ID2SYM(node->nd_mid), needstr);
}
return 1;
case NODE_COLON3:
ADD_INSN1(ret, nd_line(node), putobject, rb_cObject);
ADD_INSN3(ret, nd_line(node), defined,
- I2F(DEFINED_CONST), ID2SYM(node->nd_mid), needstr);
+ INT2FIX(DEFINED_CONST), ID2SYM(node->nd_mid), needstr);
return 1;
/* method dispatch */
@@ -2270,7 +2264,7 @@
if(nd_type(node) == NODE_CALL){
LABEL *lcont = NEW_LABEL(nd_line(node));
- defined_expr(self, iseq, ret, node->nd_recv, lfinish, Qfalse);
+ defined_expr(iseq, ret, node->nd_recv, lfinish, Qfalse);
ADD_INSNL(ret, nd_line(node), if, lcont);
ADD_INSN (ret, nd_line(node), putnil);
ADD_INSNL(ret, nd_line(node), jump, lfinish);
@@ -2281,23 +2275,23 @@
else{
ADD_INSN(ret, nd_line(node), putself);
}
- ADD_INSN3(ret, nd_line(node), defined, I2F(DEFINED_METHOD),
+ ADD_INSN3(ret, nd_line(node), defined, INT2FIX(DEFINED_METHOD),
ID2SYM(node->nd_mid), needstr);
return 1;
case NODE_YIELD:
ADD_INSN (ret, nd_line(node), putnil);
- ADD_INSN3(ret, nd_line(node), defined, I2F(DEFINED_YIELD), 0, needstr);
+ ADD_INSN3(ret, nd_line(node), defined, INT2FIX(DEFINED_YIELD), 0, needstr);
return 1;
case NODE_NTH_REF:
ADD_INSN (ret, nd_line(node), putnil);
- ADD_INSN3(ret, nd_line(node), defined, I2F(DEFINED_REF), 0, needstr);
+ ADD_INSN3(ret, nd_line(node), defined, INT2FIX(DEFINED_REF), 0, needstr);
return 1;
case NODE_ZSUPER:
ADD_INSN (ret, nd_line(node), putnil);
- ADD_INSN3(ret, nd_line(node), defined, I2F(DEFINED_ZSUPER), 0, needstr);
+ ADD_INSN3(ret, nd_line(node), defined, INT2FIX(DEFINED_ZSUPER), 0, needstr);
return 1;
default:{
@@ -2396,7 +2390,7 @@
}
static void
-add_ensure_iseq(LINK_ANCHOR *ret, yarv_iseq_t *iseq, VALUE self)
+add_ensure_iseq(LINK_ANCHOR *ret, yarv_iseq_t *iseq)
{
struct iseq_compile_data_ensure_node_stack *enlp =
iseq->compile_data->ensure_node_stack;
@@ -2429,14 +2423,10 @@
poped: This node will be poped
*/
static int
-iseq_compile_each(VALUE self, LINK_ANCHOR *ret, NODE* node, int poped)
+iseq_compile_each(yarv_iseq_t *iseq, LINK_ANCHOR *ret, NODE* node, int poped)
{
VALUE tmp; /* reserved for macro */
-
int type;
- yarv_iseq_t *iseq;
-
- GetISeqVal(self, iseq);
GC_CHECK();
@@ -2498,7 +2488,7 @@
else_label = NEW_LABEL(nd_line(node));
end_label = NEW_LABEL(nd_line(node));
- compile_branch_condition(self, iseq, cond_seq, node->nd_cond, then_label, else_label);
+ compile_branch_condition(iseq, cond_seq, node->nd_cond, then_label, else_label);
COMPILE_(then_seq, "then", node->nd_body, poped);
COMPILE_(else_seq, "else", node->nd_else, poped);
@@ -2695,17 +2685,17 @@
ADD_LABEL(ret, next_label); /* next */
if(type == NODE_WHILE){
- compile_branch_condition(self, iseq, ret,
- node->nd_cond, redo_label, end_label);
+ compile_branch_condition(iseq, ret, node->nd_cond,
+ redo_label, end_label);
}
else if(type == NODE_UNTIL){
/* untile */
- compile_branch_condition(self, iseq, ret,
- node->nd_cond, end_label, redo_label);
+ compile_branch_condition(iseq, ret, node->nd_cond,
+ end_label, redo_label);
}
else{
ADD_INSN(ret, nd_line(node), putself);
- ADD_CALL(ret, nd_line(node), ID2SYM(idGets), I2F(0));
+ ADD_CALL(ret, nd_line(node), ID2SYM(idGets), INT2FIX(0));
ADD_INSNL(ret, nd_line(node), if, redo_label);
/* opt_n */
}
@@ -2778,7 +2768,7 @@
if(iseq->compile_data->redo_label != 0){
/* while/until */
- add_ensure_iseq(ret, iseq, self);
+ add_ensure_iseq(ret, iseq);
COMPILE_(ret, "break val(while/until)", node->nd_stts,
iseq->compile_data->loopval_popped);
ADD_INSNL(ret, nd_line(node), jump, iseq->compile_data->end_label);
@@ -2787,7 +2777,7 @@
break_by_insn:
/* escape from block */
COMPILE(ret, "break val (block)", node->nd_stts);
- ADD_INSN1(ret, nd_line(node), throw, I2F(level | 0x02) /* TAG_BREAK */);
+ ADD_INSN1(ret, nd_line(node), throw, INT2FIX(level | 0x02) /* TAG_BREAK */);
}
else{
yarv_iseq_t *ip = iseq->parent_iseq;
@@ -2807,7 +2797,7 @@
}
ip = ip->parent_iseq;
}
- COMPILE_ERROR(("can't put break"));
+ COMPILE_ERROR(("Illegal break"));
}
break;
}
@@ -2815,12 +2805,12 @@
unsigned long level = 0;
if(iseq->compile_data->redo_label != 0){
- add_ensure_iseq(ret, iseq, self);
+ add_ensure_iseq(ret, iseq);
ADD_INSNL(ret, nd_line(node), jump, iseq->compile_data->start_label);
}
else if(iseq->compile_data->end_label){
COMPILE(ret, "next val", node->nd_stts);
- add_ensure_iseq(ret, iseq, self);
+ add_ensure_iseq(ret, iseq);
ADD_INSNL(ret, nd_line(node), jump, iseq->compile_data->end_label);
}
else{
@@ -2838,18 +2828,18 @@
}
if(ip != 0){
COMPILE(ret, "next val", node->nd_stts);
- add_ensure_iseq(ret, iseq, self);
- ADD_INSN1(ret, nd_line(node), throw, I2F(level | 0x03) /* TAG_NEXT */);
+ add_ensure_iseq(ret, iseq);
+ ADD_INSN1(ret, nd_line(node), throw, INT2FIX(level | 0x03) /* TAG_NEXT */);
}
else{
- COMPILE_ERROR(("can't next"));
+ COMPILE_ERROR(("Illegal next"));
}
}
break;
}
case NODE_REDO:{
if(iseq->compile_data->redo_label){
- add_ensure_iseq(ret, iseq, self);
+ add_ensure_iseq(ret, iseq);
ADD_INSNL(ret, nd_line(node), jump, iseq->compile_data->redo_label);
}
else if(iseq->compile_data->start_label){
@@ -2868,11 +2858,12 @@
ip = ip->parent_iseq;
}
if(ip != 0){
- add_ensure_iseq(ret, iseq, self);
- ADD_INSN1(ret, nd_line(node), throw, I2F(level | 0x05) /* TAG_REDO */);
+ add_ensure_iseq(ret, iseq
+ );
+ ADD_INSN1(ret, nd_line(node), throw, INT2FIX(level | 0x05) /* TAG_REDO */);
}
else{
- COMPILE_ERROR(("can't redo"));
+ COMPILE_ERROR(("Illegal redo"));
}
}
break;
@@ -2881,10 +2872,10 @@
if(iseq->type == ISEQ_TYPE_BLOCK ||
iseq->type == ISEQ_TYPE_RESCUE){
ADD_INSN (ret, nd_line(node), putnil);
- ADD_INSN1(ret, nd_line(node), throw, I2F(0x04) /* TAG_RETRY */);
+ ADD_INSN1(ret, nd_line(node), throw, INT2FIX(0x04) /* TAG_RETRY */);
}
else{
- COMPILE_ERROR(("can't put retry"));
+ COMPILE_ERROR(("Illegal retry"));
}
break;
}
@@ -2931,14 +2922,14 @@
narg = resq->nd_args;
while(narg){
COMPILE (ret, "rescue arg", narg->nd_head);
- ADD_INSN2(ret, nd_line(node), getdynamic, I2F(1), I2F(0));
+ ADD_INSN2(ret, nd_line(node), getdynamic, INT2FIX(1), INT2FIX(0));
ADD_SEND (ret, nd_line(node), ID2SYM(idEqq), INT2FIX(1));
ADD_INSNL(ret, nd_line(node), if, label_hit);
narg = narg->nd_next;
}
if(resq->nd_args == 0){
ADD_INSN1(ret, nd_line(node), putobject, rb_eStandardError);
- ADD_INSN2(ret, nd_line(node), getdynamic, I2F(1), I2F(0));
+ ADD_INSN2(ret, nd_line(node), getdynamic, INT2FIX(1), INT2FIX(0));
ADD_SEND (ret, nd_line(node), ID2SYM(idEqq), INT2FIX(1));
ADD_INSNL(ret, nd_line(node), if, label_hit);
}
@@ -3025,7 +3016,7 @@
}
case NODE_MASGN:{
- compile_massign(self, iseq, ret,
+ compile_massign(iseq, ret,
node->nd_value, /* rhsn */
node->nd_args, /* splat */
node->nd_head, /* lhsn */
@@ -3044,7 +3035,7 @@
if(!poped){
ADD_INSN(ret, nd_line(node), dup);
}
- ADD_INSN1(ret, nd_line(node), setlocal, I2F(idx));
+ ADD_INSN1(ret, nd_line(node), setlocal, INT2FIX(idx));
break;
}
@@ -3057,7 +3048,7 @@
if(!poped){
ADD_INSN(ret, nd_line(node), dup);
}
- idx = get_dyna_var_idx(self, node->nd_vid, &lv, &ls);
+ idx = get_dyna_var_idx(iseq, node->nd_vid, &lv, &ls);
if(nd_type(node) == NODE_DASGN_CURR &&
lv > 0 &&
iseq->type != ISEQ_TYPE_RESCUE &&
@@ -3072,7 +3063,7 @@
COMPILE_ERROR(("NODE_DASGN error"));
}
ADD_INSN2(ret, nd_line(node), setdynamic,
- I2F(ls - idx), I2F(lv));
+ INT2FIX(ls - idx), INT2FIX(lv));
break;
}
case NODE_GASGN:{
@@ -3137,13 +3128,13 @@
*/
COMPILE(ret, "NODE_OP_ASGN1 recv", node->nd_recv);
- compile_array(self, iseq, args, node->nd_args->nd_next, Qfalse);
+ compile_array(iseq, args, node->nd_args->nd_next, Qfalse);
POP_ELEMENT(args); POP_ELEMENT(args);
argc = node->nd_args->nd_alen - 2;
ADD_SEQ (ret, args);
- ADD_INSN1(ret, nd_line(node), dupn, I2F(argc+1));
- ADD_SEND (ret, nd_line(node), ID2SYM(idAREF), I2F(argc));
+ ADD_INSN1(ret, nd_line(node), dupn, INT2FIX(argc+1));
+ ADD_SEND (ret, nd_line(node), ID2SYM(idAREF), INT2FIX(argc));
if(id == 0 || id == 1){
/* 0: or, 1: and
@@ -3170,7 +3161,7 @@
}
COMPILE (ret, "NODE_OP_ASGN1 args->head: ", node->nd_args->nd_head);
- ADD_SEND (ret, nd_line(node), ID2SYM(idASET), I2F(argc+1));
+ ADD_SEND (ret, nd_line(node), ID2SYM(idASET), INT2FIX(argc+1));
ADD_INSNL(ret, nd_line(node), jump, lfin);
ADD_LABEL(ret, label);
if(id == 0){ /* or */
@@ -3188,8 +3179,8 @@
}
else{
COMPILE (ret, "NODE_OP_ASGN1 args->head: ", node->nd_args->nd_head);
- ADD_SEND(ret, nd_line(node), ID2SYM(id), I2F(1));
- ADD_SEND(ret, nd_line(node), ID2SYM(idASET), I2F(argc+1));
+ ADD_SEND(ret, nd_line(node), ID2SYM(id), INT2FIX(1));
+ ADD_SEND(ret, nd_line(node), ID2SYM(idASET), INT2FIX(argc+1));
}
if(poped){
@@ -3242,7 +3233,7 @@
COMPILE (ret, "NODE_OP_ASGN2#recv", node->nd_recv);
ADD_INSN (ret, nd_line(node), dup);
- ADD_SEND(ret, nd_line(node), ID2SYM(node->nd_next->nd_vid), I2F(0));
+ ADD_SEND(ret, nd_line(node), ID2SYM(node->nd_next->nd_vid), INT2FIX(0));
if(atype == 0 || atype == 1){ /* 0: OR or 1: AND */
ADD_INSN (ret, nd_line(node), dup);
@@ -3254,7 +3245,7 @@
}
ADD_INSN (ret, nd_line(node), pop);
COMPILE (ret, "NODE_OP_ASGN2 val", node->nd_value);
- ADD_SEND (ret, nd_line(node), ID2SYM(node->nd_next->nd_aid), I2F(1));
+ ADD_SEND (ret, nd_line(node), ID2SYM(node->nd_next->nd_aid), INT2FIX(1));
ADD_INSNL(ret, nd_line(node), jump, lfin);
ADD_LABEL(ret, lcfin);
@@ -3265,8 +3256,8 @@
}
else{
COMPILE (ret, "NODE_OP_ASGN2 val", node->nd_value);
- ADD_SEND(ret, nd_line(node), ID2SYM(node->nd_next->nd_mid), I2F(1));
- ADD_SEND(ret, nd_line(node), ID2SYM(node->nd_next->nd_aid), I2F(1));
+ ADD_SEND(ret, nd_line(node), ID2SYM(node->nd_next->nd_mid), INT2FIX(1));
+ ADD_SEND(ret, nd_line(node), ID2SYM(node->nd_next->nd_aid), INT2FIX(1));
}
if(poped){
@@ -3376,7 +3367,7 @@
if(type != NODE_VCALL && node->nd_args){
if(nd_type(node->nd_args) == NODE_SPLAT){
COMPILE(args, "args(splat)", node->nd_args->nd_head);
- argc = I2F(1);
+ argc = INT2FIX(1);
flag |= VM_CALL_ARGS_SPLAT_BIT;
}
else if(nd_type(node->nd_args) == NODE_ARGSCAT){
@@ -3384,23 +3375,23 @@
for(argc = 0; t; argc++, t = t->nd_next){
/* */
}
- argc = I2F(argc+1);
+ argc = INT2FIX(argc+1);
- compile_array(self, iseq, args, node->nd_args->nd_head, Qfalse);
+ compile_array(iseq, args, node->nd_args->nd_head, Qfalse);
POP_ELEMENT(args);
- // argc = I2F(LIST_SIZE(args) + 1);
+ // argc = INT2FIX(LIST_SIZE(args) + 1);
COMPILE(args, "args(cat: splat)", node->nd_args->nd_body);
flag |= VM_CALL_ARGS_SPLAT_BIT;
}
else{
- compile_array(self, iseq, args, node->nd_args, Qfalse);
+ compile_array(iseq, args, node->nd_args, Qfalse);
argc = OPERAND_AT(POP_ELEMENT(args), 0);
}
}
else{
- argc = I2F(0);
+ argc = INT2FIX(0);
}
ADD_SEQ(ret, recv);
@@ -3429,7 +3420,7 @@
}
ADD_SEND_R(ret, nd_line(node), ID2SYM(mid), argc,
- block, I2F(flag));
+ block, INT2FIX(flag));
if(poped){
ADD_INSN(ret, nd_line(node), pop);
@@ -3450,11 +3441,11 @@
if(type != NODE_VCALL && node->nd_args){
if(nd_type(node->nd_args) == NODE_SPLAT){
COMPILE(args, "args(splat)", node->nd_args->nd_head);
- argc = I2F(1);
+ argc = INT2FIX(1);
flag |= VM_CALL_ARGS_SPLAT_BIT;
}
else if(nd_type(node->nd_args) == NODE_ARGSCAT){
- compile_array(self, iseq, args, node->nd_args->nd_head, Qfalse);
+ compile_array(iseq, args, node->nd_args->nd_head, Qfalse);
POP_ELEMENT(args);
argc = INT2FIX(LIST_SIZE(args) + 1);
@@ -3462,12 +3453,12 @@
flag |= VM_CALL_ARGS_SPLAT_BIT;
}
else{
- compile_array(self, iseq, args, node->nd_args, Qfalse);
+ compile_array(iseq, args, node->nd_args, Qfalse);
argc = OPERAND_AT(POP_ELEMENT(args), 0);
}
}
else{
- argc = I2F(0);
+ argc = INT2FIX(0);
}
}
else{
@@ -3475,12 +3466,12 @@
int i;
yarv_iseq_t *liseq = iseq->local_iseq;
- argc = I2F(liseq->argc);
+ argc = INT2FIX(liseq->argc);
/* normal arguments */
for(i=0; i<liseq->argc; i++){
int idx = liseq->local_size - i;
- ADD_INSN1(args, nd_line(node), getlocal, I2F(idx));
+ ADD_INSN1(args, nd_line(node), getlocal, INT2FIX(idx));
}
if(!liseq->arg_simple){
if(liseq->arg_opts){
@@ -3488,7 +3479,7 @@
int j;
for(j=0; j<liseq->arg_opts-1; j++){
int idx = liseq->local_size - (i+j);
- ADD_INSN1(args, nd_line(node), getlocal, I2F(idx));
+ ADD_INSN1(args, nd_line(node), getlocal, INT2FIX(idx));
}
i+=j;
argc = INT2FIX(i);
@@ -3496,14 +3487,20 @@
if(liseq->arg_rest){
/* rest arguments */
int idx = liseq->local_size - liseq->arg_rest + 1;
- ADD_INSN1(args, nd_line(node), getlocal, I2F(idx));
+ ADD_INSN1(args, nd_line(node), getlocal, INT2FIX(idx));
argc = INT2FIX(liseq->arg_rest);
flag |= VM_CALL_ARGS_SPLAT_BIT;
}
}
}
-
- ADD_INSN(ret, nd_line(node), putnil); /* dummy reciever */
+
+ /* dummy reciever */
+ if(nd_type(node) == NODE_ZSUPER){
+ ADD_INSN1(ret, nd_line(node), putobject, Qfalse);
+ }
+ else{
+ ADD_INSN1(ret, nd_line(node), putobject, Qtrue);
+ }
ADD_SEQ(ret, args);
/* block */
@@ -3518,7 +3515,7 @@
}
}
- ADD_INSN3(ret, nd_line(node), super, argc, block, I2F(flag));
+ ADD_INSN3(ret, nd_line(node), super, argc, block, INT2FIX(flag));
if(poped){
ADD_INSN(ret, nd_line(node), pop);
@@ -3526,7 +3523,7 @@
break;
}
case NODE_ARRAY:{
- compile_array(self, iseq, ret, node, Qtrue);
+ compile_array(iseq, ret, node, Qtrue);
if(poped){
ADD_INSN(ret, nd_line(node), pop);
}
@@ -3534,7 +3531,7 @@
}
case NODE_ZARRAY:{
if(!poped){
- ADD_INSN1(ret, nd_line(node), newarray, I2F(0));
+ ADD_INSN1(ret, nd_line(node), newarray, INT2FIX(0));
}
break;
}
@@ -3544,7 +3541,7 @@
COMPILE(ret, "values item", n->nd_head);
n = n->nd_next;
}
- ADD_INSN1(ret, nd_line(node), newarray, I2F(node->nd_alen));
+ ADD_INSN1(ret, nd_line(node), newarray, INT2FIX(node->nd_alen));
if(poped){
ADD_INSN(ret, nd_line(node), pop);
}
@@ -3557,13 +3554,13 @@
switch(type){
case NODE_ARRAY:{
- compile_array(self, iseq, list, node->nd_head, Qfalse);
+ compile_array(iseq, list, node->nd_head, Qfalse);
size = OPERAND_AT(POP_ELEMENT(list), 0);
ADD_SEQ (ret, list);
break;
}
case NODE_ZARRAY:
- size = I2F(0);
+ size = INT2FIX(0);
break;
default:
@@ -3583,7 +3580,7 @@
while(is){
if(is->type == ISEQ_TYPE_TOP ||
is->type == ISEQ_TYPE_CLASS){
- COMPILE_ERROR(("can't put return"));
+ COMPILE_ERROR(("Illegal return"));
break;
}
else{
@@ -3592,13 +3589,13 @@
}
COMPILE(ret, "return nd_stts (return val)", node->nd_stts);
- add_ensure_iseq(ret, iseq, self);
+ add_ensure_iseq(ret, iseq);
if(is->type == ISEQ_TYPE_METHOD){
ADD_INSN(ret, nd_line(node), end);
}
else{
- ADD_INSN1(ret, nd_line(node), throw, I2F(0x01) /* TAG_RETURN */);
+ ADD_INSN1(ret, nd_line(node), throw, INT2FIX(0x01) /* TAG_RETURN */);
}
break;
}
@@ -3613,7 +3610,7 @@
if(iseq->type == ISEQ_TYPE_TOP ||
iseq->type == ISEQ_TYPE_CLASS){
- COMPILE_ERROR(("can't put yield"));
+ COMPILE_ERROR(("Illegal yield"));
}
if(node->nd_head){
@@ -3626,7 +3623,7 @@
COMPILE(args, "yield with an arg", node->nd_head);
}
else{
- compile_array(self, iseq, args, node->nd_head, Qfalse);
+ compile_array(iseq, args, node->nd_head, Qfalse);
POP_ELEMENT(args);
}
debugs("argc: %d\n", argc);
@@ -3637,7 +3634,7 @@
flag |= VM_CALL_ARGS_SPLAT_BIT;
}
- compile_array(self, iseq, args, node->nd_head->nd_head, Qfalse);
+ compile_array(iseq, args, node->nd_head->nd_head, Qfalse);
POP_ELEMENT(args);
argc = LIST_SIZE(args) + 1;
@@ -3661,7 +3658,7 @@
argc = 0;
}
ADD_SEQ (ret, args);
- ADD_INSN2(ret, nd_line(node), yield, I2F(argc), I2F(flag));
+ ADD_INSN2(ret, nd_line(node), yield, INT2FIX(argc), INT2FIX(flag));
if(poped){
ADD_INSN(ret, nd_line(node), pop);
@@ -3672,7 +3669,7 @@
if(!poped){
int idx = iseq->local_iseq->local_size + 2 - node->nd_cnt;
debugs("idx: %d\n", idx);
- ADD_INSN1(ret, nd_line(node), getlocal, I2F(idx));
+ ADD_INSN1(ret, nd_line(node), getlocal, INT2FIX(idx));
}
break;
}
@@ -3680,11 +3677,11 @@
int lv, idx, ls;
debugi("nd_vid", node->nd_vid);
if(!poped){
- idx = get_dyna_var_idx(self, node->nd_vid, &lv, &ls);
+ idx = get_dyna_var_idx(iseq, node->nd_vid, &lv, &ls);
if(idx < 0){
rb_bug("unknown dvar (%s)", rb_id2name(node->nd_vid));
}
- ADD_INSN2(ret, nd_line(node), getdynamic, I2F(ls - idx), I2F(lv));
+ ADD_INSN2(ret, nd_line(node), getdynamic, INT2FIX(ls - idx), INT2FIX(lv));
}
break;
}
@@ -3725,11 +3722,11 @@
break;
}
case NODE_NTH_REF:{
- ADD_INSN2(ret, nd_line(node), getspecial, I2F(node->nd_cnt), I2F(node->nd_nth << 1));
+ ADD_INSN2(ret, nd_line(node), getspecial, INT2FIX(node->nd_cnt), INT2FIX(node->nd_nth << 1));
break;
}
case NODE_BACK_REF:{
- ADD_INSN2(ret, nd_line(node), getspecial, I2F(node->nd_cnt), I2F(0x01 | (node->nd_nth << 1)));
+ ADD_INSN2(ret, nd_line(node), getspecial, INT2FIX(node->nd_cnt), INT2FIX(0x01 | (node->nd_nth << 1)));
break;
}
case NODE_MATCH:
@@ -3740,7 +3737,7 @@
if(nd_type(node) == NODE_MATCH){
ADD_INSN1(recv, nd_line(node), putobject, node->nd_lit);
- ADD_INSN2(val, nd_line(node), getspecial, I2F(0), I2F(0));
+ ADD_INSN2(val, nd_line(node), getspecial, INT2FIX(0), INT2FIX(0));
}
else{
COMPILE(recv, "reciever", node->nd_recv);
@@ -3785,7 +3782,7 @@
break;
}
case NODE_DSTR:{
- compile_dstr(self, iseq, ret, node);
+ compile_dstr(iseq, ret, node);
if(poped){
ADD_INSN(ret, nd_line(node), pop);
@@ -3804,7 +3801,7 @@
}
case NODE_DXSTR:{
ADD_INSN(ret, nd_line(node), putself);
- compile_dstr(self, iseq, ret, node);
+ compile_dstr(iseq, ret, node);
ADD_CALL(ret, nd_line(node), ID2SYM(idBackquote), INT2FIX(1));
if(poped){
@@ -3824,8 +3821,8 @@
break;
}
case NODE_DREGX:{
- compile_dstr(self, iseq, ret, node);
- ADD_INSN1(ret, nd_line(node), toregexp, I2F(node->nd_cflag));
+ compile_dstr(iseq, ret, node);
+ ADD_INSN1(ret, nd_line(node), toregexp, INT2FIX(node->nd_cflag));
if(poped){
ADD_INSN(ret, nd_line(node), pop);
@@ -3841,8 +3838,8 @@
ADD_INSN2(ret, nd_line(node), onceinlinecache, NEW_INLINE_CACHE_ENTRY(), lend);
ADD_INSN (ret, nd_line(node), pop);
- compile_dstr(self, iseq, ret, node);
- ADD_INSN1(ret, nd_line(node), toregexp, I2F(node->nd_cflag));
+ compile_dstr(iseq, ret, node);
+ ADD_INSN1(ret, nd_line(node), toregexp, INT2FIX(node->nd_cflag));
ADD_INSN1(ret, nd_line(node), setinlinecache, lstart);
ADD_LABEL(ret, lend);
@@ -4019,7 +4016,7 @@
DECL_ANCHOR(pref);
DECL_ANCHOR(body);
- compile_colon2(self, iseq, node, pref, body);
+ compile_colon2(iseq, node, pref, body);
if(LIST_SIZE_ZERO(pref)){
ADD_LABEL(ret, lstart);
ADD_INSN2(ret, nd_line(node), getinlinecache, NEW_INLINE_CACHE_ENTRY(), lend);
@@ -4087,7 +4084,7 @@
LABEL * lfin = NEW_LABEL(nd_line(node));
LABEL * ltrue = NEW_LABEL(nd_line(node));
- ADD_INSN2(ret, nd_line(node), getspecial, I2F(node->nd_cnt), I2F(0));
+ ADD_INSN2(ret, nd_line(node), getspecial, INT2FIX(node->nd_cnt), INT2FIX(0));
ADD_INSNL(ret, nd_line(node), if, lend);
/* *flip == 0 */
@@ -4096,11 +4093,11 @@
ADD_INSNL(ret, nd_line(node), unless, lfin);
if(nd_type(node) == NODE_FLIP3){
ADD_INSN (ret, nd_line(node), dup);
- ADD_INSN2(ret, nd_line(node), setspecial, I2F(node->nd_cnt), I2F(0));
+ ADD_INSN2(ret, nd_line(node), setspecial, INT2FIX(node->nd_cnt), INT2FIX(0));
ADD_INSNL(ret, nd_line(node), jump, lfin);
}
else{
- ADD_INSN2(ret, nd_line(node), setspecial, I2F(node->nd_cnt), I2F(0));
+ ADD_INSN2(ret, nd_line(node), setspecial, INT2FIX(node->nd_cnt), INT2FIX(0));
}
/* *flip == 1 */
@@ -4108,7 +4105,7 @@
COMPILE (ret, "flip2 end", node->nd_end);
ADD_INSNL(ret, nd_line(node), unless, ltrue);
ADD_INSN1(ret, nd_line(node), putobject, Qfalse);
- ADD_INSN2(ret, nd_line(node), setspecial, I2F(node->nd_cnt), I2F(0));
+ ADD_INSN2(ret, nd_line(node), setspecial, INT2FIX(node->nd_cnt), INT2FIX(0));
ADD_LABEL(ret, ltrue);
ADD_INSN1(ret, nd_line(node), putobject, Qtrue);
@@ -4150,7 +4147,7 @@
case NODE_ERRINFO:{
if(!poped){
if(iseq->type == ISEQ_TYPE_RESCUE){
- ADD_INSN2(ret, nd_line(node), getdynamic, I2F(1), I2F(0));
+ ADD_INSN2(ret, nd_line(node), getdynamic, INT2FIX(1), INT2FIX(0));
}
else{
ADD_INSN(ret, nd_line(node), putnil);
@@ -4161,7 +4158,7 @@
case NODE_DEFINED:{
if(!poped){
LABEL * lfinish = NEW_LABEL(nd_line(node));
- defined_expr(self, iseq, ret, node->nd_head, lfinish, Qtrue);
+ defined_expr(iseq, ret, node->nd_head, lfinish, Qtrue);
ADD_LABEL(ret, lfinish);
}
break;
@@ -4196,9 +4193,9 @@
break;
}
case NODE_DSYM:{
- compile_dstr(self, iseq, ret, node);
+ compile_dstr(iseq, ret, node);
if(!poped){
- ADD_SEND(ret, nd_line(node), ID2SYM(idIntern), I2F(0));
+ ADD_SEND(ret, nd_line(node), ID2SYM(idIntern), INT2FIX(0));
}
else{
ADD_INSN(ret, nd_line(node), pop);
@@ -4211,11 +4208,11 @@
VALUE argc;
if(node->nd_args){
- compile_array(self, iseq, args, node->nd_args, Qfalse);
+ compile_array(iseq, args, node->nd_args, Qfalse);
argc = OPERAND_AT(POP_ELEMENT(args), 0);
}
else{
- argc = I2F(0); /* massign */
+ argc = INT2FIX(0); /* massign */
}
if(node->nd_recv == (NODE *)1){
@@ -4261,82 +4258,11 @@
return COMPILE_OK;
}
-
/***************************/
/* instruction information */
/***************************/
-#define TS_LONG "L"
-#define TS_OFFSET "L"
-#define TS_ULONG "U"
-#define TS_VALUE "V"
-#define TS_ID "I"
-#define TS_GENTRY "G"
-#define TS_IC "M"
-#define TS_CDHASH "H"
-#define TS_VARIABLE "."
-#define TS_BLOCKISEQ "B"
-
-#include "insns_info.inc"
-
-/* some utility */
-
-#if CPDEBUG > 5
-
-#define INSN_CHECK(insn) \
- if(insn < 0 || \
- insn > sizeof(insn_name_info) / sizeof(insn_name_info[0])){ \
- int *a = 0; *a = 0; \
- rb_bug("(in)unknown instruction: %d", insn); \
- } \
-
-#else
-
-#define INSN_CHECK(insn) /* */
-
-#endif
-
-char *
-insn_name(int insn)
-{
- INSN_CHECK(insn);
- return insn_name_info[insn];
-}
-
-int
-insn_len(int insn)
-{
- INSN_CHECK(insn);
- return insn_len_info[insn];
-}
-
-char *
-insn_op_types(int insn)
-{
- INSN_CHECK(insn);
- return insn_operand_info[insn];
-}
-
-int
-insn_op_type(int insn, int pos)
-{
- int len = insn_len(insn) - 1;
- if(pos < len){
- return insn_operand_info[insn][pos];
- }
- else{
- return TS_LONG[0];
- }
-}
-
static int
-insn_ret_num(int insn)
-{
- INSN_CHECK(insn);
- return insn_stack_push_num_info[insn];
-}
-
-static int
insn_data_length(INSN *insnobj)
{
return insn_len(insnobj->insn_id);
@@ -4354,7 +4280,7 @@
return insn_len(insnobj->line_no);
}
-VALUE
+static VALUE
insn_data_to_s_detail(INSN *insnobj)
{
VALUE str = rb_str_new(0,0);
@@ -4370,7 +4296,7 @@
char type = types[j];
switch(type){
- case 'L': /* label(destination position) */
+ case TS_OFFSET: /* label(destination position) */
{
char buff[0x100];
LABEL *lobj = (LABEL *)OPERAND_AT(insnobj, j);
@@ -4379,24 +4305,24 @@
break;
}
break;
- case 'B': /* block */
- case 'U': /* ulong */
- case 'V': /* VALUE */
+ case TS_BLOCKISEQ: /* block */
+ case TS_NUM: /* ulong */
+ case TS_VALUE: /* VALUE */
rb_str_concat(str, rb_inspect(OPERAND_AT(insnobj, j)));
break;
- case 'I': /* ID */
+ case TS_ID: /* ID */
rb_str_concat(str, rb_inspect(OPERAND_AT(insnobj, j)));
break;
- case 'G':
+ case TS_GENTRY:
{
struct global_entry *entry = (struct global_entry*)
(OPERAND_AT(insnobj, j) & (~1));
rb_str_cat2(str, rb_id2name(entry->id));
}
- case 'M': /* method cache */
+ case TS_IC: /* method cache */
rb_str_cat2(str, "<ic>");
break;
- case 'H': /* case/when condition cache */
+ case TS_CDHASH: /* case/when condition cache */
rb_str_cat2(str, "<ch>");
break;
default:{
@@ -4411,23 +4337,12 @@
return str;
}
-VALUE
-insns_name_array()
-{
- VALUE ary = rb_ary_new();
- int i;
- for(i=0; i< sizeof(insn_name_info) / sizeof(insn_name_info[0]); i++){
- rb_ary_push(ary, rb_str_new2(insn_name_info[i]));
- }
- return ary;
-}
-
-void
+static void
dump_disasm_anchor(LINK_ANCHOR *anc){
dump_disasm_list(FIRST_ELEMENT(anc));
}
-void
+static void
dump_disasm_list(struct iseq_link_element *link)
{
int pos = 0;
@@ -4470,3 +4385,15 @@
{
return nd_line(n);
}
+
+VALUE
+insns_name_array()
+{
+ VALUE ary = rb_ary_new();
+ int i;
+ for(i=0; i< sizeof(insn_name_info) / sizeof(insn_name_info[0]); i++){
+ rb_ary_push(ary, rb_str_new2(insn_name_info[i]));
+ }
+ return ary;
+}
+
Modified: trunk/compile.h
===================================================================
--- trunk/compile.h 2005-12-26 17:08:23 UTC (rev 332)
+++ trunk/compile.h 2005-12-28 01:55:06 UTC (rev 333)
@@ -133,10 +133,10 @@
/* Specific Insn factory */
#define ADD_SEND(seq, line, id, argc) \
- ADD_SEND_R(seq, line, id, argc, (VALUE)Qfalse, (VALUE)I2F(0))
+ ADD_SEND_R(seq, line, id, argc, (VALUE)Qfalse, (VALUE)INT2FIX(0))
#define ADD_CALL(seq, line, id, argc) \
- ADD_SEND_R(seq, line, id, argc, (VALUE)Qfalse, (VALUE)I2F(VM_CALL_FCALL_BIT))
+ ADD_SEND_R(seq, line, id, argc, (VALUE)Qfalse, (VALUE)INT2FIX(VM_CALL_FCALL_BIT))
#define ADD_SEND_R(seq, line, id, argc, block, flag) \
ADD_ELEM(seq, (LINK_ELEMENT *) \
@@ -159,25 +159,23 @@
/* compile node */
#define COMPILE(anchor, desc, node) \
(debug_compile("== " desc "\n", \
- iseq_compile_each(self, anchor, node, 0)))
+ iseq_compile_each(iseq, anchor, node, 0)))
/* compile node, this node's value will be poped */
#define COMPILE_POPED(anchor, desc, node) \
(debug_compile("== " desc "\n", \
- iseq_compile_each(self, anchor, node, 1)))
+ iseq_compile_each(iseq, anchor, node, 1)))
/* compile node, which is poped when 'poped' is true */
#define COMPILE_(anchor, desc, node, poped) \
(debug_compile("== " desc "\n", \
- iseq_compile_each(self, anchor, node, poped)))
+ iseq_compile_each(iseq, anchor, node, poped)))
#define OPERAND_AT(insn, idx) \
(((INSN*)(insn))->operands[idx])
#define INSN_OF(insn) \
(((INSN*)(insn))->insn_id)
-
-#define I2F(x) INT2FIX(x)
/* error */
#define COMPILE_ERROR(strs) \
Modified: trunk/disasm.c
===================================================================
--- trunk/disasm.c 2005-12-26 17:08:23 UTC (rev 332)
+++ trunk/disasm.c 2005-12-28 01:55:06 UTC (rev 333)
@@ -9,11 +9,15 @@
#include <node.h>
#include "yarvcore.h"
+#include "insns.inc"
+#include "insns_info.inc"
/*
now, search algorithm is brute force. but this should be binary search.
*/
-unsigned short find_line_no(yarv_iseq_t *iseqdat, unsigned long pos){
+static unsigned short
+find_line_no(yarv_iseq_t *iseqdat, unsigned long pos)
+{
unsigned long i, size = iseqdat->insn_info_size;
struct insn_info_struct *iiary = iseqdat->insn_info_tbl;
@@ -26,7 +30,9 @@
return 0;
}
-unsigned short find_prev_line_no(yarv_iseq_t *iseqdat, unsigned long pos){
+static unsigned short
+find_prev_line_no(yarv_iseq_t *iseqdat, unsigned long pos)
+{
unsigned long i, size = iseqdat->insn_info_size;
struct insn_info_struct *iiary = iseqdat->insn_info_tbl;
@@ -44,37 +50,60 @@
return 0;
}
-VALUE insn_operand_intern(int insn, int op_no, VALUE op,
- int len, int pos, VALUE child){
+static VALUE
+insn_operand_intern(yarv_iseq_t *iseq,
+ int insn, int op_no, VALUE op,
+ int len, int pos, VALUE *pnop,
+ VALUE child)
+{
char *types = insn_op_types(insn);
char type = types[op_no];
VALUE ret;
char buff[0x100];
switch(type){
- case 'L': /* LONG */
+ case TS_OFFSET: /* LONG */
snprintf(buff, sizeof(buff), "%ld", pos + len + op);
ret = rb_str_new2(buff);
break;
- case 'U': /* ULONG */
+ case TS_NUM: /* ULONG */
snprintf(buff, sizeof(buff), "%lu", op);
ret = rb_str_new2(buff);
break;
-
- case 'I': /* ID (symbol) */
+ case TS_LINDEX:{
+ yarv_iseq_t *ip = iseq->local_iseq;
+ op = ID2SYM(ip->local_tbl[ip->local_size - op + 1]);
+ goto inspect_value;
+ }
+ case TS_DINDEX:{
+ if(insn == BIN(getdynamic) ||
+ insn == BIN(setdynamic)){
+ yarv_iseq_t *ip = iseq;
+ int level = *pnop;
+ int i;
+ for(i=0; i<level; i++){
+ ip = ip->parent_iseq;
+ }
+ op = ID2SYM(ip->local_tbl[ip->local_size - op]);
+ }
+ else{
+ op = INT2FIX(op);
+ }
+ goto inspect_value;
+ }
+ case TS_ID: /* ID (symbol) */
op = ID2SYM(op);
- /* fall through */
-
- case 'V': /* VALUE */
+ goto inspect_value;
+ case TS_VALUE: /* VALUE */
+ inspect_value:
ret = rb_inspect(op);
-
if(child && CLASS_OF(op) == cYarvISeq){
rb_ary_push(child, op);
}
break;
- case 'B': /* block */
+ case TS_BLOCKISEQ: /* block */
{
yarv_iseq_t *block = (yarv_iseq_t *)op;
if(block){
@@ -88,18 +117,18 @@
}
break;
}
- case 'G':
+ case TS_GENTRY:
{
struct global_entry *entry = (struct global_entry*)op;
ret = rb_str_new2(rb_id2name(entry->id));
}
break;
- case 'M':
+ case TS_IC:
ret = rb_str_new2("<ic>");
break;
- case 'H':
+ case TS_CDHASH:
ret = rb_str_new2("<cdhash>");
break;
@@ -109,13 +138,14 @@
return ret;
}
-
/**
* Disassemble a instruction
* Iseq -> Iseq inspect object
*/
-VALUE iseq_disasm_insn(VALUE ret, VALUE *iseq, int pos,
- yarv_iseq_t *iseqdat, VALUE child){
+VALUE
+iseq_disasm_insn(VALUE ret, VALUE *iseq, int pos,
+ yarv_iseq_t *iseqdat, VALUE child)
+{
int insn = iseq[pos];
int len = insn_len(insn);
int i, j;
@@ -139,8 +169,8 @@
for(j=0;types[j]; j++){
char *types = insn_op_types(insn);
- VALUE opstr = insn_operand_intern(insn, j, iseq[pos+j+1],
- len, pos, child);
+ VALUE opstr = insn_operand_intern(iseqdat, insn, j, iseq[pos+j+1],
+ len, pos, &iseq[pos+j+2], child);
rb_str_concat(str, opstr);
GC_CHECK();
@@ -168,7 +198,8 @@
}
static char *
-catch_type(int type){
+catch_type(int type)
+{
switch(type){
case CATCH_TYPE_RESCUE: return "rescue";
case CATCH_TYPE_ENSURE: return "ensure";
@@ -187,7 +218,9 @@
*
* return disassembled string
*/
-VALUE iseq_disasm(VALUE self){
+VALUE
+iseq_disasm(VALUE self)
+{
yarv_iseq_t *iseqdat;
VALUE *iseq;
VALUE str = rb_str_new(0, 0);
@@ -291,7 +324,9 @@
return str;
}
-char* node_name(int node){
+char*
+node_name(int node)
+{
switch(node){
case NODE_METHOD : return "NODE_METHOD";
case NODE_FBODY : return "NODE_FBODY";
Modified: trunk/eval.c
===================================================================
--- trunk/eval.c 2005-12-26 17:08:23 UTC (rev 332)
+++ trunk/eval.c 2005-12-28 01:55:06 UTC (rev 333)
@@ -171,26 +171,24 @@
int ruby_in_eval;
void
-ruby_options(argc, argv)
- int argc;
- char **argv;
+ruby_options(int argc, char **argv)
{
- int state;
+ int state;
- Init_stack((void*)&state);
- PUSH_THREAD_TAG();
- if ((state = EXEC_TAG()) == 0) {
- ruby_process_options(argc, argv);
+ Init_stack((void*)&state);
+ PUSH_THREAD_TAG();
+ if ((state = EXEC_TAG()) == 0) {
+ ruby_process_options(argc, argv);
+ }
+ else {
+ if (state == TAG_THREAD) {
+ rb_thread_start_1();
}
- else {
- if (state == TAG_THREAD) {
- rb_thread_start_1();
- }
- trace_func = 0;
- tracing = 0;
- exit(error_handle(state));
- }
- POP_THREAD_TAG();
+ trace_func = 0;
+ tracing = 0;
+ exit(error_handle(state));
+ }
+ POP_THREAD_TAG();
}
void rb_exec_end_proc _((void));
@@ -217,44 +215,53 @@
}
void
-ruby_finalize()
+ruby_finalize(void)
{
ruby_finalize_0();
ruby_finalize_1();
}
int
-ruby_cleanup(ex)
- int ex;
+ruby_cleanup(int ex)
{
- int state;
- volatile VALUE err = GET_THREAD()->errinfo;
+ int state;
+ volatile VALUE err = GET_THREAD()->errinfo;
+ VALUE st = 0;
+ yarv_vm_t *vm = GET_VM();
- ruby_safe_level = 0;
- Init_stack((void*)&state);
- PUSH_THREAD_TAG();
- if ((state = EXEC_TAG()) == 0) {
- ruby_finalize_0();
- if (GET_THREAD()->errinfo) err = GET_THREAD()->errinfo;
- rb_thread_cleanup();
- rb_thread_wait_other_threads();
+ if (RTEST(err) && rb_obj_is_kind_of(err, rb_eSystemExit)) {
+ vm->exit_code = NUM2INT(rb_iv_get(err, "status"));
+ }
+ else{
+ vm->exit_code = 0;
+ }
+
+ ruby_safe_level = 0;
+ Init_stack((void*)&state);
+ PUSH_THREAD_TAG();
+ if ((state = EXEC_TAG()) == 0) {
+ if (GET_THREAD()->errinfo) {
+ err = GET_THREAD()->errinfo;
}
- else if (state == TAG_THREAD) {
- rb_thread_start_1();
- }
- else if (ex == 0) {
- ex = state;
- }
- GET_THREAD()->errinfo = err;
- ex = error_handle(ex);
- ruby_finalize_1();
- POP_THREAD_TAG();
+ ruby_finalize_0();
+ rb_thread_cleanup();
+ rb_thread_wait_other_threads();
+ }
+ else if (state == TAG_THREAD) {
+ rb_thread_start_1();
+ }
+ else if (ex == 0) {
+ ex = state;
+ }
+ GET_THREAD()->errinfo = err;
+ ex = error_handle(ex);
+ ruby_finalize_1();
+ POP_THREAD_TAG();
- if (err && rb_obj_is_kind_of(err, rb_eSystemExit)) {
- VALUE st = rb_iv_get(err, "status");
- return NUM2INT(st);
- }
- return ex;
+ if(vm->exit_code){
+ return vm->exit_code;
+ }
+ return ex;
}
extern NODE *ruby_eval_tree;
@@ -2002,7 +2009,7 @@
/* replace environment */
cfp->self = self;
if(cbase){
- rb_ary_push(th->klass_nest_stack, cbase);
+ rb_thread_push_cref(th, cbase, NOEX_PUBLIC);
if(!CMETHOD_INFO_P(cfp->iseq) &&
cfp->iseq->klass_nest_stack){
rb_ary_push(cfp->iseq->klass_nest_stack, cbase);
@@ -2018,7 +2025,7 @@
/* restore environment */
cfp->self = stored_self;
if(cbase){
- rb_ary_pop(th->klass_nest_stack);
+ rb_thread_pop_cref(th);
if(!CMETHOD_INFO_P(cfp->iseq) &&
cfp->iseq->klass_nest_stack){
rb_ary_pop(cfp->iseq->klass_nest_stack);
Modified: trunk/eval_error.h
===================================================================
--- trunk/eval_error.h 2005-12-26 17:08:23 UTC (rev 332)
+++ trunk/eval_error.h 2005-12-28 01:55:06 UTC (rev 333)
@@ -191,64 +191,62 @@
VALUE sysstack_error;
static int
-sysexit_status(err)
- VALUE err;
+sysexit_status(VALUE err)
{
- VALUE st = rb_iv_get(err, "status");
- return NUM2INT(st);
+ VALUE st = rb_iv_get(err, "status");
+ return NUM2INT(st);
}
static int
-error_handle(ex)
- int ex;
+error_handle(int ex)
{
- int status = EXIT_FAILURE;
+ int status = EXIT_FAILURE;
- if (thread_set_raised()) return EXIT_FAILURE;
- switch (ex & TAG_MASK) {
- case 0:
- status = EXIT_SUCCESS;
- break;
+ if (thread_set_raised()) return EXIT_FAILURE;
+ switch (ex & TAG_MASK) {
+ case 0:
+ status = EXIT_SUCCESS;
+ break;
- case TAG_RETURN:
- error_pos();
- warn_print(": unexpected return\n");
- break;
- case TAG_NEXT:
- error_pos();
- warn_print(": unexpected next\n");
- break;
- case TAG_BREAK:
- error_pos();
- warn_print(": unexpected break\n");
- break;
- case TAG_REDO:
- error_pos();
- warn_print(": unexpected redo\n");
- break;
- case TAG_RETRY:
- error_pos();
- warn_print(": retry outside of rescue clause\n");
- break;
- case TAG_THROW:
- // TODO: fix me
- error_pos();
- warn_printf(": unexpected throw\n");
- break;
- case TAG_RAISE:
- case TAG_FATAL:
- if (rb_obj_is_kind_of(GET_THREAD()->errinfo, rb_eSystemExit)) {
- status = sysexit_status(GET_THREAD()->errinfo);
- }
- else {
- error_print();
- }
- break;
- default:
- rb_bug("Unknown longjmp status %d", ex);
- break;
+ case TAG_RETURN:
+ error_pos();
+ warn_print(": unexpected return\n");
+ break;
+ case TAG_NEXT:
+ error_pos();
+ warn_print(": unexpected next\n");
+ break;
+ case TAG_BREAK:
+ error_pos();
+ warn_print(": unexpected break\n");
+ break;
+ case TAG_REDO:
+ error_pos();
+ warn_print(": unexpected redo\n");
+ break;
+ case TAG_RETRY:
+ error_pos();
+ warn_print(": retry outside of rescue clause\n");
+ break;
+ case TAG_THROW:
+ // TODO: fix me
+ error_pos();
+ warn_printf(": unexpected throw\n");
+ break;
+ case TAG_RAISE:
+ case TAG_FATAL:
+ if (rb_obj_is_kind_of(GET_THREAD()->errinfo, rb_eSystemExit)) {
+ status = sysexit_status(GET_THREAD()->errinfo);
}
- thread_reset_raised();
- return status;
+ else {
+ error_print();
+ }
+ break;
+ default:
+ rb_bug("Unknown longjmp status %d", ex);
+ break;
+ }
+ thread_reset_raised();
+ return status;
}
Modified: trunk/eval_jump.h
===================================================================
--- trunk/eval_jump.h 2005-12-26 17:08:23 UTC (rev 332)
+++ trunk/eval_jump.h 2005-12-28 01:55:06 UTC (rev 333)
@@ -138,16 +138,16 @@
NORETURN(static VALUE terminate_process _((int, const char *, long)));
static VALUE
-terminate_process(status, mesg, mlen)
- int status;
- const char *mesg;
- long mlen;
+terminate_process(int status, const char *mesg, long mlen)
{
- VALUE args[2];
- args[0] = INT2NUM(status);
- args[1] = rb_str_new(mesg, mlen);
-
- rb_exc_raise(rb_class_new_instance(2, args, rb_eSystemExit));
+ VALUE args[2];
+ yarv_vm_t *vm = GET_VM();
+
+ args[0] = INT2NUM(status);
+ args[1] = rb_str_new(mesg, mlen);
+
+ vm->exit_code = status;
+ rb_exc_raise(rb_class_new_instance(2, args, rb_eSystemExit));
}
Modified: trunk/eval_method.h
===================================================================
--- trunk/eval_method.h 2005-12-26 17:08:23 UTC (rev 332)
+++ trunk/eval_method.h 2005-12-28 01:55:06 UTC (rev 333)
@@ -21,6 +21,8 @@
{
struct cache_entry *ent, *end;
+ rb_vm_change_state();
+
if (!ruby_running) return;
ent = cache; end = ent + CACHE_SIZE;
while (ent < end) {
@@ -34,6 +36,8 @@
{
struct cache_entry *ent, *end;
+ rb_vm_change_state();
+
if (!ruby_running) return;
ent = cache; end = ent + CACHE_SIZE;
while (ent < end) {
@@ -49,6 +53,8 @@
{
struct cache_entry *ent, *end;
+ rb_vm_change_state();
+
if (!ruby_running) return;
ent = cache; end = ent + CACHE_SIZE;
while (ent < end) {
@@ -64,6 +70,8 @@
{
struct cache_entry *ent, *end;
+ rb_vm_change_state();
+
if (!ruby_running) return;
ent = cache; end = ent + CACHE_SIZE;
while (ent < end) {
@@ -258,11 +266,9 @@
}
void
-rb_remove_method(klass, name)
- VALUE klass;
- const char *name;
+rb_remove_method(VALUE klass, const char *name)
{
- remove_method(klass, rb_intern(name));
+ remove_method(klass, rb_intern(name));
}
/*
Modified: trunk/insns.def
===================================================================
--- trunk/insns.def 2005-12-26 17:08:23 UTC (rev 332)
+++ trunk/insns.def 2005-12-28 01:55:06 UTC (rev 333)
@@ -50,7 +50,7 @@
*/
DEFINE_INSN
getlocal
-(ulong idx)
+(lindex_t idx)
()
(VALUE val)
{
@@ -64,7 +64,7 @@
*/
DEFINE_INSN
setlocal
-(ulong idx)
+(lindex_t idx)
(VALUE val)
()
{
@@ -78,7 +78,7 @@
*/
DEFINE_INSN
getspecial
-(ulong idx, ulong type)
+(num_t idx, num_t type)
()
(VALUE val)
{
@@ -137,7 +137,7 @@
*/
DEFINE_INSN
setspecial
-(ulong idx, ulong type)
+(num_t idx, num_t type)
(VALUE obj)
()
{
@@ -169,7 +169,7 @@
*/
DEFINE_INSN
getdynamic
-(ulong idx, ulong level)
+(dindex_t idx, num_t level)
()
(VALUE val)
{
@@ -190,7 +190,7 @@
*/
DEFINE_INSN
setdynamic
-(ulong idx, ulong level)
+(dindex_t idx, num_t level)
(VALUE val)
()
{
@@ -426,7 +426,7 @@
*/
DEFINE_INSN
concatstrings
-(ulong num)
+(num_t num)
(...)
(VALUE val) // inc += 1 - num;
{
@@ -462,7 +462,7 @@
*/
DEFINE_INSN
toregexp
-(ulong flag)
+(num_t flag)
(VALUE str)
(VALUE val)
{
@@ -476,7 +476,7 @@
*/
DEFINE_INSN
newarray
-(ulong num)
+(num_t num)
(...)
(VALUE val) // inc += 1 - num;
{
@@ -509,7 +509,7 @@
*/
DEFINE_INSN
expandarray
-(ulong num, ulong flag)
+(num_t num, num_t flag)
(..., VALUE ary)
(...) // inc += (num > 0) ? num - 1 + (flag ? 1 : 0) : num + 1 - (flag ? 1 : 0);
{
@@ -670,7 +670,7 @@
*/
DEFINE_INSN
newhash
-(ulong num)
+(num_t num)
(...)
(VALUE val) // inc += 1 - num;
{
@@ -693,7 +693,7 @@
*/
DEFINE_INSN
newrange
-(ulong flag)
+(num_t flag)
(VALUE low, VALUE high)
(VALUE val)
{
@@ -759,7 +759,7 @@
*/
DEFINE_INSN
dupn
-(ulong n)
+(num_t n)
(...)
(...) // inc += n;
{
@@ -809,7 +809,7 @@
*/
DEFINE_INSN
topn
-(ulong n)
+(num_t n)
(...)
(VALUE val) // inc += 1;
{
@@ -855,7 +855,6 @@
/* dup */
GetISeqVal(body, miseq);
rb_ary_replace(miseq->klass_nest_stack, th->klass_nest_stack);
-
miseq->klass = rb_ary_entry(th->klass_nest_stack, -1);
/* make new node */
@@ -987,7 +986,7 @@
*/
DEFINE_INSN
defined
-(ulong type, VALUE obj, VALUE needstr)
+(num_t type, VALUE obj, VALUE needstr)
(VALUE v)
(VALUE val)
{
@@ -1073,7 +1072,7 @@
*/
DEFINE_INSN
trace
-(ulong flag, VALUE args)
+(num_t flag, VALUE args)
()
()
{
@@ -1144,7 +1143,7 @@
klass_iseq->local_size, 0, 0);
RESTORE_REGS();
/* others */
- eval_push_cref(th, klass, NOEX_PUBLIC);
+ rb_thread_push_cref(th, klass, NOEX_PUBLIC);
INC_VM_STATE_VERSION();
NEXT_INSN();
@@ -1176,7 +1175,7 @@
klass_iseq->local_size, 0, 0);
RESTORE_REGS();
/* others */
- eval_push_cref(th, klass, NOEX_PUBLIC);
+ rb_thread_push_cref(th, klass, NOEX_PUBLIC);
INC_VM_STATE_VERSION();
NEXT_INSN();
@@ -1225,7 +1224,7 @@
RESTORE_REGS();
/* others */
- eval_push_cref(th, module, NOEX_PUBLIC);
+ rb_thread_push_cref(th, module, NOEX_PUBLIC);
INC_VM_STATE_VERSION();
NEXT_INSN();
@@ -1242,7 +1241,7 @@
()
()
{
- eval_pop_cref(th);
+ rb_thread_pop_cref(th);
}
@@ -1261,7 +1260,7 @@
*/
DEFINE_INSN
send
-(ID id, ulong op_argc, BLOCKISEQ blockiseq, ulong flag, IC ic)
+(ID id, num_t op_argc, BLOCKISEQ blockiseq, num_t flag, IC ic)
(...)
(VALUE val) // inc += - op_argc;
{
@@ -1269,7 +1268,7 @@
VALUE recv;
VALUE klass;
yarv_block_t *blockptr = 0;
- ulong num = op_argc;
+ num_t num = op_argc;
macro_eval_setup_send_arguments(num, blockptr, flag, blockiseq);
recv = TOPN(num);
@@ -1313,11 +1312,32 @@
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(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]);
+ }
+ }
}
else{
id = rb_to_id(ip->name);
@@ -1340,7 +1360,7 @@
*/
DEFINE_INSN
super
-(ulong op_argc, BLOCKISEQ blockiseq, ulong flag)
+(num_t op_argc, BLOCKISEQ blockiseq, num_t flag)
(...)
(VALUE val) // inc += - op_argc;
{
@@ -1366,7 +1386,7 @@
*/
DEFINE_INSN
yield
-(ulong num, ulong flag)
+(num_t num, num_t flag)
(...)
(VALUE val) // inc += 1 - num;
{
@@ -1525,13 +1545,13 @@
*/
DEFINE_INSN
throw
-(ulong throw_state)
+(num_t throw_state)
(VALUE throwobj)
()
{
- ulong state = throw_state & 0xff;
- ulong flag = throw_state & 0x8000;
- ulong level = throw_state >> 16;
+ num_t state = throw_state & 0xff;
+ num_t flag = throw_state & 0x8000;
+ num_t level = throw_state >> 16;
if(state != 0){
VALUE *pt;
Modified: trunk/rb/allload.rb
===================================================================
--- trunk/rb/allload.rb 2005-12-26 17:08:23 UTC (rev 332)
+++ trunk/rb/allload.rb 2005-12-28 01:55:06 UTC (rev 333)
@@ -1,5 +1,7 @@
ignores = %w(/dl/import.rb)
+# $DEBUG = true
+
module Enumerable
def all?
self.each{|e|
@@ -12,12 +14,13 @@
ARGV.each{|dir|
dir = File.expand_path(dir)
Dir.glob(File.join(dir, '**/*.rb')){|file|
- p file
+ p file if $DEBUG
if ignores.all?{|e|
r = Regexp.compile(Regexp.escape(e))
r !~ file
}
- YARVCore::parse(File.read(file), file, 1)
+ parsed = YARVCore::parse(File.read(file), file, 1)
+ puts parsed.disasm if $DEBUG
else
puts "ignore: #{file}"
end
Modified: trunk/rb/insns2vm.rb
===================================================================
--- trunk/rb/insns2vm.rb 2005-12-26 17:08:23 UTC (rev 332)
+++ trunk/rb/insns2vm.rb 2005-12-28 01:55:06 UTC (rev 333)
@@ -72,12 +72,12 @@
ret = "int inc = 0;\n"
@opes.each_with_index{|(t, v), i|
- if t == 'ulong'
+ if t == 'num_t'
ret << " unsigned long #{v} = FIX2INT(opes[#{i}]);\n"
end
}
@defopes.each_with_index{|((t, var), val), i|
- if t == 'ulong' && val != '*'
+ if t == 'num_t' && val != '*'
ret << " unsigned long #{var} = #{val};\n"
end
}
@@ -801,8 +801,12 @@
case op
when /^OFFSET/
"TS_OFFSET"
- when /^ulong/
- "TS_ULONG"
+ when /^num_t/
+ "TS_NUM"
+ when /^lindex_t/
+ "TS_LINDEX"
+ when /^dindex_t/
+ "TS_DINDEX"
when /^VALUE/
"TS_VALUE"
when /^ID/
@@ -822,8 +826,27 @@
end
end
+ TYPE_CHARS = {
+ 'TS_OFFSET' => 'O',
+ 'TS_NUM' => 'N',
+ 'TS_LINDEX' => 'L',
+ 'TS_DINDEX' => 'D',
+ 'TS_VALUE' => 'V',
+ 'TS_ID' => 'I',
+ 'TS_GENTRY' => 'G',
+ 'TS_IC' => 'C',
+ 'TS_CDHASH' => 'H',
+ 'TS_BLOCKISEQ' => 'B',
+ 'TS_VARIABLE' => '.',
+ }
+
# insns_info.inc
def insns_info_inc
+ # insn_type_chars
+ insn_type_chars = TYPE_CHARS.map{|t, c|
+ "#define #{t} '#{c}'"
+ }.join("\n")
+
# insn_names
insn_names = ''
@insns.each{|insn|
@@ -836,14 +859,10 @@
@insns.each{|insn|
opes = insn.opes
operands_info << ' '
- if opes.size == 0
- operands_info << '"",' + "\n"
- else
- opes.each{|type, var|
- operands_info << (op2typesig(type) + ' ')
- }
- operands_info << ",\n"
- end
+ ot = opes.map{|type, var|
+ TYPE_CHARS.fetch(op2typesig(type))
+ }
+ operands_info << "\"#{ot.join}\"" << ", \n"
num = opes.size + 1
operands_num_info << " #{num},\n"
@@ -903,10 +922,8 @@
val = op[1]
case type
- when /^long/
+ when /^long/, /^num_t/, /^lindex_t/, /^dindex_t/
"INT2FIX(#{val})"
- when /^ulong/
- "INT2FIX(#{val})"
when /^VALUE/
val
when /^ID/
@@ -920,7 +937,6 @@
else
raise "type: #{type}"
end
-
end
# optinsn.inc
Modified: trunk/template/insns.inc.tmpl
===================================================================
--- trunk/template/insns.inc.tmpl 2005-12-26 17:08:23 UTC (rev 332)
+++ trunk/template/insns.inc.tmpl 2005-12-28 01:55:06 UTC (rev 333)
@@ -5,7 +5,7 @@
This file is auto generated by insns2vm.rb
DO NOT TOUCH!
- If you want to fix something, you must edit 'tmpl/insns.inc.tmpl'
+ If you want to fix something, you must edit 'template/insns.inc.tmpl'
or insns2vm.rb
*/
Modified: trunk/template/insns_info.inc.tmpl
===================================================================
--- trunk/template/insns_info.inc.tmpl 2005-12-26 17:08:23 UTC (rev 332)
+++ trunk/template/insns_info.inc.tmpl 2005-12-28 01:55:06 UTC (rev 333)
@@ -5,10 +5,12 @@
This file is auto generated by insns2vm.rb
DO NOT TOUCH!
- If you want to fix something, you must edit 'tmpl/insns_info.inc.tmpl'
+ If you want to fix something, you must edit 'template/insns_info.inc.tmpl'
or insns2vm.rb
*/
+<%= insn_type_chars %>
+
static char *insn_name_info[] = {
<%= insn_names %>
};
@@ -36,3 +38,40 @@
return 0;
}
+/* some utilities */
+
+static int
+insn_len(int insn)
+{
+ return insn_len_info[insn];
+}
+
+static char *
+insn_name(int insn)
+{
+ return insn_name_info[insn];
+}
+
+static char *
+insn_op_types(int insn)
+{
+ return insn_operand_info[insn];
+}
+
+static int
+insn_op_type(int insn, int pos)
+{
+ int len = insn_len(insn) - 1;
+ if(pos < len){
+ return insn_operand_info[insn][pos];
+ }
+ else{
+ return 0;
+ }
+}
+
+static int
+insn_ret_num(int insn)
+{
+ return insn_stack_push_num_info[insn];
+}
Modified: trunk/template/minsns.inc.tmpl
===================================================================
--- trunk/template/minsns.inc.tmpl 2005-12-26 17:08:23 UTC (rev 332)
+++ trunk/template/minsns.inc.tmpl 2005-12-28 01:55:06 UTC (rev 333)
@@ -5,7 +5,7 @@
This file is auto generated by insns2vm.rb
DO NOT TOUCH!
- If you want to fix something, you must edit 'tmpl/minsns.inc.tmpl'
+ If you want to fix something, you must edit 'template/minsns.inc.tmpl'
or insns2vm.rb
*/
Modified: trunk/template/opt_sc.inc.tmpl
===================================================================
--- trunk/template/opt_sc.inc.tmpl 2005-12-26 17:08:23 UTC (rev 332)
+++ trunk/template/opt_sc.inc.tmpl 2005-12-28 01:55:06 UTC (rev 333)
@@ -8,7 +8,7 @@
This file is auto generated by insns2vm.rb
DO NOT TOUCH!
- If you want to fix something, you must edit 'tmpl/opt_sc.inc.tmpl'
+ If you want to fix something, you must edit 'template/opt_sc.inc.tmpl'
or rb/insns2vm.rb
*/
Modified: trunk/template/optinsn.inc.tmpl
===================================================================
--- trunk/template/optinsn.inc.tmpl 2005-12-26 17:08:23 UTC (rev 332)
+++ trunk/template/optinsn.inc.tmpl 2005-12-28 01:55:06 UTC (rev 333)
@@ -8,7 +8,7 @@
This file is auto generated by insns2vm.rb
DO NOT TOUCH!
- If you want to fix something, you must edit 'tmpl/optinsn.inc.tmpl'
+ If you want to fix something, you must edit 'template/optinsn.inc.tmpl'
or rb/insns2vm.rb
*/
Modified: trunk/template/optunifs.inc.tmpl
===================================================================
--- trunk/template/optunifs.inc.tmpl 2005-12-26 17:08:23 UTC (rev 332)
+++ trunk/template/optunifs.inc.tmpl 2005-12-28 01:55:06 UTC (rev 333)
@@ -8,7 +8,7 @@
This file is auto generated by insns2vm.rb
DO NOT TOUCH!
- If you want to fix something, you must edit 'tmpl/optunifs.inc.tmpl'
+ If you want to fix something, you must edit 'template/optunifs.inc.tmpl'
or rb/insns2vm.rb
*/
Modified: trunk/template/vmtc.inc.tmpl
===================================================================
--- trunk/template/vmtc.inc.tmpl 2005-12-26 17:08:23 UTC (rev 332)
+++ trunk/template/vmtc.inc.tmpl 2005-12-28 01:55:06 UTC (rev 333)
@@ -8,7 +8,7 @@
This file is auto generated by insns2vm.rb
DO NOT TOUCH!
- If you want to fix something, you must edit 'tmpl/vmtc.inc.tmpl'
+ If you want to fix something, you must edit 'template/vmtc.inc.tmpl'
or insns2vm.rb
*/
Modified: trunk/test.rb
===================================================================
--- trunk/test.rb 2005-12-26 17:08:23 UTC (rev 332)
+++ trunk/test.rb 2005-12-28 01:55:06 UTC (rev 333)
@@ -1,3 +1,113 @@
+
+at_exit{
+ break
+}
+
+__END__
+
+Const = :top
+C = Class.new{
+ def m
+ p "C#m"
+ end
+}
+
+p C.instance_methods(false)
+C.new.m
+
+__END__
+
+class C
+ a = 10
+ 1.times{
+ a = 10
+ b = 20
+ }
+end
+__END__
+
+def m a
+ 1.times{
+ b = 1
+ a = 20
+ }
+end
+
+
+__END__
+
+def m
+ p :m
+end
+
+2.times{
+ m()
+ Object.class_eval{
+ p self
+ remove_method :m
+ }
+}
+__END__
+class A
+ C = "BAD"
+ class B
+ def self.c
+ C
+ end
+ end
+end
+
+A::B.c # cache
+A::B.const_set :C, "OK"
+p A::B.c
+
+__END__
+p [0][*0]
+
+__END__
+
+def m *args
+ args
+end
+
+m(*1)
+__END__
+
+class C
+ def m *args
+ "C#m(#{args.join(',')})"
+ end
+ def b
+ class << self
+ define_method(:m){|a, b|
+ 1.times{
+ p super
+ }
+ }
+ end
+ self
+ end
+ end
+ C.new.b.m(:ok1, :ok2)
+
+__END__
+
+class X
+ def a
+ end
+ def b
+ class << self
+ define_method(:a) {
+ super
+ }
+ end
+ end
+end
+
+x = X.new
+x.b
+x.a
+__END__
class Module
public :remove_const
end
Modified: trunk/variable.c
===================================================================
--- trunk/variable.c 2005-12-26 17:08:23 UTC (rev 332)
+++ trunk/variable.c 2005-12-28 01:55:06 UTC (rev 333)
@@ -1480,33 +1480,36 @@
static void
mod_av_set(VALUE klass, ID id, VALUE val, int isconst)
{
- char *dest = isconst ? "constant" : "class variable";
+ char *dest = isconst ? "constant" : "class variable";
- if (!OBJ_TAINTED(klass) && rb_safe_level() >= 4)
- rb_raise(rb_eSecurityError, "Insecure: can't set %s", dest);
- if (OBJ_FROZEN(klass)) {
- if (BUILTIN_TYPE(klass) == T_MODULE) {
- rb_error_frozen("module");
- }
- else {
- rb_error_frozen("class");
- }
+ if (!OBJ_TAINTED(klass) && rb_safe_level() >= 4)
+ rb_raise(rb_eSecurityError, "Insecure: can't set %s", dest);
+ if (OBJ_FROZEN(klass)) {
+ if (BUILTIN_TYPE(klass) == T_MODULE) {
+ rb_error_frozen("module");
}
- if (!RCLASS(klass)->iv_tbl) {
- RCLASS(klass)->iv_tbl = st_init_numtable();
+ else {
+ rb_error_frozen("class");
}
- else if (isconst) {
- VALUE value = Qfalse;
+ }
+ if (!RCLASS(klass)->iv_tbl) {
+ RCLASS(klass)->iv_tbl = st_init_numtable();
+ }
+ else if (isconst) {
+ VALUE value = Qfalse;
- if (st_lookup(RCLASS(klass)->iv_tbl, id, &value)) {
- if (value == Qundef)
- autoload_delete(klass, id);
- else
- rb_warn("already initialized %s %s", dest, rb_id2name(id));
- }
+ if (st_lookup(RCLASS(klass)->iv_tbl, id, &value)) {
+ if (value == Qundef)
+ autoload_delete(klass, id);
+ else
+ rb_warn("already initialized %s %s", dest, rb_id2name(id));
}
+ }
- st_insert(RCLASS(klass)->iv_tbl, id, val);
+ if(isconst){
+ rb_vm_change_state();
+ }
+ st_insert(RCLASS(klass)->iv_tbl, id, val);
}
void
Modified: trunk/vm.c
===================================================================
--- trunk/vm.c 2005-12-26 17:08:23 UTC (rev 332)
+++ trunk/vm.c 2005-12-28 01:55:06 UTC (rev 333)
@@ -15,11 +15,11 @@
#define EVALBODY_HELPER_FUNCTION static inline
-#ifndef HAVE_TYPE_ULONG
-typedef unsigned long ulong;
-#endif
+typedef unsigned long num_t;
+typedef unsigned long lindex_t;
+typedef unsigned long dindex_t;
-typedef ulong GENTRY;
+typedef num_t GENTRY;
void vm_analysis_operand(int insn, int n, VALUE op);
void vm_analysis_register(int reg, int isset);
@@ -960,15 +960,15 @@
return mn;
}
-EVALBODY_HELPER_FUNCTION VALUE
-eval_push_cref(yarv_thread_t *th, VALUE klass, int noex)
+void
+rb_thread_push_cref(yarv_thread_t *th, VALUE klass, int noex)
{
rb_ary_push(th->klass_nest_stack, klass);
rb_ary_push(th->visibility_nest_stack, INT2FIX(noex));
}
-EVALBODY_HELPER_FUNCTION VALUE
-eval_pop_cref(yarv_thread_t *th)
+void
+rb_thread_pop_cref(yarv_thread_t *th)
{
rb_ary_pop(th->klass_nest_stack);
rb_ary_pop(th->visibility_nest_stack);
@@ -1161,7 +1161,7 @@
else{
int i;
struct catch_table_entry *entry;
- ulong epc, cont_pc, cont_sp;
+ unsigned long epc, cont_pc, cont_sp;
VALUE catch_iseqval;
yarv_control_frame_t *cfp;
VALUE *escape_dfp;
@@ -1336,7 +1336,7 @@
else{
/* pop cref */
if(cfp->iseq->type == ISEQ_TYPE_CLASS){
- eval_pop_cref(th);
+ rb_thread_pop_cref(th);
}
th->cfp++;
Modified: trunk/vm_evalbody.h
===================================================================
--- trunk/vm_evalbody.h 2005-12-26 17:08:23 UTC (rev 332)
+++ trunk/vm_evalbody.h 2005-12-28 01:55:06 UTC (rev 333)
@@ -68,7 +68,7 @@
ID tmp_id;
yarv_block_t *tmp_blockptr;
- ulong tmp_num;
+ num_t tmp_num;
#if OPT_TOKEN_THREADED_CODE || OPT_DIRECT_THREADED_CODE
#include "vmtc.inc"
Modified: trunk/vm_macro.def
===================================================================
--- trunk/vm_macro.def 2005-12-26 17:08:23 UTC (rev 332)
+++ trunk/vm_macro.def 2005-12-28 01:55:06 UTC (rev 333)
@@ -32,8 +32,9 @@
/* expand top of stack? */
if(flag & VM_CALL_ARGS_SPLAT_BIT){
VALUE ary = TOPN(0);
- if(BUILTIN_TYPE(ary) != T_ARRAY){
- /* not a [BUG] */
+ if(SPECIAL_CONST_P(ary) || BUILTIN_TYPE(ary) != T_ARRAY){
+ /* not a BUG */
+ /* TODO: check specification */
}
else{
VALUE *ptr = RARRAY(ary)->ptr;
@@ -81,7 +82,7 @@
if(niseq->arg_simple){
if(niseq->argc != num){
rb_raise(rb_eArgError, "wrong number of arguments (%lu for %d)",
- (ulong)num, niseq->argc);
+ (unsigned long)num, niseq->argc);
}
}
else{
@@ -93,15 +94,15 @@
(niseq->arg_rest == 0 && num > iseq_argc + opts)){
if(0){
printf("num: %lu, iseq_argc: %d, opts: %d\n",
- (ulong)num, iseq_argc, opts);
+ (unsigned long)num, iseq_argc, opts);
}
rb_raise(rb_eArgError, "wrong number of arguments (%lu for %d)",
- (ulong)num, iseq_argc);
+ (unsigned long)num, iseq_argc);
}
if(0){
printf("num: %lu, opts: %d, iseq_argc: %d\n",
- (ulong)num, opts, iseq_argc);
+ (unsigned long)num, opts, iseq_argc);
}
if(num - iseq_argc < opts){
opt_pc = niseq->arg_opt_tbl[num - iseq_argc];
@@ -127,11 +128,12 @@
int rest = niseq->arg_rest - 1;
int pack_size = num - rest;
if(0){
- printf("num: %lu, rest: %d, ps: %d\n", (ulong)num, niseq->arg_rest, pack_size);
+ printf("num: %lu, rest: %d, ps: %d\n",
+ (unsigned long)num, niseq->arg_rest, pack_size);
}
if(pack_size < 0){
rb_raise(rb_eArgError, "wrong number of arguments (%lu for %d)",
- (ulong)num, rest - niseq->arg_opts);
+ (unsigned long)num, rest - niseq->arg_opts);
}
/*
@@ -152,7 +154,7 @@
(niseq->arg_opts && num == niseq->argc + niseq->arg_opts - 1) ||
num == niseq->argc)){
rb_raise(rb_eArgError, "wrong number of arguments (%lu for %d)",
- (ulong)num, niseq->argc);
+ (unsigned long)num, niseq->argc);
}
if(blockptr){
@@ -229,7 +231,7 @@
else{
if(proc->block.iseq->argc != num){
rb_raise(rb_eArgError, "wrong number of arguments (%lu for %d)",
- (ulong)num, proc->block.iseq->argc);
+ (unsigned long)num, proc->block.iseq->argc);
}
th_set_env(th, proc->block.iseq,
FRAME_MAGIC_PROC, recv, (VALUE)proc->block.dfp,
Modified: trunk/yarvcore.c
===================================================================
--- trunk/yarvcore.c 2005-12-26 17:08:23 UTC (rev 332)
+++ trunk/yarvcore.c 2005-12-28 01:55:06 UTC (rev 333)
@@ -488,8 +488,9 @@
iseq->compile_data = 0;
if(ruby_nerrs > 0){
+ VALUE str = rb_str_buf_new2("compile error");
ruby_nerrs = 0;
- rb_exc_raise(err);
+ rb_exc_raise(rb_exc_new3(rb_eSyntaxError, str));
}
return Qtrue;
}
Modified: trunk/yarvcore.h
===================================================================
--- trunk/yarvcore.h 2005-12-26 17:08:23 UTC (rev 332)
+++ trunk/yarvcore.h 2005-12-28 01:55:06 UTC (rev 333)
@@ -288,9 +288,10 @@
unsigned long thread_critical;
VALUE main_thread;
st_table *living_threads;
+
+ int exit_code;
unsigned long interrupt_flag;
-
unsigned long trace_flag;
} yarv_vm_t;
@@ -405,13 +406,6 @@
char* node_name(int node);
-/* insns_info.c */
-char *insn_name(int insn);
-int insn_len(int insn);
-char *insn_op_types(int insn);
-int insn_op_type(int insn, int pos);
-
-
/* each thread has this size stack : 2MB */
#define YARV_THREAD_STACK_SIZE (128 * 1024)
@@ -509,6 +503,12 @@
#define SDR() vm_stack_dump_raw(GET_THREAD(), GET_THREAD()->cfp)
#define SDR2(cfp) vm_stack_dump_raw(GET_THREAD(), (cfp))
+
+void rb_thread_push_cref(yarv_thread_t *th, VALUE klass, int noex);
+void rb_thread_pop_cref(yarv_thread_t *th);
+
+/* for thread */
+
#include "yarv.h"
#define GVL_LOCK_BEGIN() do { \
@@ -558,8 +558,6 @@
YARV_CHECK_INTS_TH(GET_THREAD())
-
-
#endif // _YARVCORE_H_INCLUDED_
Modified: trunk/yarvtest/test_class.rb
===================================================================
--- trunk/yarvtest/test_class.rb 2005-12-26 17:08:23 UTC (rev 332)
+++ trunk/yarvtest/test_class.rb 2005-12-28 01:55:06 UTC (rev 333)
@@ -216,7 +216,7 @@
}
end
- def test_super_from_define_method
+ def test_zsuper_from_define_method
ae %q{
class C
def a
@@ -258,6 +258,42 @@
x.b
x.a
}
+ ae %q{
+ class C
+ def m arg
+ "C#m(#{arg})"
+ end
+ def b
+ class << self
+ define_method(:m){|a|
+ super
+ }
+ end
+ self
+ end
+ end
+ C.new.b.m(:ok)
+ }
+ ae %q{
+ class C
+ def m *args
+ "C#m(#{args.join(', ')})"
+ end
+ def b
+ class << self
+ define_method(:m){|a, b|
+ r = nil
+ 1.times{
+ r = super
+ }
+ r
+ }
+ end
+ self
+ end
+ end
+ C.new.b.m(:ok1, :ok2)
+ } if false # ruby 1.9 dumped core
end
def test_zsuper
Modified: trunk/yarvtest/test_method.rb
===================================================================
--- trunk/yarvtest/test_method.rb 2005-12-26 17:08:23 UTC (rev 332)
+++ trunk/yarvtest/test_method.rb 2005-12-28 01:55:06 UTC (rev 333)
@@ -48,30 +48,22 @@
end
def test_splat
- if false
- # error
- ae %q{
- def m a
- a
- end
-
- m(*1)
- }
- end
-
ae %q{
+ def m a
+ a
+ end
+ m(*1)
+ } if false # ruby HEAD cause TypeError
+ ae %q{
def m a, b
[a, b]
end
-
m(*[1,2])
}
-
ae %q{
def m a, b, c
[a, b, c]
end
-
m(1, *[2, 3])
}
--
ML: yarv-diff quickml.atdot.net
Info: http://www.atdot.net/~ko1/quickml