mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
131 lines
3.7 KiB
Ruby
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
|