Implement copy-on-write semantics for VarSet, speeding up Environment cloning
This commit is contained in:
1 parent
5924154229
commit
1a5e9ddaa6
2 files changed
+95
-32
No files matched your search
+46
-11
@@ -21,9 +21,9 @@ module Rscons
|
||||
end
|
||||
|
||||
describe "#[]" do
|
||||
v = VarSet.new({"fuz" => "a string", "foo" => 42, "bar" => :baz,
|
||||
"qax" => [3, 6], "qux" => {a: :b}})
|
||||
it "allows accessing a variable with its verbatim value if type is not specified" do
|
||||
v = VarSet.new({"fuz" => "a string", "foo" => 42, "bar" => :baz,
|
||||
"qax" => [3, 6], "qux" => {a: :b}})
|
||||
v["fuz"].should == "a string"
|
||||
v["foo"].should == 42
|
||||
v["bar"].should == :baz
|
||||
@@ -44,11 +44,21 @@ module Rscons
|
||||
describe "#include?" do
|
||||
it "returns whether the variable is in the VarSet" do
|
||||
v = VarSet.new("CFLAGS" => [], :foo => :bar)
|
||||
|
||||
expect(v.include?("CFLAGS")).to be_true
|
||||
expect(v.include?(:CFLAGS)).to be_false
|
||||
expect(v.include?(:foo)).to be_true
|
||||
expect(v.include?("foo")).to be_false
|
||||
expect(v.include?("bar")).to be_false
|
||||
|
||||
v2 = v.clone
|
||||
v2.append("bar" => [])
|
||||
|
||||
expect(v2.include?("CFLAGS")).to be_true
|
||||
expect(v2.include?(:CFLAGS)).to be_false
|
||||
expect(v2.include?(:foo)).to be_true
|
||||
expect(v2.include?("foo")).to be_false
|
||||
expect(v2.include?("bar")).to be_true
|
||||
end
|
||||
end
|
||||
|
||||
@@ -56,14 +66,26 @@ module Rscons
|
||||
it "adds values from a Hash to the VarSet" do
|
||||
v = VarSet.new("LDFLAGS" => "-lgcc")
|
||||
v.append("LIBS" => "gcc", "LIBPATH" => ["mylibs"])
|
||||
v.vars.keys.should =~ ["LDFLAGS", "LIBS", "LIBPATH"]
|
||||
expect(v["LDFLAGS"]).to eq("-lgcc")
|
||||
expect(v["LIBS"]).to eq("gcc")
|
||||
expect(v["LIBPATH"]).to eq(["mylibs"])
|
||||
end
|
||||
|
||||
it "adds values from another VarSet to the VarSet" do
|
||||
v = VarSet.new("CPPPATH" => ["mydir"])
|
||||
v2 = VarSet.new("CFLAGS" => ["-O0"], "CPPPATH" => ["different_dir"])
|
||||
v.append(v2)
|
||||
v.vars.keys.should =~ ["CPPPATH", "CFLAGS"]
|
||||
v["CPPPATH"].should == ["different_dir"]
|
||||
expect(v["CFLAGS"]).to eq(["-O0"])
|
||||
expect(v["CPPPATH"]).to eq(["different_dir"])
|
||||
end
|
||||
|
||||
it "does not pick up subsequent variable changes from a given VarSet" do
|
||||
v = VarSet.new("dirs" => ["a"])
|
||||
v2 = VarSet.new
|
||||
v2.append(v)
|
||||
v["dirs"] << "b"
|
||||
expect(v["dirs"]).to eq(["a", "b"])
|
||||
expect(v2["dirs"]).to eq(["a"])
|
||||
end
|
||||
end
|
||||
|
||||
@@ -71,17 +93,30 @@ module Rscons
|
||||
it "returns a new VarSet merged with the given Hash" do
|
||||
v = VarSet.new("foo" => "yoda")
|
||||
v2 = v.merge("baz" => "qux")
|
||||
v.vars.keys.should == ["foo"]
|
||||
v2.vars.keys.should =~ ["foo", "baz"]
|
||||
expect(v["foo"]).to eq("yoda")
|
||||
expect(v2["foo"]).to eq("yoda")
|
||||
expect(v2["baz"]).to eq("qux")
|
||||
end
|
||||
|
||||
it "returns a new VarSet merged with the given VarSet" do
|
||||
v = VarSet.new("foo" => ["a", "b"], "bar" => 42)
|
||||
v2 = v.merge(VarSet.new("bar" => 33, "baz" => :baz))
|
||||
v2["foo"] << "c"
|
||||
v["foo"].should == ["a", "b"]
|
||||
v["bar"].should == 42
|
||||
v2["foo"].should == ["a", "b", "c"]
|
||||
v2["bar"].should == 33
|
||||
expect(v["foo"]).to eq ["a", "b"]
|
||||
expect(v["bar"]).to eq 42
|
||||
expect(v2["foo"]).to eq ["a", "b", "c"]
|
||||
expect(v2["bar"]).to eq 33
|
||||
end
|
||||
|
||||
it "does not pick up subsequent variable changes from a given VarSet" do
|
||||
v = VarSet.new("var" => ["a", "b"], "var2" => ["1", "2"])
|
||||
v["var2"] << "3"
|
||||
v2 = v.clone
|
||||
v["var"] << "c"
|
||||
expect(v["var"]).to eq(["a", "b", "c"])
|
||||
expect(v["var2"]).to eq(["1", "2", "3"])
|
||||
expect(v2["var"]).to eq(["a", "b"])
|
||||
expect(v2["var2"]).to eq(["1", "2", "3"])
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
Reference in new issue
Block a user