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

yarv-diff:106

From: ko1 atdot.net
Date: 27 Sep 2005 07:44:35 -0000
Subject: [yarv-diff:106] r262 - trunk

Author: ko1
Date: 2005-09-27 16:44:34 +0900 (Tue, 27 Sep 2005)
New Revision: 262

Modified:
   trunk/ChangeLog
   trunk/eval.c
   trunk/eval_intern.h
   trunk/eval_jump.h
   trunk/parse.y
   trunk/test.rb
   trunk/yarvcore.c
   trunk/yarvcore.h
Log:
	* eval.c : support Kernel.local_variables

	* parse.y, yarvcore.c : move some functions
	(rb_(backref|lastline)_(get|set)) from parse.y to yarvcore.c

	* yarvcore.h : fix typo of YARV_PREVIOUS_CONTROL_FRAME



Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	2005-09-26 09:55:54 UTC (rev 261)
+++ trunk/ChangeLog	2005-09-27 07:44:34 UTC (rev 262)
@@ -4,6 +4,16 @@
 #  from Mon, 03 May 2004 01:24:19 +0900
 #
 
+2005-09-27(Tue) 16:41:47 +0900  Koichi Sasada  <ko1 atdot.net>
+
+	* eval.c : support Kernel.local_variables
+
+	* parse.y, yarvcore.c : move some functions
+	(rb_(backref|lastline)_(get|set)) from parse.y to yarvcore.c
+
+	* yarvcore.h : fix typo of YARV_PREVIOUS_CONTROL_FRAME
+
+
 2005-09-26(Mon) 18:51:29 +0900  Koichi Sasada  <ko1 atdot.net>
 
 	* eval.c, compile.c, parse.y, vm.c, yarvcore.h :

Modified: trunk/eval.c
===================================================================
--- trunk/eval.c	2005-09-26 09:55:54 UTC (rev 261)
+++ trunk/eval.c	2005-09-27 07:44:34 UTC (rev 262)
@@ -1110,7 +1110,7 @@
 {
   yarv_thread_t *th = GET_THREAD();
   yarv_control_frame_t *cfp = th->cfp;
-  cfp = YARV_PERVIOUS_CONTROL_FRAME(cfp);
+  cfp = YARV_PREVIOUS_CONTROL_FRAME(cfp);
   if(GC_GUARDED_PTR_REF(cfp->lfp[0])){
     return Qtrue;
   }
@@ -1830,26 +1830,6 @@
   return Qnil;
 }
 
