1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00
ruby--ruby/spec/ruby/library/objectspace/trace_object_allocations_spec.rb
2021-07-29 22:11:21 +02:00

131 lines
3.7 KiB
Ruby

require_relative '../../spec_helper'
require 'objspace'
describe "ObjectSpace.trace_object_allocations" do
it "runs a block" do
ScratchPad.clear
ObjectSpace.trace_object_allocations do
ScratchPad.record :a
end
ScratchPad.recorded.should == :a
end
it "records info for allocation_class_path" do
ObjectSpace.trace_object_allocations do
o = Object.new
ObjectSpace.allocation_class_path(o).should == "Class"
a = [1, 2, 3]
ObjectSpace.allocation_class_path(a).should == nil
end
end
it "records info for allocation_generation" do
ObjectSpace.trace_object_allocations do
o = Object.new
ObjectSpace.allocation_generation(o).should.kind_of?(Integer)
a = [1, 2, 3]
ObjectSpace.allocation_generation(a).should.kind_of?(Integer)
end
end
it "records info for allocation_method_id" do
ObjectSpace.trace_object_allocations do
o = Object.new
ObjectSpace.allocation_method_id(o).should == :new
a = [1, 2, 3]
ObjectSpace.allocation_method_id(a).should == nil
end
end
it "records info for allocation_sourcefile" do
ObjectSpace.trace_object_allocations do
o = Object.new
ObjectSpace.allocation_sourcefile(o).should == __FILE__
a = [1, 2, 3]
ObjectSpace.allocation_sourcefile(a).should == __FILE__
end
end
it "records info for allocation_sourceline" do
ObjectSpace.trace_object_allocations do
o = Object.new
ObjectSpace.allocation_sourceline(o).should == __LINE__ - 1
a = [1, 2, 3]
ObjectSpace.allocation_sourceline(a).should == __LINE__ - 1
end
end
it "can be cleared using trace_object_allocations_clear" do
ObjectSpace.trace_object_allocations do
o = Object.new
ObjectSpace.allocation_class_path(o).should == "Class"
ObjectSpace.trace_object_allocations_clear
ObjectSpace.allocation_class_path(o).should be_nil
end
end
it "does not clears allocation data after returning" do
o = nil
ObjectSpace.trace_object_allocations do
o = Object.new
end
ObjectSpace.allocation_class_path(o).should == "Class"
end
it "can be used without a block using trace_object_allocations_start and _stop" do
ObjectSpace.trace_object_allocations_start
begin
o = Object.new
ObjectSpace.allocation_class_path(o).should == "Class"
a = [1, 2, 3]
ObjectSpace.allocation_class_path(a).should == nil
ensure
ObjectSpace.trace_object_allocations_stop
end
end
it "does not clears allocation data after trace_object_allocations_stop" do
ObjectSpace.trace_object_allocations_start
begin
o = Object.new
ensure
ObjectSpace.trace_object_allocations_stop
end
ObjectSpace.allocation_class_path(o).should == "Class"
end
it "can be nested" do
ObjectSpace.trace_object_allocations do
ObjectSpace.trace_object_allocations do
o = Object.new
ObjectSpace.allocation_class_path(o).should == "Class"
end
end
end
it "can be nested without a block using trace_object_allocations_start and _stop" do
ObjectSpace.trace_object_allocations_start
begin
ObjectSpace.trace_object_allocations_start
begin
o = Object.new
ObjectSpace.allocation_class_path(o).should == "Class"
ensure
ObjectSpace.trace_object_allocations_stop
end
ensure
ObjectSpace.trace_object_allocations_stop
end
end
it "can be nested with more _stop than _start" do
ObjectSpace.trace_object_allocations_start
begin
o = Object.new
ObjectSpace.allocation_class_path(o).should == "Class"
ObjectSpace.trace_object_allocations_stop
ensure
ObjectSpace.trace_object_allocations_stop
end
end
end