yarv-diff:140
From: ko1 atdot.net
Date: 29 Nov 2005 04:26:16 -0000
Subject: [yarv-diff:140] r299 - in trunk: . rb
Author: ko1
Date: 2005-11-29 13:26:15 +0900 (Tue, 29 Nov 2005)
New Revision: 299
Modified:
trunk/ChangeLog
trunk/compile.c
trunk/compile.h
trunk/disasm.c
trunk/gc.c
trunk/insns.def
trunk/rb/insns2vm.rb
trunk/test.rb
trunk/vm.c
trunk/vm_evalbody.h
trunk/vm_macro.def
trunk/yarvcore.c
trunk/yarvcore.h
Log:
* compile.c : add iseq_add_mark_object, iseq_add_mark_object_compile_time
and use it to mark objects on iseq
* compile.h, compile.c : remove cast on NEW_CHILD_ISEQVAL, NEW_ISEQVAL
and interface
* compile.c, disasm.c, insns.def, vm_macro.def, rb/insns2vm.rb :
add BLOCKISEQ parameter type
* gc.c : fix garbage_collect to return true if only allocate memory
* vm.c : fix insertion order of proc/env
* vm_evalbody.h : add typedef yarv_iseq_t *BLOCKISEQ
* yarvcore.c, yarvcore.c : add idTimes
* yarvcore.c : fix proc_mark, env_mark around iseq mark
Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog 2005-11-28 00:10:29 UTC (rev 298)
+++ trunk/ChangeLog 2005-11-29 04:26:15 UTC (rev 299)
@@ -4,6 +4,28 @@
# from Mon, 03 May 2004 01:24:19 +0900
#
+2005-11-29(Tue) 13:18:06 +0900 Koichi Sasada <ko1 atdot.net>
+
+ * compile.c : add iseq_add_mark_object, iseq_add_mark_object_compile_time
+ and use it to mark objects on iseq
+
+ * compile.h, compile.c : remove cast on NEW_CHILD_ISEQVAL, NEW_ISEQVAL
+ and interface
+
+ * compile.c, disasm.c, insns.def, vm_macro.def, rb/insns2vm.rb :
+ add BLOCKISEQ parameter type
+
+ * gc.c : fix garbage_collect to return true if only allocate memory
+
+ * vm.c : fix insertion order of proc/env
+
+ * vm_evalbody.h : add typedef yarv_iseq_t *BLOCKISEQ
+
+ * yarvcore.c, yarvcore.c : add idTimes
+
+ * yarvcore.c : fix proc_mark, env_mark around iseq mark
+
+
2005-11-28(Mon) 09:02:57 +0900 Koichi Sasada <ko1 atdot.net>
* compile.c, insns.def, vm_evalbody.h : support super
Modified: trunk/compile.c
===================================================================
--- trunk/compile.c 2005-11-28 00:10:29 UTC (rev 298)
+++ trunk/compile.c 2005-11-29 04:26:15 UTC (rev 299)
@@ -95,6 +95,18 @@
static int set_exception_tbl(yarv_iseq_t *iseq);
static int set_optargs_table(yarv_iseq_t *iseq);
+static int
+iseq_add_mark_object(yarv_iseq_t *iseq, VALUE v){
+ rb_ary_push(iseq->iseq_mark_ary, v);
+ return COMPILE_OK;
+}
+
+static int
+iseq_add_mark_object_compile_time(yarv_iseq_t *iseq, VALUE v){
+ rb_ary_push(iseq->compile_data->mark_ary, v);
+ return COMPILE_OK;
+}
+
#include "optinsn.inc"
#include "optunifs.inc"
@@ -102,12 +114,13 @@
#define MREWIND_DSIZE() 2
-VALUE iseq_compile(VALUE self, VALUE narg){
+VALUE
+iseq_compile(VALUE self, VALUE narg)
+{
DECL_ANCHOR(list_anchor);
yarv_iseq_t *iseq;
NODE *node = (NODE*)narg;
-
debugs("[compile step 1 (traverse each node)]\n");
GetISeqVal(self, iseq);
@@ -694,7 +707,7 @@
ret = rb_class_new_instance(5, args, cYarvISeq);
debugs("[new_child_iseq]< ---------------------------------------\n");
- rb_ary_push(iseq->compile_data->mark_ary, ret);
+ iseq_add_mark_object(iseq, ret);
return ret;
}
@@ -1260,12 +1273,22 @@
INT2FIX(lobj->position - (pos + len)));
}
generated_iseq[pos+1+j] = map;
- rb_ary_push(iseq->iseq_mark_ary, map);
+ iseq_add_mark_object(iseq, map);
break;
}
case 'U': /* ulong */
generated_iseq[pos+1+j] = FIX2INT(operands[j]);
break;
+ case 'B': /* BLOCK */
+ {
+ VALUE v = operands[j];
+ yarv_iseq_t *block = 0;
+ if(v){
+ GetISeqVal(v, block);
+ }
+ generated_iseq[pos+1+j] = (VALUE)block;
+ break;
+ }
case 'V': /* VALUE */
case 'C': /* class path */
{
@@ -1273,15 +1296,15 @@
generated_iseq[pos+1+j] = v;
/* to mark ruby object */
if(!SPECIAL_CONST_P(v)){
- rb_ary_push(iseq->iseq_mark_ary, v);
+ iseq_add_mark_object(iseq, v);
}
+ break;
}
- break;
case 'M': /* inline cache */
{
VALUE v = (VALUE)NEW_INLINE_CACHE_ENTRY();
generated_iseq[pos+1+j] = v;
- rb_ary_push(iseq->iseq_mark_ary, v);
+ iseq_add_mark_object(iseq, v);
break;
}
case 'I': /* ID */
@@ -1350,7 +1373,7 @@
entry->iseq = ptr[3];
if(entry->iseq != 0){
- rb_ary_push(iseq->iseq_mark_ary, entry->iseq);
+ iseq_add_mark_object(iseq, entry->iseq);
}
entry->sp = FIX2INT(ptr[4]);
@@ -1890,7 +1913,7 @@
node = node->nd_next;
}
- rb_ary_push(iseq->compile_data->mark_ary, ary);
+ iseq_add_mark_object_compile_time(iseq, ary);
ADD_INSN1(ret, nd_line(node_root), duparray, ary);
}
else{
@@ -2216,7 +2239,7 @@
if(needstr != Qfalse){
VALUE str = rb_str_new2(estr);
ADD_INSN1(ret, nd_line(node), putstring, str);
- rb_ary_push(iseq->compile_data->mark_ary, str);
+ iseq_add_mark_object_compile_time(iseq, str);
}
else{
ADD_INSN1(ret, nd_line(node), putobject, Qtrue);
@@ -2466,7 +2489,7 @@
ADD_INSN (ret, nd_line(tempnode), dup);
ADD_INSN2(ret, nd_line(tempnode), opt_case_dispatch,
special_literals, elselabel);
- rb_ary_push(iseq->compile_data->mark_ary, special_literals);
+ iseq_add_mark_object_compile_time(iseq, special_literals);
}
ADD_SEQ (ret, cond_seq);
@@ -2587,15 +2610,17 @@
VALUE prevblock = iseq->compile_data->current_block;
LABEL * retry_label = NEW_LABEL(nd_line(node));
LABEL * retry_end_l = NEW_LABEL(nd_line(node));
-
+ ID mid = 0;
+
ADD_LABEL(ret, retry_label);
if(nd_type(node) == NODE_FOR){
COMPILE(ret, "iter caller (for)", node->nd_iter);
iseq->compile_data->current_block =
NEW_CHILD_ISEQVAL(node, make_name_for_block(iseq),
- self, ISEQ_TYPE_BLOCK);
-
+ ISEQ_TYPE_BLOCK);
+
+ mid = idEach;
ADD_SEND_R(ret, nd_line(node), ID2SYM(idEach), INT2FIX(0),
iseq->compile_data->current_block, INT2FIX(0));
if(poped){
@@ -2605,11 +2630,10 @@
else{
iseq->compile_data->current_block =
NEW_CHILD_ISEQVAL(node, make_name_for_block(iseq),
- self, ISEQ_TYPE_BLOCK);
+ ISEQ_TYPE_BLOCK);
COMPILE_(ret, "iter caller", node->nd_iter, poped);
}
ADD_LABEL(ret, retry_end_l);
- rb_ary_push(iseq->iseq_mark_ary, iseq->compile_data->current_block);
iseq->compile_data->current_block = prevblock;
ADD_CATCH_ENTRY(CATCH_TYPE_RETRY, retry_label, retry_end_l, 0, 0, retry_label);
@@ -2741,7 +2765,7 @@
LABEL *lend = NEW_LABEL(nd_line(node));
LABEL *lcont = NEW_LABEL(nd_line(node));
VALUE rescue = NEW_CHILD_ISEQVAL(node->nd_resq, rb_str_new2("rescue"),
- self, ISEQ_TYPE_RESCUE);
+ ISEQ_TYPE_RESCUE);
ADD_LABEL(ret, lstart);
COMPILE(ret, "rescue head", node->nd_head);
@@ -2796,7 +2820,7 @@
case NODE_ENSURE:{
DECL_ANCHOR(ensr);
VALUE ensure = NEW_CHILD_ISEQVAL(node->nd_ensr, rb_str_new2("ensure"),
- self, ISEQ_TYPE_ENSURE);
+ ISEQ_TYPE_ENSURE);
LABEL * lstart = NEW_LABEL(nd_line(node));
LABEL * lend = NEW_LABEL(nd_line(node));
LABEL * lcont = NEW_LABEL(nd_line(node));
@@ -3132,7 +3156,7 @@
VALUE argc;
VALUE flag = 0;
VALUE block = 0;
- VALUE parent_block = iseq->compile_data->current_block;
+ VALUE parent_blockval = iseq->compile_data->current_block;
iseq->compile_data->current_block = Qfalse;
#if SUPPORT_JOKE
@@ -3226,15 +3250,15 @@
ADD_SEQ(ret, recv);
ADD_SEQ(ret, args);
-
- if(parent_block){
- if(parent_block & 1){
+
+ /* block */
+ if(parent_blockval){
+ if(parent_blockval & 1){
flag |= VM_CALL_ARGS_BLOCKARG_BIT;
- //dump_disasm_list((LINK_ANCHOR *)(parent_block & (~1)));
- ADD_SEQ(ret, (LINK_ANCHOR *)(parent_block & (~1)));
+ ADD_SEQ(ret, (LINK_ANCHOR *)(parent_blockval & (~1)));
}
else{
- block = parent_block;
+ block = parent_blockval;
}
}
@@ -3315,6 +3339,7 @@
case NODE_ZSUPER:{
VALUE block = 0;
VALUE parent_block = iseq->compile_data->current_block;
+ iseq->compile_data->current_block = Qfalse;
/* block */
if(parent_block){
@@ -3775,8 +3800,9 @@
case NODE_CLASS:{
VALUE iseqval =
NEW_CHILD_ISEQVAL(node->nd_body,
- make_name_with_str("<class:%s>", rb_id2name(node->nd_cpath->nd_mid)),
- self, ISEQ_TYPE_CLASS);
+ make_name_with_str("<class:%s>",
+ rb_id2name(node->nd_cpath->nd_mid)),
+ ISEQ_TYPE_CLASS);
COMPILE(ret, "cbase", node->nd_cpath->nd_head);
COMPILE(ret, "super", node->nd_super);
@@ -3791,8 +3817,9 @@
case NODE_MODULE:{
VALUE iseqval =
NEW_CHILD_ISEQVAL(node->nd_body,
- make_name_with_str("<module:%s>", rb_id2name(node->nd_cpath->nd_mid)),
- self, ISEQ_TYPE_CLASS);
+ make_name_with_str("<module:%s>",
+ rb_id2name(node->nd_cpath->nd_mid)),
+ ISEQ_TYPE_CLASS);
COMPILE (ret, "mbase", node->nd_cpath->nd_head);
ADD_INSN2(ret, nd_line(node), moduledef, ID2SYM(node->nd_cpath->nd_mid), iseqval);
@@ -4047,17 +4074,17 @@
/* 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_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 */
@@ -4154,6 +4181,7 @@
break;
}
break;
+ case 'B': /* block */
case 'U': /* ulong */
case 'V': /* VALUE */
rb_str_concat(str, rb_inspect(OPERAND_AT(insnobj, j)));
Modified: trunk/compile.h
===================================================================
--- trunk/compile.h 2005-11-28 00:10:29 UTC (rev 298)
+++ trunk/compile.h 2005-11-29 04:26:15 UTC (rev 299)
@@ -97,10 +97,10 @@
(((yarv_iseq_t*)DATA_PTR(iseq))->file_name)
#define NEW_ISEQVAL(node, name, type) \
- NEW_CHILD_ISEQVAL(node, name, 0, type)
+ new_child_iseq(iseq, node, name, 0, type)
-#define NEW_CHILD_ISEQVAL(node, name, parent, type) \
- new_child_iseq(iseq, node, (VALUE)name, (VALUE)parent, (VALUE)type)
+#define NEW_CHILD_ISEQVAL(node, name, type) \
+ new_child_iseq(iseq, node, name, iseq->self, type)
/* add instructions */
#define ADD_SEQ(seq1, seq2) \
Modified: trunk/disasm.c
===================================================================
--- trunk/disasm.c 2005-11-28 00:10:29 UTC (rev 298)
+++ trunk/disasm.c 2005-11-29 04:26:15 UTC (rev 299)
@@ -65,6 +65,7 @@
case 'I': /* ID (symbol) */
op = ID2SYM(op);
/* fall through */
+
case 'V': /* VALUE */
ret = rb_inspect(op);
@@ -73,6 +74,13 @@
}
break;
+ case 'B': /* block */
+ {
+ yarv_iseq_t *block = (yarv_iseq_t *)op;
+ ret = block->name;
+ break;
+ }
+
case 'G':
{
struct global_entry *entry = (struct global_entry*)op;
Modified: trunk/gc.c
===================================================================
--- trunk/gc.c 2005-11-28 00:10:29 UTC (rev 298)
+++ trunk/gc.c 2005-11-29 04:26:15 UTC (rev 299)
@@ -97,7 +97,7 @@
void
rb_memerror(void)
{
- static int recurse = 0;
+ static int recurse = 0;
if (!nomem_error || (recurse > 0 && rb_safe_level() < 4)) {
fprintf(stderr, "[FATAL] failed to allocate memory\n");
exit(1);
@@ -191,8 +191,9 @@
void
ruby_xfree(void *x)
{
- if (x)
- RUBY_CRITICAL(free(x));
+ if (x){
+ RUBY_CRITICAL(free(x));
+ }
}
static int dont_gc;
@@ -392,19 +393,20 @@
VALUE
rb_newobj(void)
{
- VALUE obj;
+ VALUE obj;
- if (!freelist && !garbage_collect())
- rb_memerror();
+ if (!freelist && !garbage_collect()){
+ rb_memerror();
+ }
- obj = (VALUE)freelist;
- freelist = freelist->as.free.next;
- MEMZERO((void*)obj, RVALUE, 1);
+ obj = (VALUE)freelist;
+ freelist = freelist->as.free.next;
+ MEMZERO((void*)obj, RVALUE, 1);
#ifdef GC_DEBUG
- RANY(obj)->file = ruby_sourcefile;
- RANY(obj)->line = ruby_sourceline;
+ RANY(obj)->file = ruby_sourcefile;
+ RANY(obj)->line = ruby_sourceline;
#endif
- return obj;
+ return obj;
}
VALUE
@@ -1268,15 +1270,16 @@
YARV_SET_STACK_END;
- if (!heaps) return Qfalse;
+ if (!heaps){
+ return Qfalse;
+ }
if (dont_gc || during_gc) {
if (!freelist) {
add_heap();
}
- return Qfalse;
+ return Qtrue;
}
- if (during_gc) return Qfalse;
during_gc++;
init_mark_stack();
@@ -1302,7 +1305,7 @@
/* This assumes that all registers are saved into the jmp_buf (and stack) */
setjmp(save_regs_gc_mark);
mark_locations_array((VALUE*)save_regs_gc_mark, sizeof(save_regs_gc_mark) / sizeof(VALUE *));
-
+
#if STACK_GROW_DIRECTION < 0
rb_gc_mark_locations(th->machine_stack_end, th->machine_stack_start);
#elif STACK_GROW_DIRECTION > 0
Modified: trunk/insns.def
===================================================================
--- trunk/insns.def 2005-11-28 00:10:29 UTC (rev 298)
+++ trunk/insns.def 2005-11-29 04:26:15 UTC (rev 299)
@@ -1013,16 +1013,14 @@
*/
DEFINE_INSN
postexe
-(VALUE blockval)
+(BLOCKISEQ blockiseq)
()
()
{
yarv_block_t *blockptr;
VALUE proc;
- yarv_iseq_t *blockiseq;
/* TODO : eliminate it */
- GetISeqVal(blockval, blockiseq);
blockptr = GET_BLOCK_PTR_IN_CFP(GET_CFP());
blockptr->iseq = blockiseq;
@@ -1206,7 +1204,7 @@
*/
DEFINE_INSN
send
-(ID id, ulong op_argc, VALUE blockval, ulong flag, IC ic)
+(ID id, ulong op_argc, BLOCKISEQ blockiseq, ulong flag, IC ic)
(...)
(VALUE val)
{
@@ -1217,7 +1215,7 @@
ulong num = op_argc;
int noex;
- macro_eval_setup_send_arguments(num, blockptr, flag, blockval);
+ macro_eval_setup_send_arguments(num, blockptr, flag, blockiseq);
recv = TOPN(num);
klass = CLASS_OF(recv);
@@ -1314,7 +1312,7 @@
*/
DEFINE_INSN
super
-(ulong op_argc, VALUE blockval, ulong flag)
+(ulong op_argc, BLOCKISEQ blockiseq, ulong flag)
(...)
(VALUE val)
{
@@ -1325,7 +1323,7 @@
tmp_num = op_argc;
tmp_blockptr = 0;
macro_eval_setup_send_arguments(tmp_num, tmp_blockptr,
- flag, blockval);
+ flag, blockiseq);
if(!tmp_blockptr){
tmp_blockptr = GET_BLOCK_PTR();
}
@@ -1340,16 +1338,14 @@
*/
DEFINE_INSN
zsuper
-(VALUE blockval)
+(BLOCKISEQ blockiseq)
(...)
(VALUE val)
{
#if YARV_AOT_COMPILED
#else
tmp_blockptr = 0;
- if(blockval){
- yarv_iseq_t *blockiseq;
- GetISeqVal(blockval, blockiseq);
+ if(blockiseq){
tmp_blockptr = GET_BLOCK_PTR_IN_CFP(GET_CFP());
tmp_blockptr->iseq = blockiseq;
tmp_blockptr->proc = 0;
Modified: trunk/rb/insns2vm.rb
===================================================================
--- trunk/rb/insns2vm.rb 2005-11-28 00:10:29 UTC (rev 298)
+++ trunk/rb/insns2vm.rb 2005-11-29 04:26:15 UTC (rev 299)
@@ -775,6 +775,8 @@
"TS_VARIABLE"
when /^CDHASH/
"TS_CDHASH"
+ when /^BLOCKISEQ/
+ "TS_BLOCKISEQ"
else
raise "unknown op type: #{op}"
end
Modified: trunk/test.rb
===================================================================
--- trunk/test.rb 2005-11-28 00:10:29 UTC (rev 298)
+++ trunk/test.rb 2005-11-29 04:26:15 UTC (rev 299)
@@ -1,3 +1,123 @@
+require 'optparse'
+require 'optparse/time'
+require 'ostruct'
+require 'pp'
+
+class OptparseExample
+
+ CODES = %w[iso-2022-jp shift_jis euc-jp utf8 binary]
+ CODE_ALIASES = {"jis" => "iso-2022-jp", "sjis" => "shift_jis"}
+
+ #
+ # Return a structure describing the options.
+ #
+ def self.parse(args)
+ # The options specified on the command line will be collected in *options*.
+ # We set default values here.
+ options = OpenStruct.new
+ options.library = []
+ options.inplace = false
+ options.encoding = "utf8"
+ options.transfer_type = :auto
+ options.verbose = false
+
+ opts = OptionParser.new do |opts|
+ opts.banner = "Usage: example.rb [options]"
+
+ opts.separator ""
+ opts.separator "Specific options:"
+
+ # Mandatory argument.
+ opts.on("-r", "--require LIBRARY",
+ "Require the LIBRARY before executing your script") do |lib|
+ options.library << lib
+ end
+
+ # Optional argument; multi-line description.
+ opts.on("-i", "--inplace [EXTENSION]",
+ "Edit ARGV files in place",
+ " (make backup if EXTENSION supplied)") do |ext|
+ options.inplace = true
+ options.extension = ext || ''
+ options.extension.sub!(/\A\.?(?=.)/, ".") # Ensure extension begins with dot.
+ end
+
+ # Cast 'delay' argument to a Float.
+ opts.on("--delay N", Float, "Delay N seconds before executing") do |n|
+ options.delay = n
+ end
+
+ # Cast 'time' argument to a Time object.
+ opts.on("-t", "--time [TIME]", Time, "Begin execution at given time") do |time|
+ options.time = time
+ end
+
+ # Cast to octal integer.
+ opts.on("-F", "--irs [OCTAL]", OptionParser::OctalInteger,
+ "Specify record separator (default \\0)") do |rs|
+ options.record_separator = rs
+ end
+
+ # List of arguments.
+ opts.on("--list x,y,z", Array, "Example 'list' of arguments") do |list|
+ options.list = list
+ end
+
+ # Keyword completion. We are specifying a specific set of arguments (CODES
+ # and CODE_ALIASES - notice the latter is a Hash), and the user may provide
+ # the shortest unambiguous text.
+ code_list = (CODE_ALIASES.keys + CODES).join(',')
+ opts.on("--code CODE", CODES, CODE_ALIASES, "Select encoding",
+ " (#{code_list})") do |encoding|
+ options.encoding = encoding
+ end
+
+ # Optional argument with keyword completion.
+ opts.on("--type [TYPE]", [:text, :binary, :auto], "Select transfer type (text, binary, auto)") do |t|
+ options.transfer_type = t
+ end
+
+ # Boolean switch.
+ opts.on("-v", "--[no-]verbose", "Run verbosely") do |v|
+ options.verbose = v
+ end
+
+ opts.separator ""
+ opts.separator "Common options:"
+
+ # No argument, shows at tail. This will print an options summary.
+ # Try it and see!
+ opts.on_tail("-h", "--help", "Show this message") do
+ puts opts
+ exit
+ end
+
+ # Another typical switch to print the version.
+ opts.on_tail("--version", "Show version") do
+ puts OptionParser::Version.join('.')
+ exit
+ end
+ end
+
+ opts.parse!(args)
+ options
+ end # parse()
+
+end # class OptparseExample
+
+1000.times{|i|
+ p i
+ options = OptparseExample.parse(ARGV)
+}
+
+
+__END__
+1.times{|i|
+ p i
+}
+
+
+__END__
prs = []
3.times{|i|
a = i+1
Modified: trunk/vm.c
===================================================================
--- trunk/vm.c 2005-11-28 00:10:29 UTC (rev 298)
+++ trunk/vm.c 2005-11-29 04:26:15 UTC (rev 299)
@@ -192,9 +192,9 @@
local_size = cfp->iseq->local_size;
}
- env->env_size = local_size + 1 + 4;
- env->local_size = local_size;
- env->env = ALLOC_N(VALUE, env->env_size);
+ env->env_size = local_size + 1 + 4;
+ env->local_size = local_size;
+ env->env = ALLOC_N(VALUE, env->env_size);
env->prev_envval = penvval;
for(i=0; i<=local_size; i++){
@@ -224,6 +224,10 @@
env->block.dfp = cfp->dfp;
env->block.iseq = cfp->iseq;
+ if(cfp->iseq && CMETHOD_INFO_P(cfp->iseq)){
+ /* TODO */
+ env->block.iseq = 0;
+ }
return envval;
}
@@ -325,33 +329,35 @@
VALUE
th_make_proc(yarv_thread_t *th, yarv_control_frame_t *cfp, yarv_block_t *block)
{
- VALUE procval, envval;
+ VALUE procval, envval, blockprocval = 0;
yarv_proc_t *proc;
- procval = rb_obj_alloc(cYarvProc);
- GetProcVal(procval, proc);
if(GC_GUARDED_PTR_REF(cfp->lfp[0]) != 0 &&
cfp->iseq->type != ISEQ_TYPE_CLASS){
yarv_proc_t *p;
- proc->blockprocval =
+ blockprocval =
th_make_proc_from_block(th, cfp, (yarv_block_t *)GC_GUARDED_PTR_REF(*cfp->lfp));
-
- GetProcVal(proc->blockprocval, p);
+
+ GetProcVal(blockprocval, p);
*cfp->lfp = GC_GUARDED_PTR(&p->block);
}
envval = th_make_env_object(th, cfp);
-
+
if(PROCDEBUG){
check_env_value(envval);
}
-
- proc->block.self = block->self;
- proc->block.lfp = block->lfp;
- proc->block.dfp = block->dfp;
- proc->block.iseq = block->iseq;
- proc->block.proc = procval;
- proc->envval = envval;
+ procval = rb_obj_alloc(cYarvProc);
+ GetProcVal(procval, proc);
+
+ proc->blockprocval = blockprocval;
+ proc->block.self = block->self;
+ proc->block.lfp = block->lfp;
+ proc->block.dfp = block->dfp;
+ proc->block.iseq = block->iseq;
+ proc->block.proc = procval;
+ proc->envval = envval;
+
/* set cref */
if(cfp->iseq && cfp->iseq->klass_nest_stack){
block->iseq->klass_nest_stack = cfp->iseq->klass_nest_stack;
Modified: trunk/vm_evalbody.h
===================================================================
--- trunk/vm_evalbody.h 2005-11-28 00:10:29 UTC (rev 298)
+++ trunk/vm_evalbody.h 2005-11-29 04:26:15 UTC (rev 299)
@@ -18,6 +18,7 @@
#endif
// #define DECL_SC_REG(r, reg) VALUE reg_##r
+typedef yarv_iseq_t *BLOCKISEQ;
#if !OPT_CALL_THREADED_CODE
VALUE th_eval(yarv_thread_t *th, VALUE initial){
Modified: trunk/vm_macro.def
===================================================================
--- trunk/vm_macro.def 2005-11-28 00:10:29 UTC (rev 298)
+++ trunk/vm_macro.def 2005-11-29 04:26:15 UTC (rev 299)
@@ -3,7 +3,7 @@
/* */
-MACRO macro_eval_setup_send_arguments(num, blockptr, flag, blockval)
+MACRO macro_eval_setup_send_arguments(num, blockptr, flag, blockiseq)
{
if(flag & VM_CALL_ARGS_BLOCKARG_BIT){
yarv_proc_t *po;
@@ -23,12 +23,7 @@
}
INC_SP(-1);
}
- else if(blockval){
- yarv_iseq_t *blockiseq;
-
- /* TODO : eliminate it */
- GetISeqVal(blockval, blockiseq);
-
+ else if(blockiseq){
blockptr = GET_BLOCK_PTR_IN_CFP(reg_cfp);
blockptr->iseq = blockiseq;
blockptr->proc = 0;
Modified: trunk/yarvcore.c
===================================================================
--- trunk/yarvcore.c 2005-11-28 00:10:29 UTC (rev 298)
+++ trunk/yarvcore.c 2005-11-29 04:26:15 UTC (rev 299)
@@ -44,10 +44,11 @@
ID idASET;
ID idIntern;
ID idMethodMissing;
-ID idEach;
ID idLength;
ID idGets;
ID idSucc;
+ID idEach;
+ID idTimes;
ID idBitblt;
ID idAnswer;
@@ -377,6 +378,7 @@
{
yarv_iseq_t *iseq;
MARK_REPORT("-> iseq", 1);
+
if(ptr){
iseq = ptr;
GC_INFO("%s\n", RSTRING(iseq->name)->ptr);
@@ -741,11 +743,21 @@
env = ptr;
if(env->env){
/* TODO: should mark more restricted range */
+ GC_INFO("env->env\n");
rb_gc_mark_locations(env->env, env->env + env->env_size);
}
+ GC_INFO("env->prev_envval\n");
MARK_UNLESS_NULL(env->prev_envval);
+
if(env->block.iseq){
- MARK_UNLESS_NULL(env->block.iseq->self);
+ //printf("env->block.iseq <%p, %d>\n",
+ // env->block.iseq, BUILTIN_TYPE(env->block.iseq));
+ if(BUILTIN_TYPE(env->block.iseq) == T_NODE){
+ MARK_UNLESS_NULL((VALUE)env->block.iseq);
+ }
+ else{
+ MARK_UNLESS_NULL(env->block.iseq->self);
+ }
}
}
MARK_REPORT("<- env", 0);
@@ -758,6 +770,9 @@
yarv_env_t *env;
obj = Data_Make_Struct(klass, yarv_env_t,
env_mark, env_free, env);
+ env->env = 0;
+ env->prev_envval = 0;
+ env->block.iseq = 0;
return obj;
}
@@ -784,9 +799,13 @@
if(ptr){
proc = ptr;
+ //GC_INFO("env\n");
MARK_UNLESS_NULL(proc->envval);
+ //GC_INFO("blockval\n");
MARK_UNLESS_NULL(proc->blockprocval);
- if(BUILTIN_TYPE(proc->block.iseq) == T_NODE){
+
+ //GC_INFO("iseq\n");
+ if(proc->block.iseq && BUILTIN_TYPE(proc->block.iseq) == T_NODE){
MARK_UNLESS_NULL((VALUE)(proc->block.iseq));
}
}
@@ -800,6 +819,9 @@
yarv_proc_t *proc;
obj = Data_Make_Struct(klass, yarv_proc_t,
proc_mark, proc_free, proc);
+ proc->envval = 0;
+ proc->blockprocval = 0;
+ proc->block.iseq = 0;
return obj;
}
@@ -974,11 +996,6 @@
// rb_define_method(rb_cArray, "each", yarv_Array_each, 0);
/* Hash#each */
// rb_define_method(rb_cHash,"each", yarv_Hash_each, 0);
-
-#if YARVEXT
- yarv_setup(yarv_yield_values, yarv_call0, yarv_block_given_p, yarv_load,
- yarv_svar, yarv_iterate, yarv_call_super, yarv_backtrace);
-#endif
symIFUNC = ID2SYM(rb_intern("<IFUNC>"));
symCFUNC = ID2SYM(rb_intern("<CFUNC>"));
@@ -1000,6 +1017,7 @@
idASET = rb_intern("[]=");
idEach = rb_intern("each");
+ idTimes = rb_intern("times");
idLength = rb_intern("length");
idIntern = rb_intern("intern");
idGets = rb_intern("gets");
Modified: trunk/yarvcore.h
===================================================================
--- trunk/yarvcore.h 2005-11-28 00:10:29 UTC (rev 298)
+++ trunk/yarvcore.h 2005-11-29 04:26:15 UTC (rev 299)
@@ -111,10 +111,11 @@
extern ID idASET;
extern ID idIntern;
extern ID idMethodMissing;
-extern ID idEach;
extern ID idLength;
extern ID idGets;
extern ID idSucc;
+extern ID idEach;
+extern ID idTimes;
extern ID idBitblt;
extern ID idAnswer;
--
ML: yarv-diff quickml.atdot.net
Info: http://www.atdot.net/~ko1/quickml