[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]