[前][次][番号順一覧][スレッド一覧]

ruby-changes:11818

From: nobu <ko1@a...>
Date: Sun, 17 May 2009 14:03:12 +0900 (JST)
Subject: [ruby-changes:11818] Ruby:r23473 (trunk): * ruby.c (ruby_script): sets also VM toplevel program name.

nobu	2009-05-17 14:02:58 +0900 (Sun, 17 May 2009)

  New Revision: 23473

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=23473

  Log:
    * ruby.c (ruby_script): sets also VM toplevel program name.
    * ruby.c (process_options): no longer needs additional frame.

  Modified files:
    trunk/ChangeLog
    trunk/eval_intern.h
    trunk/ruby.c
    trunk/vm.c

Index: eval_intern.h
===================================================================
--- eval_intern.h	(revision 23472)
+++ eval_intern.h	(revision 23473)
@@ -207,6 +207,7 @@
 NODE *rb_vm_cref(void);
 VALUE rb_obj_is_proc(VALUE);
 VALUE rb_vm_call_cfunc(VALUE recv, VALUE (*func)(VALUE), VALUE arg, const rb_block_t *blockptr, VALUE filename);
+void rb_vm_set_progname(VALUE filename);
 void rb_thread_terminate_all(void);
 VALUE rb_vm_top_self();
 VALUE rb_vm_cbase(void);
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 23472)
+++ ChangeLog	(revision 23473)
@@ -1,5 +1,9 @@
-Sun May 17 13:15:32 2009  Nobuyoshi Nakada  <nobu@r...>
+Sun May 17 14:02:56 2009  Nobuyoshi Nakada  <nobu@r...>
 
+	* ruby.c (ruby_script): sets also VM toplevel program name.
+
+	* ruby.c (process_options): no longer needs additional frame.
+
 	* vm.c (rb_vm_get_sourceline): should not access out of bound.
 
 Sun May 17 09:47:48 2009  Nobuyoshi Nakada  <nobu@r...>
Index: vm.c
===================================================================
--- vm.c	(revision 23472)
+++ vm.c	(revision 23473)
@@ -671,13 +671,13 @@
     int line_no = 0;
     const rb_iseq_t *iseq = cfp->iseq;
 
-    if (RUBY_VM_NORMAL_ISEQ_P(iseq)) {
+    if (RUBY_VM_NORMAL_ISEQ_P(iseq) && iseq->insn_info_size > 0) {
 	rb_num_t i;
 	size_t pos = cfp->pc - cfp->iseq->iseq_encoded;
 
-	for (i = 0; i < iseq->insn_info_size; i++) {
+	if (iseq->insn_info_table[0].position == pos) goto found;
+	for (i = 1; i < iseq->insn_info_size; i++) {
 	    if (iseq->insn_info_table[i].position == pos) {
-		if (i == 0) goto found;
 		line_no = iseq->insn_info_table[i - 1].line_no;
 		goto found;
 	    }
@@ -1939,6 +1939,15 @@
     vm_init_redefined_flag();
 }
 
+void
+rb_vm_set_progname(VALUE filename)
+{
+    rb_thread_t *th = GET_VM()->main_thread;
+    rb_control_frame_t *cfp = (void *)(th->stack + th->stack_size);
+    --cfp;
+    cfp->iseq->filename = filename;
+}
+
 #if defined(ENABLE_VM_OBJSPACE) && ENABLE_VM_OBJSPACE
 struct rb_objspace *rb_objspace_alloc(void);
 #endif
Index: ruby.c
===================================================================
--- ruby.c	(revision 23472)
+++ ruby.c	(revision 23473)
@@ -112,12 +112,6 @@
     return opt;
 }
 
-struct cmdline_arguments {
-    int argc;
-    char **argv;
-    struct cmdline_options *opt;
-};
-
 static NODE *load_file(VALUE, const char *, int, struct cmdline_options *);
 static void forbid_setid(const char *, struct cmdline_options *);
 #define forbid_setid(s) forbid_setid(s, opt)
@@ -1222,12 +1216,8 @@
 }
 
 static VALUE
-process_options(VALUE arg)
+process_options(int argc, char **argv, struct cmdline_options *opt)
 {
-    struct cmdline_arguments *argp = (struct cmdline_arguments *)arg;
-    struct cmdline_options *opt = argp->opt;
-    int argc = argp->argc;
-    char **argv = argp->argv;
     NODE *tree = 0;
     VALUE parser;
     VALUE iseq;
@@ -1754,6 +1744,7 @@
 {
     if (name) {
 	rb_progname = rb_obj_freeze(rb_external_str_new(name, strlen(name)));
+	rb_vm_set_progname(rb_progname);
     }
 }
 
@@ -1846,19 +1837,13 @@
 void *
 ruby_process_options(int argc, char **argv)
 {
-    struct cmdline_arguments args;
     struct cmdline_options opt;
     VALUE iseq;
 
     ruby_script(argv[0]);  /* for the time being */
     rb_argv0 = rb_str_new4(rb_progname);
     rb_gc_register_mark_object(rb_argv0);
-    args.argc = argc;
-    args.argv = argv;
-    args.opt = cmdline_options_init(&opt);
-    iseq = rb_vm_call_cfunc(rb_vm_top_self(),
-				    process_options, (VALUE)&args,
-				    0, rb_progname);
+    iseq = process_options(argc, argv, cmdline_options_init(&opt));
     return (void*)(struct RData*)iseq;
 }
 

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]