Skip to content

Commit 4bfa8c8

Browse files
committed
Fix an infinite recursion issue with native extensions that redefine frozen?.
MRI defines `frozen?` with `rb_obj_frozen_p`, which in turn, uses `RB_OBJ_FROZEN`. Since TruffleRuby doesn't have flag bits in an object header like MRI does, we implement `RB_OBJ_FROZEN` with `rb_obj_frozen_p`, which would lead to an infinite loop if a native extension redefined `frozen?` in terms of `RB_OBJ_FROZEN`. We break the loop by introducing a new primitive, which a native extension would not be able to redefine.
1 parent a75777d commit 4bfa8c8

File tree

3 files changed

+11
-1
lines changed

3 files changed

+11
-1
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ New features:
66
Bug fixes:
77

88
* Fix `Range#cover?` on begin-less ranges and non-integer values (@nirvdrum, @rwstauner).
9+
* Fix a possible case of infinite recursion when implementing `frozen?` in a native extension (@nirvdrum).
910

1011
Compatibility:
1112

lib/truffle/truffle/cext.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -471,7 +471,7 @@ def rb_obj_freeze(obj)
471471
end
472472

473473
def rb_obj_frozen_p(object)
474-
object.frozen?
474+
Primitive.frozen?(object)
475475
end
476476

477477
def rb_obj_id(object)

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,15 @@ Object freeze(Object self,
161161
}
162162
}
163163

164+
@Primitive(name = "frozen?")
165+
public abstract static class IsFrozenPrimitive extends PrimitiveArrayArgumentsNode {
166+
@Specialization
167+
boolean isFrozen(Object self,
168+
@Cached IsFrozenNode isFrozenNode) {
169+
return isFrozenNode.execute(self);
170+
}
171+
}
172+
164173
@Primitive(name = "immediate_value?")
165174
public abstract static class IsImmediateValueNode extends PrimitiveArrayArgumentsNode {
166175

0 commit comments

Comments
 (0)