зеркало из https://github.com/github/ruby.git
ruby.c: file in load_file argument
* ruby.c (load_file): move opened file to an argument, to reduce open/close calls in the near future. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@58938 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
Родитель
3ade78fff6
Коммит
ab55cd9fb5
28
ruby.c
28
ruby.c
|
@ -177,7 +177,9 @@ cmdline_options_init(ruby_cmdline_options_t *opt)
|
||||||
return opt;
|
return opt;
|
||||||
}
|
}
|
||||||
|
|
||||||
static NODE *load_file(VALUE, VALUE, int, ruby_cmdline_options_t *);
|
static NODE *load_file(VALUE parser, VALUE fname, VALUE f, int script,
|
||||||
|
ruby_cmdline_options_t *opt);
|
||||||
|
static VALUE open_load_file(VALUE fname_v, int *xflag);
|
||||||
static void forbid_setid(const char *, const ruby_cmdline_options_t *);
|
static void forbid_setid(const char *, const ruby_cmdline_options_t *);
|
||||||
#define forbid_setid(s) forbid_setid((s), opt)
|
#define forbid_setid(s) forbid_setid((s), opt)
|
||||||
|
|
||||||
|
@ -1649,9 +1651,11 @@ process_options(int argc, char **argv, ruby_cmdline_options_t *opt)
|
||||||
tree = rb_parser_compile_string(parser, opt->script, opt->e_script, 1);
|
tree = rb_parser_compile_string(parser, opt->script, opt->e_script, 1);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
VALUE f;
|
||||||
base_block = toplevel_context(toplevel_binding);
|
base_block = toplevel_context(toplevel_binding);
|
||||||
rb_parser_set_context(parser, base_block, TRUE);
|
rb_parser_set_context(parser, base_block, TRUE);
|
||||||
tree = load_file(parser, opt->script_name, 1, opt);
|
f = open_load_file(opt->script_name, &opt->xflag);
|
||||||
|
tree = load_file(parser, opt->script_name, f, 1, opt);
|
||||||
}
|
}
|
||||||
ruby_set_script_name(opt->script_name);
|
ruby_set_script_name(opt->script_name);
|
||||||
if (dump & DUMP_BIT(yydebug)) {
|
if (dump & DUMP_BIT(yydebug)) {
|
||||||
|
@ -1747,7 +1751,6 @@ struct load_file_arg {
|
||||||
VALUE parser;
|
VALUE parser;
|
||||||
VALUE fname;
|
VALUE fname;
|
||||||
int script;
|
int script;
|
||||||
int xflag;
|
|
||||||
ruby_cmdline_options_t *opt;
|
ruby_cmdline_options_t *opt;
|
||||||
VALUE f;
|
VALUE f;
|
||||||
};
|
};
|
||||||
|
@ -1765,7 +1768,6 @@ load_file_internal(VALUE argp_v)
|
||||||
NODE *tree = 0;
|
NODE *tree = 0;
|
||||||
rb_encoding *enc;
|
rb_encoding *enc;
|
||||||
ID set_encoding;
|
ID set_encoding;
|
||||||
int xflag = argp->xflag;
|
|
||||||
|
|
||||||
CONST_ID(set_encoding, "set_encoding");
|
CONST_ID(set_encoding, "set_encoding");
|
||||||
if (script) {
|
if (script) {
|
||||||
|
@ -1780,7 +1782,7 @@ load_file_internal(VALUE argp_v)
|
||||||
enc = rb_ascii8bit_encoding();
|
enc = rb_ascii8bit_encoding();
|
||||||
rb_funcall(f, set_encoding, 1, rb_enc_from_encoding(enc));
|
rb_funcall(f, set_encoding, 1, rb_enc_from_encoding(enc));
|
||||||
|
|
||||||
if (xflag || opt->xflag) {
|
if (opt->xflag) {
|
||||||
line_start--;
|
line_start--;
|
||||||
search_shebang:
|
search_shebang:
|
||||||
while (!NIL_P(line = rb_io_gets(f))) {
|
while (!NIL_P(line = rb_io_gets(f))) {
|
||||||
|
@ -1889,7 +1891,8 @@ load_file_internal(VALUE argp_v)
|
||||||
static VALUE
|
static VALUE
|
||||||
open_load_file(VALUE fname_v, int *xflag)
|
open_load_file(VALUE fname_v, int *xflag)
|
||||||
{
|
{
|
||||||
const char *fname = StringValueCStr(fname_v);
|
const char *fname = (fname_v = rb_str_encode_ospath(fname_v),
|
||||||
|
StringValueCStr(fname_v));
|
||||||
long flen = RSTRING_LEN(fname_v);
|
long flen = RSTRING_LEN(fname_v);
|
||||||
VALUE f;
|
VALUE f;
|
||||||
int e;
|
int e;
|
||||||
|
@ -1975,15 +1978,14 @@ restore_load_file(VALUE arg)
|
||||||
}
|
}
|
||||||
|
|
||||||
static NODE *
|
static NODE *
|
||||||
load_file(VALUE parser, VALUE fname, int script, ruby_cmdline_options_t *opt)
|
load_file(VALUE parser, VALUE fname, VALUE f, int script, ruby_cmdline_options_t *opt)
|
||||||
{
|
{
|
||||||
struct load_file_arg arg;
|
struct load_file_arg arg;
|
||||||
arg.parser = parser;
|
arg.parser = parser;
|
||||||
arg.fname = fname;
|
arg.fname = fname;
|
||||||
arg.script = script;
|
arg.script = script;
|
||||||
arg.opt = opt;
|
arg.opt = opt;
|
||||||
arg.xflag = 0;
|
arg.f = f;
|
||||||
arg.f = open_load_file(rb_str_encode_ospath(fname), &arg.xflag);
|
|
||||||
return (NODE *)rb_ensure(load_file_internal, (VALUE)&arg,
|
return (NODE *)rb_ensure(load_file_internal, (VALUE)&arg,
|
||||||
restore_load_file, (VALUE)&arg);
|
restore_load_file, (VALUE)&arg);
|
||||||
}
|
}
|
||||||
|
@ -1998,17 +2000,15 @@ rb_load_file(const char *fname)
|
||||||
void *
|
void *
|
||||||
rb_load_file_str(VALUE fname_v)
|
rb_load_file_str(VALUE fname_v)
|
||||||
{
|
{
|
||||||
ruby_cmdline_options_t opt;
|
return rb_parser_load_file(rb_parser_new(), fname_v);
|
||||||
|
|
||||||
return load_file(rb_parser_new(), fname_v, 0, cmdline_options_init(&opt));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void *
|
void *
|
||||||
rb_parser_load_file(VALUE parser, VALUE fname_v)
|
rb_parser_load_file(VALUE parser, VALUE fname_v)
|
||||||
{
|
{
|
||||||
ruby_cmdline_options_t opt;
|
ruby_cmdline_options_t opt;
|
||||||
|
VALUE f = open_load_file(fname_v, &cmdline_options_init(&opt)->xflag);
|
||||||
return load_file(parser, fname_v, 0, cmdline_options_init(&opt));
|
return load_file(parser, fname_v, f, 0, &opt);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Загрузка…
Ссылка в новой задаче