[前][次][番号順一覧][スレッド一覧][生データ]

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

[前][次][番号順一覧][スレッド一覧][生データ]