-static NODE*
-compile(src, file, line)
-    VALUE src;
-    char *file;
-    int line;
-{
-    NODE *node;
-    int critical;
-
-    ruby_nerrs = 0;
-    StringValue(src);
-    critical = rb_thread_critical;
-    rb_thread_critical = Qtrue;
-    node = rb_compile_string(file, src, line);
-    rb_thread_critical = critical;
-
-    if (ruby_nerrs == 0) return node;
-    return 0;
-}
-
 static VALUE
 eval(VALUE self, VALUE src, VALUE scope, char *file, int line)
 {
@@ -1867,7 +1847,7 @@
   if ((state = EXEC_TAG()) == 0) {
     yarv_thread_t *th = GET_THREAD();
     yarv_iseq_t *iseq;
-    
+
     if(scope != Qnil){
       yarv_env_t *env;
       if(CLASS_OF(scope) == cYarvEnv){
@@ -1886,20 +1866,21 @@
       th->base_block = &env->block;
     }
     else{
-      yarv_control_frame_t *cfp = YARV_PERVIOUS_CONTROL_FRAME(th->cfp);
+      yarv_control_frame_t *cfp = YARV_PREVIOUS_CONTROL_FRAME(th->cfp);
       th->base_block = GET_BLOCK_PTR_IN_CFP(cfp);
       th->base_block->iseq = cfp->iseq;
     }
-    
+
     if((iseq = th->base_block->iseq->root_iseq) == 0){
       iseq = th->base_block->iseq;
     }
     th->base_local_tbl  = iseq->local_tbl;
     th->base_local_size = iseq->local_size;
+
     result = yarvcore_eval(0, src, rb_str_new2(file), INT2FIX(line));
   }
   POP_TAG();
-  
+
   if (state) {
     if (state == TAG_RAISE) {
       if (strcmp(file, "(eval)") == 0) {
@@ -1942,10 +1923,7 @@
  */
 
 VALUE
-rb_f_eval(argc, argv, self)
-    int argc;
-    VALUE *argv;
-    VALUE self;
+rb_f_eval(int argc, VALUE *argv, VALUE self)
 {
     VALUE src, scope, vfile, vline;
     char *file = "(eval)";
@@ -2112,65 +2090,55 @@
 NORETURN(static void load_failed _((VALUE)));
 
 void
-rb_load(fname, wrap)
-    VALUE fname;
-    int wrap;
+rb_load(VALUE fname, int wrap)
 {
-    VALUE tmp;
-    int state;
-    volatile int prohibit_int = rb_prohibit_interrupt;
-    volatile ID callee, this_func;
-    volatile VALUE wrapper = ruby_wrapper;
-    volatile VALUE self = ruby_top_self;
-    NODE * volatile last_node;
-    NODE *saved_cref = ruby_cref();
-    TMP_PROTECT;
+  VALUE tmp;
+  int state;
+  volatile ID callee, this_func;
+  volatile VALUE self = ruby_top_self;
+  NODE * volatile last_node;
+  NODE *saved_cref = ruby_cref();
+  
+  FilePathValue(fname);
+  fname = rb_str_new4(fname);
+  tmp = rb_find_file(fname);
+  if (!tmp) {
+    load_failed(fname);
+  }
+  fname = tmp;
 
-    if (!wrap) rb_secure(4);
-    FilePathValue(fname);
-    fname = rb_str_new4(fname);
-    tmp = rb_find_file(fname);
-    if (!tmp) {
-	load_failed(fname);
-    }
-    fname = tmp;
+  ruby_errinfo = Qnil;	/* ensure */
+  if (!wrap) {
+    rb_secure(4);		/* should alter global state */
+    ruby_wrapper = 0;
+  }
+  else {
+    /* load in anonymous module as toplevel */
+    self = rb_obj_clone(ruby_top_self);
+    rb_extend_object(self, ruby_wrapper);
+  }
+  /* default visibility is private at loading toplevel */
+  SCOPE_SET(SCOPE_PRIVATE);
 
-    ruby_errinfo = Qnil;	/* ensure */
-    if (!wrap) {
-	rb_secure(4);		/* should alter global state */
-	ruby_wrapper = 0;
-    }
-    else {
-	/* load in anonymous module as toplevel */
-	self = rb_obj_clone(ruby_top_self);
-	rb_extend_object(self, ruby_wrapper);
-    }
-    /* default visibility is private at loading toplevel */
-    SCOPE_SET(SCOPE_PRIVATE);
-    PUSH_TAG(PROT_NONE);
-    state = EXEC_TAG();
-    last_node = ruby_current_node;
-    if (!ruby_current_node && ruby_sourcefile) {
-	last_node = NEW_BEGIN(0);
-    }
-    ruby_current_node = 0;
-    if (state == 0) {
-      yarv_load(RSTRING(fname)->ptr);
-    }
-    ruby_current_node = last_node;
-    ruby_sourcefile = 0;
-    ruby_set_current_source();
+  PUSH_TAG(PROT_NONE);
+  state = EXEC_TAG();
+  if (state == 0) {
+    yarv_load(RSTRING(fname)->ptr);
+  }
+  POP_TAG();
+  
+  if (ruby_nerrs > 0) {
+    ruby_nerrs = 0;
+    rb_exc_raise(ruby_errinfo);
+  }
+  if (state){
+    jump_tag_but_local_jump(state, Qundef);
+  }
 
-    POP_TAG();
-    rb_prohibit_interrupt = prohibit_int;
-    ruby_wrapper = wrapper;
-    if (ruby_nerrs > 0) {
-	ruby_nerrs = 0;
-	rb_exc_raise(ruby_errinfo);
-    }
-    if (state) jump_tag_but_local_jump(state, Qundef);
-    if (!NIL_P(ruby_errinfo))	/* exception during load */
-	rb_exc_raise(ruby_errinfo);
+  if (!NIL_P(ruby_errinfo)){
+    /* exception during load */
+    rb_exc_raise(ruby_errinfo);
+  }
 }
 
 void
@@ -3011,8 +2979,30 @@
 static VALUE
 rb_f_local_variables()
 {
-  UNSUPPORTED(rb_f_local_variables);
-  return Qnil;
+  VALUE ary = rb_ary_new();
+  yarv_thread_t *th = GET_THREAD();
+  yarv_control_frame_t *cfp = YARV_PREVIOUS_CONTROL_FRAME(th->cfp);
+  int i;
+  
+  while(1){
+    if(cfp->iseq){
+      dp(cfp->iseq->self);
+      for(i= (cfp->lfp == cfp->dfp); i<cfp->iseq->local_size; i++){
+        rb_ary_push(ary, rb_str_new2(rb_id2name(cfp->iseq->local_tbl[i])));
+      }
+    }
+    if(cfp->lfp != cfp->dfp){
+      /* block */
+      VALUE *dfp = GC_GUARDED_PTR_REF(cfp->dfp[0]);
+      while(cfp->dfp != dfp){
+        cfp = YARV_PREVIOUS_CONTROL_FRAME(cfp);
+      }
+    }
+    else{
+      break;
+    }
+  }
+  return ary;
 }
 
 
@@ -3250,6 +3240,8 @@
 }
 
 
+/* for parser */
+
 VALUE
 rb_dvar_defined(ID id)
 {
@@ -3315,13 +3307,6 @@
   }
 }
 
-void
-rb_scope_set(int i, VALUE val)
-{
-  /* needed? */
-  UNSUPPORTED(rb_scope_set);
-}
-
 int
 rb_dvar_current(){
   yarv_thread_t *th = GET_THREAD();

Modified: trunk/eval_intern.h
===================================================================
--- trunk/eval_intern.h	2005-09-26 09:55:54 UTC (rev 261)
+++ trunk/eval_intern.h	2005-09-27 07:44:34 UTC (rev 262)
@@ -263,8 +263,6 @@
 
 typedef struct thread * rb_thread_t;
 
-extern unsigned long frame_unique;
-
 extern VALUE rb_cBinding;
 extern VALUE rb_eThreadError;
 extern VALUE rb_eLocalJumpError;

Modified: trunk/eval_jump.h
===================================================================
--- trunk/eval_jump.h	2005-09-26 09:55:54 UTC (rev 261)
+++ trunk/eval_jump.h	2005-09-27 07:44:34 UTC (rev 262)
@@ -4,7 +4,6 @@
 
 #include "eval_intern.h"
 
-static VALUE rb_f_catch _((VALUE,VALUE));
 NORETURN(static VALUE rb_f_throw _((int,VALUE*)));
 
 /*

Modified: trunk/parse.y
===================================================================
--- trunk/parse.y	2005-09-26 09:55:54 UTC (rev 261)
+++ trunk/parse.y	2005-09-27 07:44:34 UTC (rev 262)
@@ -8685,69 +8685,6 @@
     return Qfalse;
 }
 
-void rb_scope_set _((int cnt, VALUE val));
-
-static void
-special_local_set(c, val)
-    char c;
-    VALUE val;
-{
-    VALUE volatile vparser = rb_parser_new();
-    struct parser_params *parser;
-    int cnt;
-    
-    Data_Get_Struct(vparser, struct parser_params, parser);
-    top_local_init();
-    cnt = local_cnt(c);
-    top_local_setup();
-    rb_scope_set(cnt, val);
-}
-
-VALUE
-rb_backref_get()
-{
-    VALUE *var = rb_svar(1);
-    if (var) {
-	return *var;
-    }
-    return Qnil;
-}
-
-void
-rb_backref_set(val)
-    VALUE val;
-{
-    VALUE *var = rb_svar(1);
-    if (var) {
-	*var = val;
-    }
-    else {
-	special_local_set('~', val);
-    }
-}
-
-VALUE
-rb_lastline_get()
-{
-    VALUE *var = rb_svar(0);
-    if (var) {
-	return *var;
-    }
-    return Qnil;
-}
-
-void
-rb_lastline_set(val)
-    VALUE val;
-{
-    VALUE *var = rb_svar(0);
-    if (var) {
-	*var = val;
-    }
-    else {
-	special_local_set('_', val);
-    }
-}
 #endif /* !RIPPER */
 
 static void

Modified: trunk/test.rb
===================================================================
--- trunk/test.rb	2005-09-26 09:55:54 UTC (rev 261)
+++ trunk/test.rb	2005-09-27 07:44:34 UTC (rev 262)
@@ -1,4 +1,26 @@
+i=0
+1.times{|j|
+  1.times{|k|
+    p local_variables
+  }
+}
 
+
+
+__END__
+
+require 'shellwords'
+
+class C
+end
+
+C.module_eval{
+  Const = 1
+  p self
+}
+p Const
+
+__END__
 def m
   a = 1
   proc

Modified: trunk/yarvcore.c
===================================================================
--- trunk/yarvcore.c	2005-09-26 09:55:54 UTC (rev 261)
+++ trunk/yarvcore.c	2005-09-27 07:44:34 UTC (rev 262)
@@ -220,6 +220,41 @@
   return th_svar(GET_THREAD(), cnt);
 }
 
+VALUE
+rb_backref_get()
+{
+  VALUE *var = rb_svar(1);
+  if (var) {
+    return *var;
+  }
+  return Qnil;
+}
+
+void
+rb_backref_set(VALUE val)
+{
+  VALUE *var = rb_svar(1);
+  *var = val;
+}
+
+VALUE
+rb_lastline_get()
+{
+  VALUE *var = rb_svar(0);
+  if (var) {
+    return *var;
+  }
+  return Qnil;
+}
+
+void
+rb_lastline_set(VALUE val)
+{
+  VALUE *var = rb_svar(0);
+  *var = val;
+}
+
+
 static VALUE
 compile_string(VALUE str, VALUE file, VALUE line)
 {

Modified: trunk/yarvcore.h
===================================================================
--- trunk/yarvcore.h	2005-09-26 09:55:54 UTC (rev 261)
+++ trunk/yarvcore.h	2005-09-27 07:44:34 UTC (rev 262)
@@ -395,7 +395,7 @@
 
 #define YARV_METHOD_NODE NODE_METHOD
 
-#define YARV_PERVIOUS_CONTROL_FRAME(cfp) (cfp+1)
+#define YARV_PREVIOUS_CONTROL_FRAME(cfp) (cfp+1)
 #define YARV_NEXT_CONTROL_FRAME(cfp) (cfp-1)
 
 #define GET_BLOCK_PTR_IN_CFP(cfp) ((yarv_block_t *)(&(cfp)->self))


--
ML: yarv-diff quickml.atdot.net
Info: http://www.atdot.net/~ko1/quickml

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