Skip to content

Commit 5ed935a

Browse files
committed
Add Primitive.object_freeze
1 parent ac50c7b commit 5ed935a

File tree

3 files changed

+18
-17
lines changed

3 files changed

+18
-17
lines changed

src/main/java/org/truffleruby/core/support/TypeNodes.java

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -67,14 +67,11 @@ public abstract class TypeNodes {
6767

6868
@Primitive(name = "object_kind_of?")
6969
public abstract static class ObjectKindOfNode extends PrimitiveArrayArgumentsNode {
70-
71-
@Child private IsANode isANode = IsANode.create();
72-
7370
@Specialization
74-
protected boolean objectKindOf(Object object, RubyModule module) {
71+
protected boolean objectKindOf(Object object, RubyModule module,
72+
@Cached IsANode isANode) {
7573
return isANode.executeIsA(object, module);
7674
}
77-
7875
}
7976

8077
@Primitive(name = "object_respond_to?")
@@ -93,36 +90,41 @@ protected boolean objectRespondTo(Object object, Object name, boolean includePri
9390

9491
@CoreMethod(names = "object_class", onSingleton = true, required = 1)
9592
public abstract static class ObjectClassNode extends CoreMethodArrayArgumentsNode {
96-
97-
@Child private LogicalClassNode classNode = LogicalClassNode.create();
98-
9993
@Specialization
100-
protected RubyClass objectClass(Object object) {
101-
return classNode.execute(object);
94+
protected RubyClass objectClass(Object object,
95+
@Cached LogicalClassNode logicalClassNode) {
96+
return logicalClassNode.execute(object);
10297
}
103-
10498
}
10599

106100
@Primitive(name = "class_of")
107101
public abstract static class ClassOfNode extends PrimitiveArrayArgumentsNode {
108-
109102
@Specialization
110103
protected RubyClass classOf(Object object,
111104
@Cached MetaClassNode metaClassNode) {
112105
return metaClassNode.execute(object);
113106
}
114-
115107
}
116108

117109
@Primitive(name = "object_equal")
118110
public abstract static class ObjectEqualNode extends PrimitiveArrayArgumentsNode {
119-
120111
@Specialization
121112
protected boolean objectEqual(Object a, Object b,
122113
@Cached ReferenceEqualNode referenceEqualNode) {
123114
return referenceEqualNode.executeReferenceEqual(a, b);
124115
}
116+
}
125117

118+
@Primitive(name = "object_freeze")
119+
public abstract static class ObjectFreezeNode extends PrimitiveArrayArgumentsNode {
120+
@Specialization(limit = "getRubyLibraryCacheLimit()")
121+
protected Object freeze(Object self,
122+
@CachedLibrary("self") RubyLibrary rubyLibrary) {
123+
assert !(self instanceof RubyDynamicObject && ((RubyDynamicObject) self)
124+
.getMetaClass().isSingleton) : "Primitive.object_freeze does not handle instances of singleton classes, see KernelFreezeNode";
125+
rubyLibrary.freeze(self);
126+
return self;
127+
}
126128
}
127129

128130
@Primitive(name = "immediate_value?")
@@ -167,7 +169,6 @@ protected boolean doFallback(Object value) {
167169

168170
@Primitive(name = "nil?")
169171
public abstract static class IsNilNode extends PrimitiveArrayArgumentsNode {
170-
171172
@Specialization
172173
protected boolean isNil(Object value) {
173174
return value == nil;

src/main/ruby/truffleruby/core/complex.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ def Complex.polar(r, theta=0)
116116
def initialize(a, b = 0)
117117
@real = a
118118
@imag = b
119-
freeze
119+
Primitive.object_freeze(self)
120120
end
121121

122122
def -@

src/main/ruby/truffleruby/core/rational.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -392,7 +392,7 @@ def self.reduce(num, den)
392392
def initialize(num, den)
393393
@numerator = num
394394
@denominator = den
395-
freeze
395+
Primitive.object_freeze(self)
396396
end
397397
private :initialize
398398

0 commit comments

Comments
 (0)