summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoryui-knk <[email protected]>2024-08-26 09:22:35 +0900
committerYuichiro Kaneko <[email protected]>2024-09-03 08:40:07 +0900
commitc93d07ed7448f332379cf21b4b7b649b057e5671 (patch)
tree2c733338fb1fbc2d082461d03f4d6915e2821049
parent1b82d6346227dd451003802a09f4abed5eb732bd (diff)
[Bug #20695] Do not create needless string object in parser
`set_parser_s_value` does nothing in parser therefore no need to create string object in parser `set_yylval_node`. # Object allocation Run `ruby benchmarks/lobsters/benchmark.rb` with the patch ```diff diff --git a/benchmarks/lobsters/benchmark.rb b/benchmarks/lobsters/benchmark.rb index 240c50c..6cdd0ac 100644 --- a/benchmarks/lobsters/benchmark.rb +++ b/benchmarks/lobsters/benchmark.rb @@ -7,6 +7,8 @@ Dir.chdir __dir__ use_gemfile require_relative 'config/environment' +printf "allocated_after_load=%d\n", GC.stat(:total_allocated_objects) +exit require_relative "route_generator" # For an in-mem DB, we need to load all data on every boot ``` ## Before ``` ruby 3.4.0dev (2024-08-31T18:30:25Z master d6fc8f3d57) [arm64-darwin21] ... allocated_after_load=2143519 ``` ## After ``` ruby 3.4.0dev (2024-09-01T00:40:04Z fix_bugs_20695 d1bae52f75) [arm64-darwin21] ... allocated_after_load=1579662 ``` ## Ruby 3.3.0 for reference ``` ruby 3.3.0 (2023-12-25 revision 5124f9ac75) [arm64-darwin21] ... allocated_after_load=1732702 ```
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/11522
-rw-r--r--parse.y6
1 files changed, 1 insertions, 5 deletions
diff --git a/parse.y b/parse.y
index b92f993640..5139ee99e6 100644
--- a/parse.y
+++ b/parse.y
@@ -6908,11 +6908,7 @@ static void tokaddmbc(struct parser_params *p, int c, rb_encoding *enc);
static enum yytokentype parse_string(struct parser_params*,rb_strterm_literal_t*);
static enum yytokentype here_document(struct parser_params*,rb_strterm_heredoc_t*);
-#ifndef RIPPER
-#define set_parser_s_value(x) (void)(x)
-#else
-#define set_parser_s_value(x) (p->s_value = (x))
-#endif
+#define set_parser_s_value(x) (ifdef_ripper(p->s_value = (x), (void)0))
# define set_yylval_node(x) { \
YYLTYPE _cur_loc; \