Skip to content

Commit 4aba315

Browse files
committed
Use MethodEntry Assumptions to track whether CoreMethodAssumptions still hold
* This does not invalidate on prepend but only when redefining/overriding that specific method. * Fixes #3546
1 parent 52596ca commit 4aba315

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+162
-114
lines changed

CHANGELOG.md

+2
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ Changes:
2929

3030
Memory Footprint:
3131

32+
* Use inlined core method nodes even when modules are prepended to core classes (#3546, @eregon).
33+
3234
# 24.0.0
3335

3436
New features:
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,4 @@
11
slow:Redefining optimized core methods emits performance warning for redefining core classes methods
22
slow:Prepending a module into a class with optimised methods emits performance warning
3+
slow:Prepending a module into a class with optimised methods keeps the inlined nodes if no optimised method is overridden
4+
slow:Prepending a module into a class with optimised methods emits performance warning if that module overrides an optimised method

spec/truffle/parsing/fixtures/case/with_expression_and_when/with_else_branch.yaml

+2-2
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ ast: |
7878
attributes:
7979
assumptions = [Assumption(valid, name=set_trace_func is not used)]
8080
flags = 0
81-
integerCaseEqualAssumption = Assumption(valid, name=inlined Integer#===)
81+
integerCaseEqualAssumption = Assumption(valid, name=core method is not overridden:)
8282
parameters = RubyCallNodeParameters{methodName='===', descriptor=NoKeywordArgumentsDescriptor, isSplatted=false, ignoreVisibility=true, isVCall=false, isSafeNavigation=false, isAttrAssign=false}
8383
sourceCharIndex = -1
8484
sourceLength = 0
@@ -110,7 +110,7 @@ ast: |
110110
attributes:
111111
assumptions = [Assumption(valid, name=set_trace_func is not used)]
112112
flags = 0
113-
integerCaseEqualAssumption = Assumption(valid, name=inlined Integer#===)
113+
integerCaseEqualAssumption = Assumption(valid, name=core method is not overridden:)
114114
parameters = RubyCallNodeParameters{methodName='===', descriptor=NoKeywordArgumentsDescriptor, isSplatted=false, ignoreVisibility=true, isVCall=false, isSafeNavigation=false, isAttrAssign=false}
115115
sourceCharIndex = -1
116116
sourceLength = 0

spec/truffle/parsing/fixtures/case/with_expression_and_when/with_multiple_values.yaml

+2-2
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ ast: |
7878
attributes:
7979
assumptions = [Assumption(valid, name=set_trace_func is not used)]
8080
flags = 0
81-
integerCaseEqualAssumption = Assumption(valid, name=inlined Integer#===)
81+
integerCaseEqualAssumption = Assumption(valid, name=core method is not overridden:)
8282
parameters = RubyCallNodeParameters{methodName='===', descriptor=NoKeywordArgumentsDescriptor, isSplatted=false, ignoreVisibility=true, isVCall=false, isSafeNavigation=false, isAttrAssign=false}
8383
sourceCharIndex = -1
8484
sourceLength = 0
@@ -103,7 +103,7 @@ ast: |
103103
attributes:
104104
assumptions = [Assumption(valid, name=set_trace_func is not used)]
105105
flags = 0
106-
integerCaseEqualAssumption = Assumption(valid, name=inlined Integer#===)
106+
integerCaseEqualAssumption = Assumption(valid, name=core method is not overridden:)
107107
parameters = RubyCallNodeParameters{methodName='===', descriptor=NoKeywordArgumentsDescriptor, isSplatted=false, ignoreVisibility=true, isVCall=false, isSafeNavigation=false, isAttrAssign=false}
108108
sourceCharIndex = -1
109109
sourceLength = 0

spec/truffle/parsing/fixtures/case/with_expression_and_when/with_single_value.yaml

+2-2
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ ast: |
7777
attributes:
7878
assumptions = [Assumption(valid, name=set_trace_func is not used)]
7979
flags = 0
80-
integerCaseEqualAssumption = Assumption(valid, name=inlined Integer#===)
80+
integerCaseEqualAssumption = Assumption(valid, name=core method is not overridden:)
8181
parameters = RubyCallNodeParameters{methodName='===', descriptor=NoKeywordArgumentsDescriptor, isSplatted=false, ignoreVisibility=true, isVCall=false, isSafeNavigation=false, isAttrAssign=false}
8282
sourceCharIndex = -1
8383
sourceLength = 0
@@ -109,7 +109,7 @@ ast: |
109109
attributes:
110110
assumptions = [Assumption(valid, name=set_trace_func is not used)]
111111
flags = 0
112-
integerCaseEqualAssumption = Assumption(valid, name=inlined Integer#===)
112+
integerCaseEqualAssumption = Assumption(valid, name=core method is not overridden:)
113113
parameters = RubyCallNodeParameters{methodName='===', descriptor=NoKeywordArgumentsDescriptor, isSplatted=false, ignoreVisibility=true, isVCall=false, isSafeNavigation=false, isAttrAssign=false}
114114
sourceCharIndex = -1
115115
sourceLength = 0

spec/truffle/parsing/fixtures/case/with_expression_and_when/with_string_literal_in_when_clause.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ ast: |
2020
attributes:
2121
assumptions = [Assumption(valid, name=set_trace_func is not used)]
2222
flags = 0
23-
integerCaseEqualAssumption = Assumption(valid, name=inlined Integer#===)
23+
integerCaseEqualAssumption = Assumption(valid, name=core method is not overridden:)
2424
parameters = RubyCallNodeParameters{methodName='===', descriptor=NoKeywordArgumentsDescriptor, isSplatted=false, ignoreVisibility=true, isVCall=false, isSafeNavigation=false, isAttrAssign=false}
2525
sourceCharIndex = -1
2626
sourceLength = 0

spec/truffle/parsing/fixtures/complex_numbers/with_rational_and_imaginary_parts.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ ruby: |
88
ast: |
99
InlinedAddNodeGen
1010
attributes:
11-
assumptions = [Assumption(valid, name=set_trace_func is not used), Assumption(valid, name=inlined Integer#+), Assumption(valid, name=inlined Float#+)]
11+
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:)]
1212
flags = 1
1313
parameters = RubyCallNodeParameters{methodName='+', descriptor=NoKeywordArgumentsDescriptor, isSplatted=false, ignoreVisibility=false, isVCall=false, isSafeNavigation=false, isAttrAssign=false}
1414
sourceCharIndex = 0

spec/truffle/parsing/fixtures/method_calls/special_cases/method_%.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ ruby: |
66
ast: |
77
InlinedModNodeGen
88
attributes:
9-
assumptions = [Assumption(valid, name=set_trace_func is not used), Assumption(valid, name=inlined Integer#%), Assumption(valid, name=inlined Float#%)]
9+
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:)]
1010
flags = 1
1111
parameters = RubyCallNodeParameters{methodName='%', descriptor=NoKeywordArgumentsDescriptor, isSplatted=false, ignoreVisibility=false, isVCall=false, isSafeNavigation=false, isAttrAssign=false}
1212
sourceCharIndex = 0

spec/truffle/parsing/fixtures/method_calls/special_cases/method_&.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ ruby: |
66
ast: |
77
InlinedBitAndNodeGen
88
attributes:
9-
assumptions = [Assumption(valid, name=set_trace_func is not used), Assumption(valid, name=inlined Integer#&)]
9+
assumptions = [Assumption(valid, name=set_trace_func is not used), Assumption(valid, name=core method is not overridden:)]
1010
flags = 1
1111
parameters = RubyCallNodeParameters{methodName='&', descriptor=NoKeywordArgumentsDescriptor, isSplatted=false, ignoreVisibility=false, isVCall=false, isSafeNavigation=false, isAttrAssign=false}
1212
sourceCharIndex = 0

spec/truffle/parsing/fixtures/method_calls/special_cases/method_*.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ ruby: |
66
ast: |
77
InlinedMulNodeGen
88
attributes:
9-
assumptions = [Assumption(valid, name=set_trace_func is not used), Assumption(valid, name=inlined Integer#*), Assumption(valid, name=inlined Float#*)]
9+
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:)]
1010
flags = 1
1111
parameters = RubyCallNodeParameters{methodName='*', descriptor=NoKeywordArgumentsDescriptor, isSplatted=false, ignoreVisibility=false, isVCall=false, isSafeNavigation=false, isAttrAssign=false}
1212
sourceCharIndex = 0

spec/truffle/parsing/fixtures/method_calls/special_cases/method_+.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ ruby: |
66
ast: |
77
InlinedAddNodeGen
88
attributes:
9-
assumptions = [Assumption(valid, name=set_trace_func is not used), Assumption(valid, name=inlined Integer#+), Assumption(valid, name=inlined Float#+)]
9+
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:)]
1010
flags = 1
1111
parameters = RubyCallNodeParameters{methodName='+', descriptor=NoKeywordArgumentsDescriptor, isSplatted=false, ignoreVisibility=false, isVCall=false, isSafeNavigation=false, isAttrAssign=false}
1212
sourceCharIndex = 0

spec/truffle/parsing/fixtures/method_calls/special_cases/method_-.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ ruby: |
66
ast: |
77
InlinedSubNodeGen
88
attributes:
9-
assumptions = [Assumption(valid, name=set_trace_func is not used), Assumption(valid, name=inlined Integer#-), Assumption(valid, name=inlined Float#-)]
9+
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:)]
1010
flags = 1
1111
parameters = RubyCallNodeParameters{methodName='-', descriptor=NoKeywordArgumentsDescriptor, isSplatted=false, ignoreVisibility=false, isVCall=false, isSafeNavigation=false, isAttrAssign=false}
1212
sourceCharIndex = 0

spec/truffle/parsing/fixtures/method_calls/special_cases/method_-@.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ ruby: |
77
ast: |
88
InlinedNegNodeGen
99
attributes:
10-
assumptions = [Assumption(valid, name=set_trace_func is not used), Assumption(valid, name=inlined Integer#-@), Assumption(valid, name=inlined Float#-@)]
10+
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:)]
1111
flags = 1
1212
parameters = RubyCallNodeParameters{methodName='-@', descriptor=NoKeywordArgumentsDescriptor, isSplatted=false, ignoreVisibility=false, isVCall=false, isSafeNavigation=false, isAttrAssign=false}
1313
sourceCharIndex = 14

spec/truffle/parsing/fixtures/method_calls/special_cases/method_<.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ ruby: |
66
ast: |
77
InlinedLessThanNodeGen
88
attributes:
9-
assumptions = [Assumption(valid, name=set_trace_func is not used), Assumption(valid, name=inlined Integer#<), Assumption(valid, name=inlined Float#<)]
9+
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:)]
1010
flags = 1
1111
parameters = RubyCallNodeParameters{methodName='<', descriptor=NoKeywordArgumentsDescriptor, isSplatted=false, ignoreVisibility=false, isVCall=false, isSafeNavigation=false, isAttrAssign=false}
1212
sourceCharIndex = 0

spec/truffle/parsing/fixtures/method_calls/special_cases/method_<<.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ ruby: |
66
ast: |
77
InlinedLeftShiftNodeGen
88
attributes:
9-
assumptions = [Assumption(valid, name=set_trace_func is not used), Assumption(valid, name=inlined Integer#<<)]
9+
assumptions = [Assumption(valid, name=set_trace_func is not used), Assumption(valid, name=core method is not overridden:)]
1010
flags = 1
1111
parameters = RubyCallNodeParameters{methodName='<<', descriptor=NoKeywordArgumentsDescriptor, isSplatted=false, ignoreVisibility=false, isVCall=false, isSafeNavigation=false, isAttrAssign=false}
1212
sourceCharIndex = 0

spec/truffle/parsing/fixtures/method_calls/special_cases/method_<=.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ ruby: |
66
ast: |
77
InlinedLessOrEqualNodeGen
88
attributes:
9-
assumptions = [Assumption(valid, name=set_trace_func is not used), Assumption(valid, name=inlined Integer#<=), Assumption(valid, name=inlined Float#<=)]
9+
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:)]
1010
flags = 1
1111
parameters = RubyCallNodeParameters{methodName='<=', descriptor=NoKeywordArgumentsDescriptor, isSplatted=false, ignoreVisibility=false, isVCall=false, isSafeNavigation=false, isAttrAssign=false}
1212
sourceCharIndex = 0

spec/truffle/parsing/fixtures/method_calls/special_cases/method_==.yaml

+2-2
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ ast: |
88
attributes:
99
assumptions = [Assumption(valid, name=set_trace_func is not used)]
1010
flags = 1
11-
floatEqualAssumption = Assumption(valid, name=inlined Float#==)
12-
integerEqualAssumption = Assumption(valid, name=inlined Integer#==)
11+
floatEqualAssumption = Assumption(valid, name=core method is not overridden:)
12+
integerEqualAssumption = Assumption(valid, name=core method is not overridden:)
1313
parameters = RubyCallNodeParameters{methodName='==', descriptor=NoKeywordArgumentsDescriptor, isSplatted=false, ignoreVisibility=false, isVCall=false, isSafeNavigation=false, isAttrAssign=false}
1414
sourceCharIndex = 0
1515
sourceLength = 6

spec/truffle/parsing/fixtures/method_calls/special_cases/method_===.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ ast: |
88
attributes:
99
assumptions = [Assumption(valid, name=set_trace_func is not used)]
1010
flags = 1
11-
integerCaseEqualAssumption = Assumption(valid, name=inlined Integer#===)
11+
integerCaseEqualAssumption = Assumption(valid, name=core method is not overridden:)
1212
parameters = RubyCallNodeParameters{methodName='===', descriptor=NoKeywordArgumentsDescriptor, isSplatted=false, ignoreVisibility=false, isVCall=false, isSafeNavigation=false, isAttrAssign=false}
1313
sourceCharIndex = 0
1414
sourceLength = 7

spec/truffle/parsing/fixtures/method_calls/special_cases/method_>.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ ruby: |
66
ast: |
77
InlinedGreaterThanNodeGen
88
attributes:
9-
assumptions = [Assumption(valid, name=set_trace_func is not used), Assumption(valid, name=inlined Integer#>), Assumption(valid, name=inlined Float#>)]
9+
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:)]
1010
flags = 1
1111
parameters = RubyCallNodeParameters{methodName='>', descriptor=NoKeywordArgumentsDescriptor, isSplatted=false, ignoreVisibility=false, isVCall=false, isSafeNavigation=false, isAttrAssign=false}
1212
sourceCharIndex = 0

spec/truffle/parsing/fixtures/method_calls/special_cases/method_>=.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ ruby: |
66
ast: |
77
InlinedGreaterOrEqualNodeGen
88
attributes:
9-
assumptions = [Assumption(valid, name=set_trace_func is not used), Assumption(valid, name=inlined Integer#>=), Assumption(valid, name=inlined Float#>=)]
9+
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:)]
1010
flags = 1
1111
parameters = RubyCallNodeParameters{methodName='>=', descriptor=NoKeywordArgumentsDescriptor, isSplatted=false, ignoreVisibility=false, isVCall=false, isSafeNavigation=false, isAttrAssign=false}
1212
sourceCharIndex = 0

spec/truffle/parsing/fixtures/method_calls/special_cases/method_>>.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ ruby: |
66
ast: |
77
InlinedRightShiftNodeGen
88
attributes:
9-
assumptions = [Assumption(valid, name=set_trace_func is not used), Assumption(valid, name=inlined Integer#>>)]
9+
assumptions = [Assumption(valid, name=set_trace_func is not used), Assumption(valid, name=core method is not overridden:)]
1010
flags = 1
1111
parameters = RubyCallNodeParameters{methodName='>>', descriptor=NoKeywordArgumentsDescriptor, isSplatted=false, ignoreVisibility=false, isVCall=false, isSafeNavigation=false, isAttrAssign=false}
1212
sourceCharIndex = 0

spec/truffle/parsing/fixtures/method_calls/special_cases/method_nil?.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ ruby: |
77
ast: |
88
InlinedIsNilNodeGen
99
attributes:
10-
assumptions = [Assumption(valid, name=set_trace_func is not used), Assumption(valid, name=inlined Nil#nil?)]
10+
assumptions = [Assumption(valid, name=set_trace_func is not used), Assumption(valid, name=core method is not overridden:)]
1111
flags = 1
1212
parameters = RubyCallNodeParameters{methodName='nil?', descriptor=NoKeywordArgumentsDescriptor, isSplatted=false, ignoreVisibility=false, isVCall=false, isSafeNavigation=false, isAttrAssign=false}
1313
sourceCharIndex = 14

spec/truffle/parsing/fixtures/method_calls/special_cases/method_slash.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ ruby: |
66
ast: |
77
InlinedDivNodeGen
88
attributes:
9-
assumptions = [Assumption(valid, name=set_trace_func is not used), Assumption(valid, name=inlined Integer#/), Assumption(valid, name=inlined Float#/)]
9+
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:)]
1010
flags = 1
1111
parameters = RubyCallNodeParameters{methodName='/', descriptor=NoKeywordArgumentsDescriptor, isSplatted=false, ignoreVisibility=false, isVCall=false, isSafeNavigation=false, isAttrAssign=false}
1212
sourceCharIndex = 0

spec/truffle/parsing/fixtures/method_calls/special_cases/method_|.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ ruby: |
66
ast: |
77
InlinedBitOrNodeGen
88
attributes:
9-
assumptions = [Assumption(valid, name=set_trace_func is not used), Assumption(valid, name=inlined Integer#|)]
9+
assumptions = [Assumption(valid, name=set_trace_func is not used), Assumption(valid, name=core method is not overridden:)]
1010
flags = 1
1111
parameters = RubyCallNodeParameters{methodName='|', descriptor=NoKeywordArgumentsDescriptor, isSplatted=false, ignoreVisibility=false, isVCall=false, isSafeNavigation=false, isAttrAssign=false}
1212
sourceCharIndex = 0

spec/truffle/parsing/fixtures/operators/+=/attribute_assignment.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ ast: |
104104
arguments = [
105105
InlinedAddNodeGen
106106
attributes:
107-
assumptions = [Assumption(valid, name=set_trace_func is not used), Assumption(valid, name=inlined Integer#+), Assumption(valid, name=inlined Float#+)]
107+
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:)]
108108
flags = 0
109109
parameters = RubyCallNodeParameters{methodName='+', descriptor=NoKeywordArgumentsDescriptor, isSplatted=false, ignoreVisibility=false, isVCall=false, isSafeNavigation=false, isAttrAssign=false}
110110
sourceCharIndex = 0

spec/truffle/parsing/fixtures/operators/+=/attribute_assignment_with_explicit_self_receiver.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ ast: |
6464
arguments = [
6565
InlinedAddNodeGen
6666
attributes:
67-
assumptions = [Assumption(valid, name=set_trace_func is not used), Assumption(valid, name=inlined Integer#+), Assumption(valid, name=inlined Float#+)]
67+
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:)]
6868
flags = 0
6969
parameters = RubyCallNodeParameters{methodName='+', descriptor=NoKeywordArgumentsDescriptor, isSplatted=false, ignoreVisibility=false, isVCall=false, isSafeNavigation=false, isAttrAssign=false}
7070
sourceCharIndex = 0

0 commit comments

Comments
 (0)