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/