From 0a20a506e1ee9e47ea89bb263c31adca013bcb95 Mon Sep 17 00:00:00 2001 From: nobu Date: Mon, 27 Oct 2008 06:58:28 +0000 Subject: * ruby.c (load_file): preserves $.. [ruby-dev:36937] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@19965 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 4 +++- ruby.c | 35 ++++++++++++++++++++++++++++++++--- 2 files changed, 35 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index 5282b620af..8e49b125b7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,6 @@ -Mon Oct 27 15:55:04 2008 Nobuyoshi Nakada +Mon Oct 27 15:58:25 2008 Nobuyoshi Nakada + + * ruby.c (load_file): preserves $.. [ruby-dev:36937] * io.c (argf_init): initial value of $. should be 0. see [ruby-dev:36937]. diff --git a/ruby.c b/ruby.c index f2993bac0d..6f4e7c8301 100644 --- a/ruby.c +++ b/ruby.c @@ -1203,10 +1203,22 @@ process_options(VALUE arg) return iseq; } -static NODE * -load_file(VALUE parser, const char *fname, int script, struct cmdline_options *opt) +struct load_file_arg { + VALUE parser; + const char *fname; + int script; + struct cmdline_options *opt; +}; + +static VALUE +load_file_internal(VALUE arg) { extern VALUE rb_stdin; + struct load_file_arg *argp = (struct load_file_arg *)arg; + VALUE parser = argp->parser; + const char *fname = argp->fname; + int script = argp->script; + struct cmdline_options *opt = argp->opt; VALUE f; int line_start = 1; NODE *tree = 0; @@ -1353,7 +1365,24 @@ load_file(VALUE parser, const char *fname, int script, struct cmdline_options *o else if (f != rb_stdin) { rb_io_close(f); } - return tree; + return (VALUE)tree; +} + +static VALUE +restore_lineno(VALUE lineno) +{ + return rb_gv_set("$.", lineno); +} + +static NODE * +load_file(VALUE parser, const char *fname, int script, struct cmdline_options *opt) +{ + struct load_file_arg arg; + arg.parser = parser; + arg.fname = fname; + arg.script = script; + arg.opt = opt; + return (NODE *)rb_ensure(load_file_internal, (VALUE)&arg, restore_lineno, rb_gv_get("$.")); } void * -- cgit v1.2.3