ast.c: Use kept script_lines data instead of re-opening the source file (#5019)
ast.c: Use kept script_lines data instead of re-open the source file
This commit is contained in:
parent
33113c6b64
commit
09fa773e04
Notes:
git
2021-10-26 01:58:21 +09:00
Merged-By: mame <mame@ruby-lang.org>
9
ast.c
9
ast.c
@ -195,12 +195,12 @@ script_lines(VALUE path)
|
|||||||
static VALUE
|
static VALUE
|
||||||
ast_s_of(rb_execution_context_t *ec, VALUE module, VALUE body, VALUE keep_script_lines)
|
ast_s_of(rb_execution_context_t *ec, VALUE module, VALUE body, VALUE keep_script_lines)
|
||||||
{
|
{
|
||||||
VALUE path, node, lines;
|
VALUE path, node, lines = Qnil;
|
||||||
int node_id;
|
int node_id;
|
||||||
|
|
||||||
if (rb_frame_info_p(body)) {
|
if (rb_frame_info_p(body)) {
|
||||||
rb_frame_info_get(body, &path, &node_id);
|
rb_frame_info_get(body, &path, &lines, &node_id);
|
||||||
if (NIL_P(path)) return Qnil;
|
if (NIL_P(path) && NIL_P(lines)) return Qnil;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
const rb_iseq_t *iseq = NULL;
|
const rb_iseq_t *iseq = NULL;
|
||||||
@ -220,10 +220,11 @@ ast_s_of(rb_execution_context_t *ec, VALUE module, VALUE body, VALUE keep_script
|
|||||||
rb_raise(rb_eArgError, "cannot get AST for method defined in eval");
|
rb_raise(rb_eArgError, "cannot get AST for method defined in eval");
|
||||||
}
|
}
|
||||||
path = rb_iseq_path(iseq);
|
path = rb_iseq_path(iseq);
|
||||||
|
lines = iseq->body->variable.script_lines;
|
||||||
node_id = iseq->body->location.node_id;
|
node_id = iseq->body->location.node_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!NIL_P(lines = script_lines(path))) {
|
if (!NIL_P(lines) || !NIL_P(lines = script_lines(path))) {
|
||||||
node = rb_ast_parse_array(lines, keep_script_lines);
|
node = rb_ast_parse_array(lines, keep_script_lines);
|
||||||
}
|
}
|
||||||
else if (RSTRING_LEN(path) == 2 && memcmp(RSTRING_PTR(path), "-e", 2) == 0) {
|
else if (RSTRING_LEN(path) == 2 && memcmp(RSTRING_PTR(path), "-e", 2) == 0) {
|
||||||
|
@ -111,7 +111,7 @@ VALUE rb_backtrace_to_str_ary(VALUE obj);
|
|||||||
VALUE rb_backtrace_to_location_ary(VALUE obj);
|
VALUE rb_backtrace_to_location_ary(VALUE obj);
|
||||||
void rb_backtrace_each(VALUE (*iter)(VALUE recv, VALUE str), VALUE output);
|
void rb_backtrace_each(VALUE (*iter)(VALUE recv, VALUE str), VALUE output);
|
||||||
int rb_frame_info_p(VALUE obj);
|
int rb_frame_info_p(VALUE obj);
|
||||||
void rb_frame_info_get(VALUE obj, VALUE *path, int *node_id);
|
void rb_frame_info_get(VALUE obj, VALUE *path, VALUE *script_lines, int *node_id);
|
||||||
|
|
||||||
MJIT_SYMBOL_EXPORT_BEGIN
|
MJIT_SYMBOL_EXPORT_BEGIN
|
||||||
VALUE rb_ec_backtrace_object(const struct rb_execution_context_struct *ec);
|
VALUE rb_ec_backtrace_object(const struct rb_execution_context_struct *ec);
|
||||||
|
1
parse.y
1
parse.y
@ -6414,6 +6414,7 @@ lex_getline(struct parser_params *p)
|
|||||||
VALUE line = (*p->lex.gets)(p, p->lex.input);
|
VALUE line = (*p->lex.gets)(p, p->lex.input);
|
||||||
if (NIL_P(line)) return line;
|
if (NIL_P(line)) return line;
|
||||||
must_be_ascii_compatible(line);
|
must_be_ascii_compatible(line);
|
||||||
|
if (RB_OBJ_FROZEN(line)) line = rb_str_dup(line); // needed for RubyVM::AST.of because script_lines in iseq is deep-frozen
|
||||||
#ifndef RIPPER
|
#ifndef RIPPER
|
||||||
if (p->debug_lines) {
|
if (p->debug_lines) {
|
||||||
rb_enc_associate(line, p->enc);
|
rb_enc_associate(line, p->enc);
|
||||||
|
@ -283,19 +283,16 @@ location_base_label_m(VALUE self)
|
|||||||
return location_base_label(location_ptr(self));
|
return location_base_label(location_ptr(self));
|
||||||
}
|
}
|
||||||
|
|
||||||
static VALUE
|
static const rb_iseq_t *
|
||||||
location_path(rb_backtrace_location_t *loc)
|
location_iseq(rb_backtrace_location_t *loc)
|
||||||
{
|
{
|
||||||
switch (loc->type) {
|
switch (loc->type) {
|
||||||
case LOCATION_TYPE_ISEQ:
|
case LOCATION_TYPE_ISEQ:
|
||||||
return rb_iseq_path(loc->iseq);
|
return loc->iseq;
|
||||||
case LOCATION_TYPE_CFUNC:
|
case LOCATION_TYPE_CFUNC:
|
||||||
if (loc->iseq) {
|
return loc->iseq;
|
||||||
return rb_iseq_path(loc->iseq);
|
|
||||||
}
|
|
||||||
return Qnil;
|
|
||||||
default:
|
default:
|
||||||
rb_bug("location_path: unreachable");
|
rb_bug("location_iseq: unreachable");
|
||||||
UNREACHABLE;
|
UNREACHABLE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -313,7 +310,8 @@ location_path(rb_backtrace_location_t *loc)
|
|||||||
static VALUE
|
static VALUE
|
||||||
location_path_m(VALUE self)
|
location_path_m(VALUE self)
|
||||||
{
|
{
|
||||||
return location_path(location_ptr(self));
|
const rb_iseq_t *iseq = location_iseq(location_ptr(self));
|
||||||
|
return iseq ? rb_iseq_path(iseq) : Qnil;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef USE_ISEQ_NODE_ID
|
#ifdef USE_ISEQ_NODE_ID
|
||||||
@ -336,11 +334,13 @@ location_node_id(rb_backtrace_location_t *loc)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
void
|
void
|
||||||
rb_frame_info_get(VALUE obj, VALUE *path, int *node_id)
|
rb_frame_info_get(VALUE obj, VALUE *path, VALUE *script_lines, int *node_id)
|
||||||
{
|
{
|
||||||
#ifdef USE_ISEQ_NODE_ID
|
#ifdef USE_ISEQ_NODE_ID
|
||||||
rb_backtrace_location_t *loc = location_ptr(obj);
|
rb_backtrace_location_t *loc = location_ptr(obj);
|
||||||
*path = location_path(loc);
|
const rb_iseq_t *iseq = location_iseq(loc);
|
||||||
|
*path = iseq ? rb_iseq_path(iseq) : Qnil;
|
||||||
|
*script_lines = iseq ? iseq->body->variable.script_lines : Qnil;
|
||||||
*node_id = location_node_id(loc);
|
*node_id = location_node_id(loc);
|
||||||
#else
|
#else
|
||||||
*path = Qnil;
|
*path = Qnil;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user