ruby-changes:66505
From: Yusuke <ko1@a...>
Date: Fri, 18 Jun 2021 02:34:41 +0900 (JST)
Subject: [ruby-changes:66505] fb01411ae8 (master): node.h: Reduce struct size to fit with Ruby object size (five VALUEs)
https://git.ruby-lang.org/ruby.git/commit/?id=fb01411ae8 From fb01411ae842dbcc16d18dec2216fa2719649dff Mon Sep 17 00:00:00 2001 From: Yusuke Endoh <mame@r...> Date: Fri, 18 Jun 2021 01:31:50 +0900 Subject: node.h: Reduce struct size to fit with Ruby object size (five VALUEs) by merging `rb_ast_body_t#line_count` and `#script_lines`. Fortunately `line_count == RARRAY_LEN(script_lines)` was always satisfied. When script_lines is saved, it has an array of lines, and when not saved, it has a Fixnum that represents the old line_count. --- ast.c | 2 +- compile.c | 3 +-- iseq.c | 14 ++++++++++++-- node.h | 4 +++- parse.y | 2 +- vm.c | 2 +- 6 files changed, 19 insertions(+), 8 deletions(-) diff --git a/ast.c b/ast.c index 3fec251..78de316 100644 --- a/ast.c +++ b/ast.c @@ -710,7 +710,7 @@ ast_node_script_lines(rb_execution_context_t *ec, VALUE self) https://github.com/ruby/ruby/blob/trunk/ast.c#L710 struct ASTNodeData *data; TypedData_Get_Struct(self, struct ASTNodeData, &rb_node_type, data); VALUE ret = data->ast->body.script_lines; - if (!ret) ret = Qnil; + if (!RB_TYPE_P(ret, T_ARRAY)) return Qnil; return ret; } diff --git a/compile.c b/compile.c index 30c7511..4b967a8 100644 --- a/compile.c +++ b/compile.c @@ -1328,8 +1328,7 @@ new_child_iseq(rb_iseq_t *iseq, const NODE *const node, https://github.com/ruby/ruby/blob/trunk/compile.c#L1328 ast.root = node; ast.compile_option = 0; - ast.line_count = -1; - ast.script_lines = Qfalse; + ast.script_lines = INT2FIX(-1); debugs("[new_child_iseq]> ---------------------------------------\n"); int isolated_depth = ISEQ_COMPILE_DATA(iseq)->isolated_depth; diff --git a/iseq.c b/iseq.c index 4ad1fc2..1609432 100644 --- a/iseq.c +++ b/iseq.c @@ -813,13 +813,23 @@ rb_iseq_new(const rb_ast_body_t *ast, VALUE name, VALUE path, VALUE realpath, https://github.com/ruby/ruby/blob/trunk/iseq.c#L813 0, type, &COMPILE_OPTION_DEFAULT); } +static int +ast_line_count(const rb_ast_body_t *ast) +{ + if (RB_TYPE_P(ast->script_lines, T_ARRAY)){ + return (int)RARRAY_LEN(ast->script_lines); + } + return FIX2INT(ast->script_lines); +} + rb_iseq_t * rb_iseq_new_top(const rb_ast_body_t *ast, VALUE name, VALUE path, VALUE realpath, const rb_iseq_t *parent) { VALUE coverages = rb_get_coverages(); if (RTEST(coverages)) { - if (ast->line_count >= 0) { - int len = (rb_get_coverage_mode() & COVERAGE_TARGET_ONESHOT_LINES) ? 0 : ast->line_count; + int line_count = ast_line_count(ast); + if (line_count >= 0) { + int len = (rb_get_coverage_mode() & COVERAGE_TARGET_ONESHOT_LINES) ? 0 : line_count; VALUE coverage = rb_default_coverage(len); rb_hash_aset(coverages, path, coverage); } diff --git a/node.h b/node.h index 592b285..8b09e81 100644 --- a/node.h +++ b/node.h @@ -398,8 +398,10 @@ typedef struct node_buffer_struct node_buffer_t; https://github.com/ruby/ruby/blob/trunk/node.h#L398 typedef struct rb_ast_body_struct { const NODE *root; VALUE compile_option; - int line_count; VALUE script_lines; + // script_lines is either: + // - a Fixnum that represents the line count of the original source, or + // - an Array that contains the lines of the original source } rb_ast_body_t; typedef struct rb_ast_struct { VALUE flags; diff --git a/parse.y b/parse.y index 47b63e8..df16cf6 100644 --- a/parse.y +++ b/parse.y @@ -6286,7 +6286,7 @@ yycompile0(VALUE arg) https://github.com/ruby/ruby/blob/trunk/parse.y#L6286 RB_OBJ_WRITE(p->ast, &p->ast->body.compile_option, opt); } p->ast->body.root = tree; - p->ast->body.line_count = p->line_count; + if (!p->ast->body.script_lines) p->ast->body.script_lines = INT2FIX(p->line_count); return TRUE; } diff --git a/vm.c b/vm.c index 01afea9..6140bcf 100644 --- a/vm.c +++ b/vm.c @@ -1223,7 +1223,7 @@ rb_binding_add_dynavars(VALUE bindval, rb_binding_t *bind, int dyncount, const I https://github.com/ruby/ruby/blob/trunk/vm.c#L1223 rb_node_init(&tmp_node, NODE_SCOPE, (VALUE)dyns, 0, 0); ast.root = &tmp_node; ast.compile_option = 0; - ast.line_count = -1; + ast.script_lines = INT2FIX(-1); if (base_iseq) { iseq = rb_iseq_new(&ast, base_iseq->body->location.label, path, realpath, base_iseq, ISEQ_TYPE_EVAL); -- cgit v1.1 -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/