Skip to content

Commit

Permalink
[GR-18163] Use MethodEntry Assumptions to track whether CoreMethodAss…
Browse files Browse the repository at this point in the history
…umptions still hold

PullRequest: truffleruby/4249
  • Loading branch information
eregon committed Apr 26, 2024
2 parents d226c36 + a608e54 commit d68ea09
Show file tree
Hide file tree
Showing 48 changed files with 183 additions and 114 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG.md
Expand Up @@ -29,6 +29,8 @@ Changes:

Memory Footprint:

* Use inlined core method nodes even when modules are prepended to core classes (#3546, @eregon).

# 24.0.0

New features:
Expand Down
20 changes: 20 additions & 0 deletions spec/ruby/core/module/prepend_spec.rb
Expand Up @@ -75,6 +75,26 @@ def foo
foo.call.should == 'm'
end

it "updates the optimized method when a prepended module is updated" do
out = ruby_exe(<<~RUBY)
module M; end
class Integer
prepend M
end
l = -> { 1 + 2 }
p l.call
M.module_eval do
def +(o)
$called = true
super(o)
end
end
p l.call
p $called
RUBY
out.should == "3\n3\ntrue\n"
end

it "updates the method when there is a base included method and the prepended module overrides it" do
base_module = Module.new do
def foo
Expand Down
1 change: 1 addition & 0 deletions spec/tags/core/module/prepend_tags.txt
@@ -1,3 +1,4 @@
fails:Module#prepend uses only new module when dupping the module
fails:Module#prepend prepends a module if it is included in a super class
fails:Module#prepend when module already exists in ancestor chain modifies the ancestor chain
slow:Module#prepend updates the optimized method when a prepended module is updated
2 changes: 2 additions & 0 deletions spec/tags/truffle/redefining_optimized_core_methods_tags.txt
@@ -1,2 +1,4 @@
slow:Redefining optimized core methods emits performance warning for redefining core classes methods
slow:Prepending a module into a class with optimised methods emits performance warning
slow:Prepending a module into a class with optimised methods keeps the inlined nodes if no optimised method is overridden
slow:Prepending a module into a class with optimised methods emits performance warning if that module overrides an optimised method
Expand Up @@ -78,7 +78,7 @@ ast: |
attributes:
assumptions = [Assumption(valid, name=set_trace_func is not used)]
flags = 0
integerCaseEqualAssumption = Assumption(valid, name=inlined Integer#===)
integerCaseEqualAssumption = Assumption(valid, name=core method is not overridden:)
parameters = RubyCallNodeParameters{methodName='===', descriptor=NoKeywordArgumentsDescriptor, isSplatted=false, ignoreVisibility=true, isVCall=false, isSafeNavigation=false, isAttrAssign=false}
sourceCharIndex = -1
sourceLength = 0
Expand Down Expand Up @@ -110,7 +110,7 @@ ast: |
attributes:
assumptions = [Assumption(valid, name=set_trace_func is not used)]
flags = 0
integerCaseEqualAssumption = Assumption(valid, name=inlined Integer#===)
integerCaseEqualAssumption = Assumption(valid, name=core method is not overridden:)
parameters = RubyCallNodeParameters{methodName='===', descriptor=NoKeywordArgumentsDescriptor, isSplatted=false, ignoreVisibility=true, isVCall=false, isSafeNavigation=false, isAttrAssign=false}
sourceCharIndex = -1
sourceLength = 0
Expand Down
Expand Up @@ -78,7 +78,7 @@ ast: |
attributes:
assumptions = [Assumption(valid, name=set_trace_func is not used)]
flags = 0
integerCaseEqualAssumption = Assumption(valid, name=inlined Integer#===)
integerCaseEqualAssumption = Assumption(valid, name=core method is not overridden:)
parameters = RubyCallNodeParameters{methodName='===', descriptor=NoKeywordArgumentsDescriptor, isSplatted=false, ignoreVisibility=true, isVCall=false, isSafeNavigation=false, isAttrAssign=false}
sourceCharIndex = -1
sourceLength = 0
Expand All @@ -103,7 +103,7 @@ ast: |
attributes:
assumptions = [Assumption(valid, name=set_trace_func is not used)]
flags = 0
integerCaseEqualAssumption = Assumption(valid, name=inlined Integer#===)
integerCaseEqualAssumption = Assumption(valid, name=core method is not overridden:)
parameters = RubyCallNodeParameters{methodName='===', descriptor=NoKeywordArgumentsDescriptor, isSplatted=false, ignoreVisibility=true, isVCall=false, isSafeNavigation=false, isAttrAssign=false}
sourceCharIndex = -1
sourceLength = 0
Expand Down
Expand Up @@ -77,7 +77,7 @@ ast: |
attributes:
assumptions = [Assumption(valid, name=set_trace_func is not used)]
flags = 0
integerCaseEqualAssumption = Assumption(valid, name=inlined Integer#===)
integerCaseEqualAssumption = Assumption(valid, name=core method is not overridden:)
parameters = RubyCallNodeParameters{methodName='===', descriptor=NoKeywordArgumentsDescriptor, isSplatted=false, ignoreVisibility=true, isVCall=false, isSafeNavigation=false, isAttrAssign=false}
sourceCharIndex = -1
sourceLength = 0
Expand Down Expand Up @@ -109,7 +109,7 @@ ast: |
attributes:
assumptions = [Assumption(valid, name=set_trace_func is not used)]
flags = 0
integerCaseEqualAssumption = Assumption(valid, name=inlined Integer#===)
integerCaseEqualAssumption = Assumption(valid, name=core method is not overridden:)
parameters = RubyCallNodeParameters{methodName='===', descriptor=NoKeywordArgumentsDescriptor, isSplatted=false, ignoreVisibility=true, isVCall=false, isSafeNavigation=false, isAttrAssign=false}
sourceCharIndex = -1
sourceLength = 0
Expand Down
Expand Up @@ -20,7 +20,7 @@ ast: |
attributes:
assumptions = [Assumption(valid, name=set_trace_func is not used)]
flags = 0
integerCaseEqualAssumption = Assumption(valid, name=inlined Integer#===)
integerCaseEqualAssumption = Assumption(valid, name=core method is not overridden:)
parameters = RubyCallNodeParameters{methodName='===', descriptor=NoKeywordArgumentsDescriptor, isSplatted=false, ignoreVisibility=true, isVCall=false, isSafeNavigation=false, isAttrAssign=false}
sourceCharIndex = -1
sourceLength = 0
Expand Down
Expand Up @@ -8,7 +8,7 @@ ruby: |
ast: |
InlinedAddNodeGen
attributes:
assumptions = [Assumption(valid, name=set_trace_func is not used), Assumption(valid, name=inlined Integer#+), Assumption(valid, name=inlined Float#+)]
assumptions = [Assumption(valid, name=set_trace_func is not used), Assumption(valid, name=core method is not overridden:), Assumption(valid, name=core method is not overridden:)]
flags = 1
parameters = RubyCallNodeParameters{methodName='+', descriptor=NoKeywordArgumentsDescriptor, isSplatted=false, ignoreVisibility=false, isVCall=false, isSafeNavigation=false, isAttrAssign=false}
sourceCharIndex = 0
Expand Down
Expand Up @@ -6,7 +6,7 @@ ruby: |
ast: |
InlinedModNodeGen
attributes:
assumptions = [Assumption(valid, name=set_trace_func is not used), Assumption(valid, name=inlined Integer#%), Assumption(valid, name=inlined Float#%)]
assumptions = [Assumption(valid, name=set_trace_func is not used), Assumption(valid, name=core method is not overridden:), Assumption(valid, name=core method is not overridden:)]
flags = 1
parameters = RubyCallNodeParameters{methodName='%', descriptor=NoKeywordArgumentsDescriptor, isSplatted=false, ignoreVisibility=false, isVCall=false, isSafeNavigation=false, isAttrAssign=false}
sourceCharIndex = 0
Expand Down
Expand Up @@ -6,7 +6,7 @@ ruby: |
ast: |
InlinedBitAndNodeGen
attributes:
assumptions = [Assumption(valid, name=set_trace_func is not used), Assumption(valid, name=inlined Integer#&)]
assumptions = [Assumption(valid, name=set_trace_func is not used), Assumption(valid, name=core method is not overridden:)]
flags = 1
parameters = RubyCallNodeParameters{methodName='&', descriptor=NoKeywordArgumentsDescriptor, isSplatted=false, ignoreVisibility=false, isVCall=false, isSafeNavigation=false, isAttrAssign=false}
sourceCharIndex = 0
Expand Down
Expand Up @@ -6,7 +6,7 @@ ruby: |
ast: |
InlinedMulNodeGen
attributes:
assumptions = [Assumption(valid, name=set_trace_func is not used), Assumption(valid, name=inlined Integer#*), Assumption(valid, name=inlined Float#*)]
assumptions = [Assumption(valid, name=set_trace_func is not used), Assumption(valid, name=core method is not overridden:), Assumption(valid, name=core method is not overridden:)]
flags = 1
parameters = RubyCallNodeParameters{methodName='*', descriptor=NoKeywordArgumentsDescriptor, isSplatted=false, ignoreVisibility=false, isVCall=false, isSafeNavigation=false, isAttrAssign=false}
sourceCharIndex = 0
Expand Down
Expand Up @@ -6,7 +6,7 @@ ruby: |
ast: |
InlinedAddNodeGen
attributes:
assumptions = [Assumption(valid, name=set_trace_func is not used), Assumption(valid, name=inlined Integer#+), Assumption(valid, name=inlined Float#+)]
assumptions = [Assumption(valid, name=set_trace_func is not used), Assumption(valid, name=core method is not overridden:), Assumption(valid, name=core method is not overridden:)]
flags = 1
parameters = RubyCallNodeParameters{methodName='+', descriptor=NoKeywordArgumentsDescriptor, isSplatted=false, ignoreVisibility=false, isVCall=false, isSafeNavigation=false, isAttrAssign=false}
sourceCharIndex = 0
Expand Down
Expand Up @@ -6,7 +6,7 @@ ruby: |
ast: |
InlinedSubNodeGen
attributes:
assumptions = [Assumption(valid, name=set_trace_func is not used), Assumption(valid, name=inlined Integer#-), Assumption(valid, name=inlined Float#-)]
assumptions = [Assumption(valid, name=set_trace_func is not used), Assumption(valid, name=core method is not overridden:), Assumption(valid, name=core method is not overridden:)]
flags = 1
parameters = RubyCallNodeParameters{methodName='-', descriptor=NoKeywordArgumentsDescriptor, isSplatted=false, ignoreVisibility=false, isVCall=false, isSafeNavigation=false, isAttrAssign=false}
sourceCharIndex = 0
Expand Down
Expand Up @@ -7,7 +7,7 @@ ruby: |
ast: |
InlinedNegNodeGen
attributes:
assumptions = [Assumption(valid, name=set_trace_func is not used), Assumption(valid, name=inlined Integer#-@), Assumption(valid, name=inlined Float#-@)]
assumptions = [Assumption(valid, name=set_trace_func is not used), Assumption(valid, name=core method is not overridden:), Assumption(valid, name=core method is not overridden:)]
flags = 1
parameters = RubyCallNodeParameters{methodName='-@', descriptor=NoKeywordArgumentsDescriptor, isSplatted=false, ignoreVisibility=false, isVCall=false, isSafeNavigation=false, isAttrAssign=false}
sourceCharIndex = 14
Expand Down
Expand Up @@ -6,7 +6,7 @@ ruby: |
ast: |
InlinedLessThanNodeGen
attributes:
assumptions = [Assumption(valid, name=set_trace_func is not used), Assumption(valid, name=inlined Integer#<), Assumption(valid, name=inlined Float#<)]
assumptions = [Assumption(valid, name=set_trace_func is not used), Assumption(valid, name=core method is not overridden:), Assumption(valid, name=core method is not overridden:)]
flags = 1
parameters = RubyCallNodeParameters{methodName='<', descriptor=NoKeywordArgumentsDescriptor, isSplatted=false, ignoreVisibility=false, isVCall=false, isSafeNavigation=false, isAttrAssign=false}
sourceCharIndex = 0
Expand Down
Expand Up @@ -6,7 +6,7 @@ ruby: |
ast: |
InlinedLeftShiftNodeGen
attributes:
assumptions = [Assumption(valid, name=set_trace_func is not used), Assumption(valid, name=inlined Integer#<<)]
assumptions = [Assumption(valid, name=set_trace_func is not used), Assumption(valid, name=core method is not overridden:)]
flags = 1
parameters = RubyCallNodeParameters{methodName='<<', descriptor=NoKeywordArgumentsDescriptor, isSplatted=false, ignoreVisibility=false, isVCall=false, isSafeNavigation=false, isAttrAssign=false}
sourceCharIndex = 0
Expand Down
Expand Up @@ -6,7 +6,7 @@ ruby: |
ast: |
InlinedLessOrEqualNodeGen
attributes:
assumptions = [Assumption(valid, name=set_trace_func is not used), Assumption(valid, name=inlined Integer#<=), Assumption(valid, name=inlined Float#<=)]
assumptions = [Assumption(valid, name=set_trace_func is not used), Assumption(valid, name=core method is not overridden:), Assumption(valid, name=core method is not overridden:)]
flags = 1
parameters = RubyCallNodeParameters{methodName='<=', descriptor=NoKeywordArgumentsDescriptor, isSplatted=false, ignoreVisibility=false, isVCall=false, isSafeNavigation=false, isAttrAssign=false}
sourceCharIndex = 0
Expand Down
Expand Up @@ -8,8 +8,8 @@ ast: |
attributes:
assumptions = [Assumption(valid, name=set_trace_func is not used)]
flags = 1
floatEqualAssumption = Assumption(valid, name=inlined Float#==)
integerEqualAssumption = Assumption(valid, name=inlined Integer#==)
floatEqualAssumption = Assumption(valid, name=core method is not overridden:)
integerEqualAssumption = Assumption(valid, name=core method is not overridden:)
parameters = RubyCallNodeParameters{methodName='==', descriptor=NoKeywordArgumentsDescriptor, isSplatted=false, ignoreVisibility=false, isVCall=false, isSafeNavigation=false, isAttrAssign=false}
sourceCharIndex = 0
sourceLength = 6
Expand Down
Expand Up @@ -8,7 +8,7 @@ ast: |
attributes:
assumptions = [Assumption(valid, name=set_trace_func is not used)]
flags = 1
integerCaseEqualAssumption = Assumption(valid, name=inlined Integer#===)
integerCaseEqualAssumption = Assumption(valid, name=core method is not overridden:)
parameters = RubyCallNodeParameters{methodName='===', descriptor=NoKeywordArgumentsDescriptor, isSplatted=false, ignoreVisibility=false, isVCall=false, isSafeNavigation=false, isAttrAssign=false}
sourceCharIndex = 0
sourceLength = 7
Expand Down
Expand Up @@ -6,7 +6,7 @@ ruby: |
ast: |
InlinedGreaterThanNodeGen
attributes:
assumptions = [Assumption(valid, name=set_trace_func is not used), Assumption(valid, name=inlined Integer#>), Assumption(valid, name=inlined Float#>)]
assumptions = [Assumption(valid, name=set_trace_func is not used), Assumption(valid, name=core method is not overridden:), Assumption(valid, name=core method is not overridden:)]
flags = 1
parameters = RubyCallNodeParameters{methodName='>', descriptor=NoKeywordArgumentsDescriptor, isSplatted=false, ignoreVisibility=false, isVCall=false, isSafeNavigation=false, isAttrAssign=false}
sourceCharIndex = 0
Expand Down
Expand Up @@ -6,7 +6,7 @@ ruby: |
ast: |
InlinedGreaterOrEqualNodeGen
attributes:
assumptions = [Assumption(valid, name=set_trace_func is not used), Assumption(valid, name=inlined Integer#>=), Assumption(valid, name=inlined Float#>=)]
assumptions = [Assumption(valid, name=set_trace_func is not used), Assumption(valid, name=core method is not overridden:), Assumption(valid, name=core method is not overridden:)]
flags = 1
parameters = RubyCallNodeParameters{methodName='>=', descriptor=NoKeywordArgumentsDescriptor, isSplatted=false, ignoreVisibility=false, isVCall=false, isSafeNavigation=false, isAttrAssign=false}
sourceCharIndex = 0
Expand Down
Expand Up @@ -6,7 +6,7 @@ ruby: |
ast: |
InlinedRightShiftNodeGen
attributes:
assumptions = [Assumption(valid, name=set_trace_func is not used), Assumption(valid, name=inlined Integer#>>)]
assumptions = [Assumption(valid, name=set_trace_func is not used), Assumption(valid, name=core method is not overridden:)]
flags = 1
parameters = RubyCallNodeParameters{methodName='>>', descriptor=NoKeywordArgumentsDescriptor, isSplatted=false, ignoreVisibility=false, isVCall=false, isSafeNavigation=false, isAttrAssign=false}
sourceCharIndex = 0
Expand Down
Expand Up @@ -7,7 +7,7 @@ ruby: |
ast: |
InlinedIsNilNodeGen
attributes:
assumptions = [Assumption(valid, name=set_trace_func is not used), Assumption(valid, name=inlined Nil#nil?)]
assumptions = [Assumption(valid, name=set_trace_func is not used), Assumption(valid, name=core method is not overridden:)]
flags = 1
parameters = RubyCallNodeParameters{methodName='nil?', descriptor=NoKeywordArgumentsDescriptor, isSplatted=false, ignoreVisibility=false, isVCall=false, isSafeNavigation=false, isAttrAssign=false}
sourceCharIndex = 14
Expand Down
Expand Up @@ -6,7 +6,7 @@ ruby: |
ast: |
InlinedDivNodeGen
attributes:
assumptions = [Assumption(valid, name=set_trace_func is not used), Assumption(valid, name=inlined Integer#/), Assumption(valid, name=inlined Float#/)]
assumptions = [Assumption(valid, name=set_trace_func is not used), Assumption(valid, name=core method is not overridden:), Assumption(valid, name=core method is not overridden:)]
flags = 1
parameters = RubyCallNodeParameters{methodName='/', descriptor=NoKeywordArgumentsDescriptor, isSplatted=false, ignoreVisibility=false, isVCall=false, isSafeNavigation=false, isAttrAssign=false}
sourceCharIndex = 0
Expand Down
Expand Up @@ -6,7 +6,7 @@ ruby: |
ast: |
InlinedBitOrNodeGen
attributes:
assumptions = [Assumption(valid, name=set_trace_func is not used), Assumption(valid, name=inlined Integer#|)]
assumptions = [Assumption(valid, name=set_trace_func is not used), Assumption(valid, name=core method is not overridden:)]
flags = 1
parameters = RubyCallNodeParameters{methodName='|', descriptor=NoKeywordArgumentsDescriptor, isSplatted=false, ignoreVisibility=false, isVCall=false, isSafeNavigation=false, isAttrAssign=false}
sourceCharIndex = 0
Expand Down
Expand Up @@ -104,7 +104,7 @@ ast: |
arguments = [
InlinedAddNodeGen
attributes:
assumptions = [Assumption(valid, name=set_trace_func is not used), Assumption(valid, name=inlined Integer#+), Assumption(valid, name=inlined Float#+)]
assumptions = [Assumption(valid, name=set_trace_func is not used), Assumption(valid, name=core method is not overridden:), Assumption(valid, name=core method is not overridden:)]
flags = 0
parameters = RubyCallNodeParameters{methodName='+', descriptor=NoKeywordArgumentsDescriptor, isSplatted=false, ignoreVisibility=false, isVCall=false, isSafeNavigation=false, isAttrAssign=false}
sourceCharIndex = 0
Expand Down

0 comments on commit d68ea09

Please sign in to comment.