Project

General

Profile

Actions

Bug #19536

closed

Frozen status loss when moving objects

Added by peterzhu2118 (Peter Zhu) about 1 year ago. Updated about 1 year ago.

Status:
Closed
Assignee:
-
Target version:
-
[ruby-core:112930]

Description

GitHub PR: https://github.com/ruby/ruby/pull/7553

When objects are moved between size pools, their frozen status is lost in the shape. This will cause the frozen check to be bypassed when there is an inline cache. For example, the following script should raise a FrozenError, but doesn't on Ruby 3.2 and master.

class A
  def add_ivars
    @a = @b = @c = @d = 1
  end

  def set_a
    @a = 10
  end
end

a = A.new
a.add_ivars
a.freeze

b = A.new
b.add_ivars
b.set_a # Set the inline cache in set_a

GC.verify_compaction_references(expand_heap: true, toward: :empty)

a.set_a
Actions #1

Updated by peterzhu2118 (Peter Zhu) about 1 year ago

  • Status changed from Open to Closed

Applied in changeset git|cb22d78354e201ca74eba68a8b4edefb593e6754.


Fix frozen status loss when moving objects

[Bug #19536]

When objects are moved between size pools, their frozen status is lost
in the shape. This will cause the frozen check to be bypassed when there
is an inline cache. For example, the following script should raise a
FrozenError, but doesn't on Ruby 3.2 and master.

class A
  def add_ivars
    @a = @b = @c = @d = 1
  end

  def set_a
    @a = 10
  end
end

a = A.new
a.add_ivars
a.freeze

b = A.new
b.add_ivars
b.set_a # Set the inline cache in set_a

GC.verify_compaction_references(expand_heap: true, toward: :empty)

a.set_a

Updated by naruse (Yui NARUSE) about 1 year ago

  • Backport changed from 2.7: DONTNEED, 3.0: DONTNEED, 3.1: DONTNEED, 3.2: REQUIRED to 2.7: DONTNEED, 3.0: DONTNEED, 3.1: DONTNEED, 3.2: DONE

ruby_3_2 400ccb16eefe4e21c4e3eacab4fd0f208fc5e151 merged revision(s) cb22d78354e201ca74eba68a8b4edefb593e6754.

Actions

Also available in: Atom PDF

Like0
Like0Like0