mirror of
https://github.com/ruby/ruby.git
synced 2025-09-15 16:44:01 +02:00
[ruby/prism] Split Prism::Loader#load_node in one lambda per node type
* Otherwise load_node is too big to compile and is forced to run in interpreter:
https://github.com/oracle/truffleruby/issues/3293#issuecomment-1759730996
* For the benchmark at https://github.com/oracle/truffleruby/issues/3293#issuecomment-1759790280
TruffleRuby Native 23.1.0:
Before: 10.574041 After: 5.592436
JRuby 9.4.3.0:
Before: 7.037780 After: 3.995317
JRuby 9.4.3.0 -Xcompile.invokedynamic=true:
Before: 7.047832 After: 2.269294
a592ec346a
This commit is contained in:
parent
51ea82a770
commit
631ddb34e4
1 changed files with 62 additions and 25 deletions
|
@ -47,6 +47,7 @@ module Prism
|
||||||
@constant_pool = nil
|
@constant_pool = nil
|
||||||
|
|
||||||
@source = source
|
@source = source
|
||||||
|
define_load_node_lambdas unless RUBY_ENGINE == 'ruby'
|
||||||
end
|
end
|
||||||
|
|
||||||
def load_encoding
|
def load_encoding
|
||||||
|
@ -194,32 +195,68 @@ module Prism
|
||||||
load_constant(index - 1) if index != 0
|
load_constant(index - 1) if index != 0
|
||||||
end
|
end
|
||||||
|
|
||||||
def load_node
|
if RUBY_ENGINE == 'ruby'
|
||||||
type = io.getbyte
|
def load_node
|
||||||
location = load_location
|
type = io.getbyte
|
||||||
|
location = load_location
|
||||||
|
|
||||||
case type
|
case type
|
||||||
<%- nodes.each_with_index do |node, index| -%>
|
<%- nodes.each_with_index do |node, index| -%>
|
||||||
when <%= index + 1 %> then
|
when <%= index + 1 %> then
|
||||||
<%- if node.needs_serialized_length? -%>
|
<%- if node.needs_serialized_length? -%>
|
||||||
load_serialized_length
|
load_serialized_length
|
||||||
<%- end -%>
|
<%- end -%>
|
||||||
<%= node.name %>.new(<%= (node.fields.map { |field|
|
<%= node.name %>.new(<%= (node.fields.map { |field|
|
||||||
case field
|
case field
|
||||||
when Prism::NodeField then "load_node"
|
when Prism::NodeField then "load_node"
|
||||||
when Prism::OptionalNodeField then "load_optional_node"
|
when Prism::OptionalNodeField then "load_optional_node"
|
||||||
when Prism::StringField then "load_string"
|
when Prism::StringField then "load_string"
|
||||||
when Prism::NodeListField then "Array.new(load_varint) { load_node }"
|
when Prism::NodeListField then "Array.new(load_varint) { load_node }"
|
||||||
when Prism::ConstantField then "load_required_constant"
|
when Prism::ConstantField then "load_required_constant"
|
||||||
when Prism::OptionalConstantField then "load_optional_constant"
|
when Prism::OptionalConstantField then "load_optional_constant"
|
||||||
when Prism::ConstantListField then "Array.new(load_varint) { load_required_constant }"
|
when Prism::ConstantListField then "Array.new(load_varint) { load_required_constant }"
|
||||||
when Prism::LocationField then "load_location"
|
when Prism::LocationField then "load_location"
|
||||||
when Prism::OptionalLocationField then "load_optional_location"
|
when Prism::OptionalLocationField then "load_optional_location"
|
||||||
when Prism::UInt32Field, Prism::FlagsField then "load_varint"
|
when Prism::UInt32Field, Prism::FlagsField then "load_varint"
|
||||||
else raise
|
else raise
|
||||||
end
|
end
|
||||||
} + ["location"]).join(", ") -%>)
|
} + ["location"]).join(", ") -%>)
|
||||||
<%- end -%>
|
<%- end -%>
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
def load_node
|
||||||
|
type = io.getbyte
|
||||||
|
@load_node_lambdas[type].call
|
||||||
|
end
|
||||||
|
|
||||||
|
def define_load_node_lambdas
|
||||||
|
@load_node_lambdas = [
|
||||||
|
nil,
|
||||||
|
<%- nodes.each do |node| -%>
|
||||||
|
-> {
|
||||||
|
location = load_location
|
||||||
|
<%- if node.needs_serialized_length? -%>
|
||||||
|
load_serialized_length
|
||||||
|
<%- end -%>
|
||||||
|
<%= node.name %>.new(<%= (node.fields.map { |field|
|
||||||
|
case field
|
||||||
|
when Prism::NodeField then "load_node"
|
||||||
|
when Prism::OptionalNodeField then "load_optional_node"
|
||||||
|
when Prism::StringField then "load_string"
|
||||||
|
when Prism::NodeListField then "Array.new(load_varint) { load_node }"
|
||||||
|
when Prism::ConstantField then "load_required_constant"
|
||||||
|
when Prism::OptionalConstantField then "load_optional_constant"
|
||||||
|
when Prism::ConstantListField then "Array.new(load_varint) { load_required_constant }"
|
||||||
|
when Prism::LocationField then "load_location"
|
||||||
|
when Prism::OptionalLocationField then "load_optional_location"
|
||||||
|
when Prism::UInt32Field, Prism::FlagsField then "load_varint"
|
||||||
|
else raise
|
||||||
|
end
|
||||||
|
} + ["location"]).join(", ") -%>)
|
||||||
|
},
|
||||||
|
<%- end -%>
|
||||||
|
]
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue