From 1e9430a6f9b6469e9ed37d525f6200d6fbb03928 Mon Sep 17 00:00:00 2001 From: Niall Gallagher Date: Sun, 21 Aug 2016 13:36:58 +0100 Subject: [PATCH] Fix instance allocation --- .../compile/StaticConstructorTest.java | 1 + .../core/define/PrimitiveInstance.java | 2 +- .../snapscript/tree/define/AnyDefinition.java | 8 ++++++++ .../tree/define/InstanceAllocator.java | 11 ++++++----- .../snapscript/tree/define/NewInvocation.java | 18 ------------------ .../tree/define/ObjectInstanceBuilder.java | 11 ++++++++--- .../tree/define/StaticConstantCollector.java | 6 +++--- 7 files changed, 27 insertions(+), 30 deletions(-) diff --git a/snap-compile/src/test/java/org/snapscript/compile/StaticConstructorTest.java b/snap-compile/src/test/java/org/snapscript/compile/StaticConstructorTest.java index e22837c5..703e3264 100644 --- a/snap-compile/src/test/java/org/snapscript/compile/StaticConstructorTest.java +++ b/snap-compile/src/test/java/org/snapscript/compile/StaticConstructorTest.java @@ -19,6 +19,7 @@ public class StaticConstructorTest extends TestCase { " }\n"+ "}\n"+ "var x = new X();\n"+ + "assert x.pattern == '.*';\n"+ "println(x.pattern);\n"; public void testThis() throws Exception { diff --git a/snap-core/src/main/java/org/snapscript/core/define/PrimitiveInstance.java b/snap-core/src/main/java/org/snapscript/core/define/PrimitiveInstance.java index 21632b3c..5d822a4b 100644 --- a/snap-core/src/main/java/org/snapscript/core/define/PrimitiveInstance.java +++ b/snap-core/src/main/java/org/snapscript/core/define/PrimitiveInstance.java @@ -23,7 +23,7 @@ public PrimitiveInstance(Module module, Model model, Scope scope, Type type) { @Override public Instance getInner() { - return new ObjectInstance(module, model, this, type); + return new CompoundInstance(module, model, this, this, type); } @Override diff --git a/snap-tree/src/main/java/org/snapscript/tree/define/AnyDefinition.java b/snap-tree/src/main/java/org/snapscript/tree/define/AnyDefinition.java index 4d23c284..6904d54d 100644 --- a/snap-tree/src/main/java/org/snapscript/tree/define/AnyDefinition.java +++ b/snap-tree/src/main/java/org/snapscript/tree/define/AnyDefinition.java @@ -9,6 +9,7 @@ import static org.snapscript.core.Reserved.METHOD_TO_STRING; import static org.snapscript.core.Reserved.METHOD_WAIT; import static org.snapscript.core.Reserved.TYPE_CONSTRUCTOR; +import static org.snapscript.core.Reserved.TYPE_THIS; import java.util.List; @@ -17,8 +18,11 @@ import org.snapscript.core.Result; import org.snapscript.core.ResultType; import org.snapscript.core.Scope; +import org.snapscript.core.State; import org.snapscript.core.Type; import org.snapscript.core.TypeLoader; +import org.snapscript.core.Value; +import org.snapscript.core.ValueType; import org.snapscript.core.define.Instance; import org.snapscript.core.function.Function; import org.snapscript.core.function.Invocation; @@ -72,6 +76,10 @@ public NewInvocation() { public Result invoke(Scope scope, Object object, Object... list) throws Exception { Type real = (Type)list[0]; Instance instance = builder.create(scope, real); + State state = instance.getState(); + Value value = ValueType.getReference(object, real); // this needs to be a blank + + state.addValue(TYPE_THIS, value); // reference to 'this' return ResultType.getNormal(instance); } diff --git a/snap-tree/src/main/java/org/snapscript/tree/define/InstanceAllocator.java b/snap-tree/src/main/java/org/snapscript/tree/define/InstanceAllocator.java index 1256720f..fb6d7e8d 100644 --- a/snap-tree/src/main/java/org/snapscript/tree/define/InstanceAllocator.java +++ b/snap-tree/src/main/java/org/snapscript/tree/define/InstanceAllocator.java @@ -6,7 +6,6 @@ import org.snapscript.core.State; import org.snapscript.core.Type; import org.snapscript.core.Value; -import org.snapscript.core.ValueType; import org.snapscript.core.define.Initializer; import org.snapscript.core.define.Instance; import org.snapscript.core.function.Invocation; @@ -28,10 +27,12 @@ public Instance allocate(Scope scope, Instance base, Object... list) throws Exce Type real = (Type)list[0]; Instance object = builder.create(scope, base, real);// we need to pass the base type up!! State state = object.getState(); - Value constant = ValueType.getReference(object, real); // this needs to be a blank - - state.addValue(TYPE_THIS, constant); // reference to 'this' - initializer.execute(object, real); + Value value = state.getValue(TYPE_THIS); + + if(object != base) { // false if this(...) called + initializer.execute(object, real); + } + value.setValue(object); // set the 'this' variable invocation.invoke(object, object, list); return object; diff --git a/snap-tree/src/main/java/org/snapscript/tree/define/NewInvocation.java b/snap-tree/src/main/java/org/snapscript/tree/define/NewInvocation.java index aa4d0ee0..46372ffc 100644 --- a/snap-tree/src/main/java/org/snapscript/tree/define/NewInvocation.java +++ b/snap-tree/src/main/java/org/snapscript/tree/define/NewInvocation.java @@ -1,15 +1,11 @@ package org.snapscript.tree.define; -import static org.snapscript.core.Reserved.TYPE_THIS; - import java.util.concurrent.atomic.AtomicBoolean; import org.snapscript.core.Result; import org.snapscript.core.ResultType; import org.snapscript.core.Scope; -import org.snapscript.core.State; import org.snapscript.core.Type; -import org.snapscript.core.Value; import org.snapscript.core.define.Initializer; import org.snapscript.core.define.Instance; import org.snapscript.core.function.Invocation; @@ -43,20 +39,6 @@ public Result invoke(Scope scope, Instance base, Object... list) throws Exceptio initializer.compile(scope, type); // static stuff if needed } Instance result = allocator.allocate(scope, inner, list); - - if(real == type){ - Instance next = result; - - while(next != null){ - State state = next.getState(); - Value value = state.getValue(TYPE_THIS); - - if(value != null){ - value.setValue(result); - } - next = next.getSuper(); - } - } return ResultType.getNormal(result); } } diff --git a/snap-tree/src/main/java/org/snapscript/tree/define/ObjectInstanceBuilder.java b/snap-tree/src/main/java/org/snapscript/tree/define/ObjectInstanceBuilder.java index 01477b88..7c0329ec 100644 --- a/snap-tree/src/main/java/org/snapscript/tree/define/ObjectInstanceBuilder.java +++ b/snap-tree/src/main/java/org/snapscript/tree/define/ObjectInstanceBuilder.java @@ -16,9 +16,14 @@ public ObjectInstanceBuilder(Type type) { } public Instance create(Scope scope, Instance base, Type real) throws Exception { - Model model = scope.getModel(); - Module module = type.getModule(); + Class actual = base.getClass(); - return new ObjectInstance(module, model, base, real); // create the first instance + if(actual != ObjectInstance.class) { // false if this(...) is called + Model model = scope.getModel(); + Module module = type.getModule(); + + return new ObjectInstance(module, model, base, real); // create the first instance + } + return base; } } diff --git a/snap-tree/src/main/java/org/snapscript/tree/define/StaticConstantCollector.java b/snap-tree/src/main/java/org/snapscript/tree/define/StaticConstantCollector.java index 57936319..2a48cad3 100644 --- a/snap-tree/src/main/java/org/snapscript/tree/define/StaticConstantCollector.java +++ b/snap-tree/src/main/java/org/snapscript/tree/define/StaticConstantCollector.java @@ -35,9 +35,9 @@ public void collect(Type type) throws Exception { Scope scope = type.getScope(); State state = scope.getState(); - for(Type base : types) { - if(type != base) { - List properties = base.getProperties(); + for(Type next : types) { + if(next != type) { + List properties = next.getProperties(); for(Property property : properties) { String name = property.getName();