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