From 24862d2d06c6a9b9823ac6692d4504cace533eeb Mon Sep 17 00:00:00 2001 From: Douglas Campos Date: Thu, 29 Dec 2011 00:40:19 -0200 Subject: [PATCH 01/11] implementing basic object literals --- .../main/java/org/dynjs/parser/Executor.java | 3 +- .../statement/ObjectLiteralStatement.java | 32 +++++++++++++++++++ .../java/org/dynjs/runtime/DynJSTest.java | 9 ++++++ 3 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 dynjs/src/main/java/org/dynjs/parser/statement/ObjectLiteralStatement.java diff --git a/dynjs/src/main/java/org/dynjs/parser/Executor.java b/dynjs/src/main/java/org/dynjs/parser/Executor.java index 0d38a1561..0afaca309 100644 --- a/dynjs/src/main/java/org/dynjs/parser/Executor.java +++ b/dynjs/src/main/java/org/dynjs/parser/Executor.java @@ -34,6 +34,7 @@ import org.dynjs.parser.statement.NotOperationStatement; import org.dynjs.parser.statement.NullLiteralStatement; import org.dynjs.parser.statement.NumberLiteralStatement; +import org.dynjs.parser.statement.ObjectLiteralStatement; import org.dynjs.parser.statement.OperationAssignmentStatement; import org.dynjs.parser.statement.PostDecrementStatement; import org.dynjs.parser.statement.PostIncrementStatement; @@ -412,7 +413,7 @@ public Statement labelledStatement(String label, Statement statement) { } public Statement objectValue(List namedValues) { - return null; + return new ObjectLiteralStatement(namedValues); } public Statement propertyNameId(String id) { diff --git a/dynjs/src/main/java/org/dynjs/parser/statement/ObjectLiteralStatement.java b/dynjs/src/main/java/org/dynjs/parser/statement/ObjectLiteralStatement.java new file mode 100644 index 000000000..2ce28c5ae --- /dev/null +++ b/dynjs/src/main/java/org/dynjs/parser/statement/ObjectLiteralStatement.java @@ -0,0 +1,32 @@ +package org.dynjs.parser.statement; + +import me.qmx.jitescript.CodeBlock; +import org.dynjs.parser.Statement; +import org.dynjs.runtime.DynObject; + +import java.util.List; + +import static me.qmx.jitescript.util.CodegenUtils.p; +import static me.qmx.jitescript.util.CodegenUtils.sig; + +public class ObjectLiteralStatement implements Statement { + + private final List namedValues; + + public ObjectLiteralStatement(List namedValues) { + this.namedValues = namedValues; + } + + @Override + public CodeBlock getCodeBlock() { + CodeBlock obj = CodeBlock.newCodeBlock() + .newobj(p(DynObject.class)) + .dup() + .invokespecial(p(DynObject.class), "", sig(void.class)) + .astore(7); + for (Statement namedValue : namedValues) { + obj = obj.append(namedValue.getCodeBlock()); + } + return obj.aload(7); + } +} diff --git a/dynjs/src/test/java/org/dynjs/runtime/DynJSTest.java b/dynjs/src/test/java/org/dynjs/runtime/DynJSTest.java index e9e0be5bb..b05bb6bb5 100644 --- a/dynjs/src/test/java/org/dynjs/runtime/DynJSTest.java +++ b/dynjs/src/test/java/org/dynjs/runtime/DynJSTest.java @@ -205,6 +205,15 @@ public void testLogicalOperators() { check("var result = true && true;", true); } + @Test + public void testObjectLiterals() { + dynJS.eval(context, "var result = {};"); + assertThat(context.getScope().resolve("result")) + .isNotNull() + .isInstanceOf(DynObject.class); + + } + private void check(String scriptlet) { check(scriptlet, true); } From f8f0e7888ffd355396570a77cf6cf43a46a5b014 Mon Sep 17 00:00:00 2001 From: Douglas Campos Date: Thu, 29 Dec 2011 01:09:14 -0200 Subject: [PATCH 02/11] fixing test name --- dynjs/src/test/java/org/dynjs/runtime/DynJSTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dynjs/src/test/java/org/dynjs/runtime/DynJSTest.java b/dynjs/src/test/java/org/dynjs/runtime/DynJSTest.java index b05bb6bb5..399382a1f 100644 --- a/dynjs/src/test/java/org/dynjs/runtime/DynJSTest.java +++ b/dynjs/src/test/java/org/dynjs/runtime/DynJSTest.java @@ -206,7 +206,7 @@ public void testLogicalOperators() { } @Test - public void testObjectLiterals() { + public void testEmptyObjectLiteral() { dynJS.eval(context, "var result = {};"); assertThat(context.getScope().resolve("result")) .isNotNull() From 21706dd5ad4931725e53576e73edd3e89863078b Mon Sep 17 00:00:00 2001 From: Douglas Campos Date: Thu, 29 Dec 2011 01:12:46 -0200 Subject: [PATCH 03/11] making sure we're passing this object as the scope --- .../org/dynjs/parser/statement/ObjectLiteralStatement.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/dynjs/src/main/java/org/dynjs/parser/statement/ObjectLiteralStatement.java b/dynjs/src/main/java/org/dynjs/parser/statement/ObjectLiteralStatement.java index 2ce28c5ae..4efdeb08b 100644 --- a/dynjs/src/main/java/org/dynjs/parser/statement/ObjectLiteralStatement.java +++ b/dynjs/src/main/java/org/dynjs/parser/statement/ObjectLiteralStatement.java @@ -25,7 +25,9 @@ public CodeBlock getCodeBlock() { .invokespecial(p(DynObject.class), "", sig(void.class)) .astore(7); for (Statement namedValue : namedValues) { - obj = obj.append(namedValue.getCodeBlock()); + + obj = obj.aload(7) + .append(namedValue.getCodeBlock()); } return obj.aload(7); } From 4d69163dd53c3fc8aaed7e2cbe1273f03316fed4 Mon Sep 17 00:00:00 2001 From: Douglas Campos Date: Thu, 29 Dec 2011 01:13:16 -0200 Subject: [PATCH 04/11] object literals successfully being populated --- .../main/java/org/dynjs/parser/Executor.java | 17 ++++++++++++++--- .../test/java/org/dynjs/runtime/DynJSTest.java | 9 +++++++++ 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/dynjs/src/main/java/org/dynjs/parser/Executor.java b/dynjs/src/main/java/org/dynjs/parser/Executor.java index 0afaca309..b0ee983bd 100644 --- a/dynjs/src/main/java/org/dynjs/parser/Executor.java +++ b/dynjs/src/main/java/org/dynjs/parser/Executor.java @@ -17,6 +17,7 @@ package org.dynjs.parser; import me.qmx.internal.org.objectweb.asm.Opcodes; +import me.qmx.jitescript.CodeBlock; import org.antlr.runtime.tree.CommonTree; import org.dynjs.compiler.DynJSCompiler; import org.dynjs.parser.statement.BlockStatement; @@ -51,6 +52,8 @@ import java.util.List; +import static me.qmx.jitescript.util.CodegenUtils.sig; + public class Executor implements Opcodes { private DynJSCompiler compiler = new DynJSCompiler(); @@ -417,7 +420,7 @@ public Statement objectValue(List namedValues) { } public Statement propertyNameId(String id) { - return null; + return new StringLiteralStatement(id); } public Statement propertyNameString(String string) { @@ -428,8 +431,16 @@ public Statement propertyNameNumeric(Statement numericLiteral) { return null; } - public Statement namedValue(Statement propertyName, Statement expr) { - return null; + public Statement namedValue(final Statement propertyName, final Statement expr) { + return new Statement() { + @Override + public CodeBlock getCodeBlock() { + return CodeBlock.newCodeBlock() + .append(propertyName.getCodeBlock()) + .append(expr.getCodeBlock()) + .invokeinterface(DynJSCompiler.Types.Scope, "define", sig(void.class, String.class, Object.class)); + } + }; } public Statement arrayLiteral(List exprs) { diff --git a/dynjs/src/test/java/org/dynjs/runtime/DynJSTest.java b/dynjs/src/test/java/org/dynjs/runtime/DynJSTest.java index 399382a1f..b75b520a9 100644 --- a/dynjs/src/test/java/org/dynjs/runtime/DynJSTest.java +++ b/dynjs/src/test/java/org/dynjs/runtime/DynJSTest.java @@ -211,7 +211,16 @@ public void testEmptyObjectLiteral() { assertThat(context.getScope().resolve("result")) .isNotNull() .isInstanceOf(DynObject.class); + } + @Test + public void testBasicObjectLiteral() { + dynJS.eval(context, "var x = {w:true}; var result = x;"); + final Object result = context.getScope().resolve("result"); + assertThat(result) + .isNotNull() + .isInstanceOf(DynObject.class); + assertThat(((DynObject) result).resolve("w")).isInstanceOf(Boolean.class).isEqualTo(Boolean.TRUE); } private void check(String scriptlet) { From 29f29f981e048ef88e75f51f0a225533b2bebaba Mon Sep 17 00:00:00 2001 From: Douglas Campos Date: Thu, 29 Dec 2011 01:14:45 -0200 Subject: [PATCH 05/11] extracting NamedValueStatement --- .../main/java/org/dynjs/parser/Executor.java | 12 ++------- .../parser/statement/NamedValueStatement.java | 26 +++++++++++++++++++ 2 files changed, 28 insertions(+), 10 deletions(-) create mode 100644 dynjs/src/main/java/org/dynjs/parser/statement/NamedValueStatement.java diff --git a/dynjs/src/main/java/org/dynjs/parser/Executor.java b/dynjs/src/main/java/org/dynjs/parser/Executor.java index b0ee983bd..6103e3172 100644 --- a/dynjs/src/main/java/org/dynjs/parser/Executor.java +++ b/dynjs/src/main/java/org/dynjs/parser/Executor.java @@ -17,7 +17,6 @@ package org.dynjs.parser; import me.qmx.internal.org.objectweb.asm.Opcodes; -import me.qmx.jitescript.CodeBlock; import org.antlr.runtime.tree.CommonTree; import org.dynjs.compiler.DynJSCompiler; import org.dynjs.parser.statement.BlockStatement; @@ -31,6 +30,7 @@ import org.dynjs.parser.statement.FunctionStatement; import org.dynjs.parser.statement.IfStatement; import org.dynjs.parser.statement.LogicalOperationStatement; +import org.dynjs.parser.statement.NamedValueStatement; import org.dynjs.parser.statement.NotEqualsOperationStatement; import org.dynjs.parser.statement.NotOperationStatement; import org.dynjs.parser.statement.NullLiteralStatement; @@ -432,15 +432,7 @@ public Statement propertyNameNumeric(Statement numericLiteral) { } public Statement namedValue(final Statement propertyName, final Statement expr) { - return new Statement() { - @Override - public CodeBlock getCodeBlock() { - return CodeBlock.newCodeBlock() - .append(propertyName.getCodeBlock()) - .append(expr.getCodeBlock()) - .invokeinterface(DynJSCompiler.Types.Scope, "define", sig(void.class, String.class, Object.class)); - } - }; + return new NamedValueStatement(propertyName, expr); } public Statement arrayLiteral(List exprs) { diff --git a/dynjs/src/main/java/org/dynjs/parser/statement/NamedValueStatement.java b/dynjs/src/main/java/org/dynjs/parser/statement/NamedValueStatement.java new file mode 100644 index 000000000..a83f01a0d --- /dev/null +++ b/dynjs/src/main/java/org/dynjs/parser/statement/NamedValueStatement.java @@ -0,0 +1,26 @@ +package org.dynjs.parser.statement; + +import me.qmx.jitescript.CodeBlock; +import org.dynjs.compiler.DynJSCompiler; +import org.dynjs.parser.Statement; + +import static me.qmx.jitescript.util.CodegenUtils.sig; + +public class NamedValueStatement implements Statement { + + private final Statement propertyName; + private final Statement expr; + + public NamedValueStatement(Statement propertyName, Statement expr) { + this.propertyName = propertyName; + this.expr = expr; + } + + @Override + public CodeBlock getCodeBlock() { + return CodeBlock.newCodeBlock() + .append(propertyName.getCodeBlock()) + .append(expr.getCodeBlock()) + .invokeinterface(DynJSCompiler.Types.Scope, "define", sig(void.class, String.class, Object.class)); + } +} From 069c817a83dee612ce49d56e801cb624cf9e2bcb Mon Sep 17 00:00:00 2001 From: Douglas Campos Date: Thu, 29 Dec 2011 01:19:12 -0200 Subject: [PATCH 06/11] simple is better --- dynjs/src/test/java/org/dynjs/runtime/DynJSTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dynjs/src/test/java/org/dynjs/runtime/DynJSTest.java b/dynjs/src/test/java/org/dynjs/runtime/DynJSTest.java index b75b520a9..1fce04a3f 100644 --- a/dynjs/src/test/java/org/dynjs/runtime/DynJSTest.java +++ b/dynjs/src/test/java/org/dynjs/runtime/DynJSTest.java @@ -215,7 +215,7 @@ public void testEmptyObjectLiteral() { @Test public void testBasicObjectLiteral() { - dynJS.eval(context, "var x = {w:true}; var result = x;"); + dynJS.eval(context, "var result = {w:true};"); final Object result = context.getScope().resolve("result"); assertThat(result) .isNotNull() From 64a2cf5139ec26edf108076b3c46a42d9df0801e Mon Sep 17 00:00:00 2001 From: Douglas Campos Date: Thu, 29 Dec 2011 01:26:11 -0200 Subject: [PATCH 07/11] working property access over objects --- dynjs/src/main/java/org/dynjs/parser/Executor.java | 13 +++++++++++-- .../src/test/java/org/dynjs/runtime/DynJSTest.java | 5 +++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/dynjs/src/main/java/org/dynjs/parser/Executor.java b/dynjs/src/main/java/org/dynjs/parser/Executor.java index 6103e3172..e6443b872 100644 --- a/dynjs/src/main/java/org/dynjs/parser/Executor.java +++ b/dynjs/src/main/java/org/dynjs/parser/Executor.java @@ -17,6 +17,7 @@ package org.dynjs.parser; import me.qmx.internal.org.objectweb.asm.Opcodes; +import me.qmx.jitescript.CodeBlock; import org.antlr.runtime.tree.CommonTree; import org.dynjs.compiler.DynJSCompiler; import org.dynjs.parser.statement.BlockStatement; @@ -327,8 +328,16 @@ public Statement executeNew(Statement leftHandSideExpression10) { return null; } - public Statement resolveByField(Statement lhs, String field) { - return null; + public Statement resolveByField(final Statement lhs, final String field) { + return new Statement() { + @Override + public CodeBlock getCodeBlock() { + return CodeBlock.newCodeBlock() + .append(lhs.getCodeBlock()) + .ldc(field) + .invokeinterface(DynJSCompiler.Types.Scope, "resolve", sig(Object.class, String.class)); + } + }; } public Statement defineByIndex(Statement lhs, Statement index) { diff --git a/dynjs/src/test/java/org/dynjs/runtime/DynJSTest.java b/dynjs/src/test/java/org/dynjs/runtime/DynJSTest.java index 1fce04a3f..9a245dd02 100644 --- a/dynjs/src/test/java/org/dynjs/runtime/DynJSTest.java +++ b/dynjs/src/test/java/org/dynjs/runtime/DynJSTest.java @@ -223,6 +223,11 @@ public void testBasicObjectLiteral() { assertThat(((DynObject) result).resolve("w")).isInstanceOf(Boolean.class).isEqualTo(Boolean.TRUE); } + @Test + public void testObjectLiteralPropertyAccess() { + check("var x = {w:true}; var result = x.w;", true); + } + private void check(String scriptlet) { check(scriptlet, true); } From 37d1691b61e7369f5cf331a1ac09b72a03546539 Mon Sep 17 00:00:00 2001 From: Douglas Campos Date: Thu, 29 Dec 2011 01:27:18 -0200 Subject: [PATCH 08/11] extracting ResolveByFieldStatement --- .../main/java/org/dynjs/parser/Executor.java | 12 ++------- .../statement/ResolveByFieldStatement.java | 26 +++++++++++++++++++ 2 files changed, 28 insertions(+), 10 deletions(-) create mode 100644 dynjs/src/main/java/org/dynjs/parser/statement/ResolveByFieldStatement.java diff --git a/dynjs/src/main/java/org/dynjs/parser/Executor.java b/dynjs/src/main/java/org/dynjs/parser/Executor.java index e6443b872..a6be927ae 100644 --- a/dynjs/src/main/java/org/dynjs/parser/Executor.java +++ b/dynjs/src/main/java/org/dynjs/parser/Executor.java @@ -17,7 +17,6 @@ package org.dynjs.parser; import me.qmx.internal.org.objectweb.asm.Opcodes; -import me.qmx.jitescript.CodeBlock; import org.antlr.runtime.tree.CommonTree; import org.dynjs.compiler.DynJSCompiler; import org.dynjs.parser.statement.BlockStatement; @@ -44,6 +43,7 @@ import org.dynjs.parser.statement.PreIncrementStatement; import org.dynjs.parser.statement.PrintStatement; import org.dynjs.parser.statement.RelationalOperationStatement; +import org.dynjs.parser.statement.ResolveByFieldStatement; import org.dynjs.parser.statement.ResolveIdentifierStatement; import org.dynjs.parser.statement.ReturnStatement; import org.dynjs.parser.statement.StringLiteralStatement; @@ -329,15 +329,7 @@ public Statement executeNew(Statement leftHandSideExpression10) { } public Statement resolveByField(final Statement lhs, final String field) { - return new Statement() { - @Override - public CodeBlock getCodeBlock() { - return CodeBlock.newCodeBlock() - .append(lhs.getCodeBlock()) - .ldc(field) - .invokeinterface(DynJSCompiler.Types.Scope, "resolve", sig(Object.class, String.class)); - } - }; + return new ResolveByFieldStatement(lhs, field); } public Statement defineByIndex(Statement lhs, Statement index) { diff --git a/dynjs/src/main/java/org/dynjs/parser/statement/ResolveByFieldStatement.java b/dynjs/src/main/java/org/dynjs/parser/statement/ResolveByFieldStatement.java new file mode 100644 index 000000000..f8d9c7d18 --- /dev/null +++ b/dynjs/src/main/java/org/dynjs/parser/statement/ResolveByFieldStatement.java @@ -0,0 +1,26 @@ +package org.dynjs.parser.statement; + +import me.qmx.jitescript.CodeBlock; +import org.dynjs.compiler.DynJSCompiler; +import org.dynjs.parser.Statement; + +import static me.qmx.jitescript.util.CodegenUtils.sig; + +public class ResolveByFieldStatement implements Statement { + + private final Statement lhs; + private final String field; + + public ResolveByFieldStatement(Statement lhs, String field) { + this.lhs = lhs; + this.field = field; + } + + @Override + public CodeBlock getCodeBlock() { + return CodeBlock.newCodeBlock() + .append(lhs.getCodeBlock()) + .ldc(field) + .invokeinterface(DynJSCompiler.Types.Scope, "resolve", sig(Object.class, String.class)); + } +} From 0eb918c4298d00968256a1fc145f213391ed618c Mon Sep 17 00:00:00 2001 From: Douglas Campos Date: Thu, 29 Dec 2011 01:32:40 -0200 Subject: [PATCH 09/11] literal access via string properties --- dynjs/src/main/java/org/dynjs/parser/Executor.java | 2 +- dynjs/src/test/java/org/dynjs/runtime/DynJSTest.java | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/dynjs/src/main/java/org/dynjs/parser/Executor.java b/dynjs/src/main/java/org/dynjs/parser/Executor.java index a6be927ae..4a8f45e0c 100644 --- a/dynjs/src/main/java/org/dynjs/parser/Executor.java +++ b/dynjs/src/main/java/org/dynjs/parser/Executor.java @@ -425,7 +425,7 @@ public Statement propertyNameId(String id) { } public Statement propertyNameString(String string) { - return null; + return new StringLiteralStatement(string); } public Statement propertyNameNumeric(Statement numericLiteral) { diff --git a/dynjs/src/test/java/org/dynjs/runtime/DynJSTest.java b/dynjs/src/test/java/org/dynjs/runtime/DynJSTest.java index 9a245dd02..1b7b00b8e 100644 --- a/dynjs/src/test/java/org/dynjs/runtime/DynJSTest.java +++ b/dynjs/src/test/java/org/dynjs/runtime/DynJSTest.java @@ -226,6 +226,7 @@ public void testBasicObjectLiteral() { @Test public void testObjectLiteralPropertyAccess() { check("var x = {w:true}; var result = x.w;", true); + check("var x = {'y':false}; var result = x.y;", false); } private void check(String scriptlet) { From 9f261dc7794e633180da8d77f791c299f5797880 Mon Sep 17 00:00:00 2001 From: Douglas Campos Date: Thu, 29 Dec 2011 01:41:23 -0200 Subject: [PATCH 10/11] implementing access by index unifying ResolveByIndexStmt --- .../main/java/org/dynjs/parser/Executor.java | 10 +++---- .../statement/ResolveByFieldStatement.java | 26 ---------------- .../statement/ResolveByIndexStatement.java | 30 +++++++++++++++++++ .../java/org/dynjs/runtime/DynJSTest.java | 1 + 4 files changed, 35 insertions(+), 32 deletions(-) delete mode 100644 dynjs/src/main/java/org/dynjs/parser/statement/ResolveByFieldStatement.java create mode 100644 dynjs/src/main/java/org/dynjs/parser/statement/ResolveByIndexStatement.java diff --git a/dynjs/src/main/java/org/dynjs/parser/Executor.java b/dynjs/src/main/java/org/dynjs/parser/Executor.java index 4a8f45e0c..1096b8134 100644 --- a/dynjs/src/main/java/org/dynjs/parser/Executor.java +++ b/dynjs/src/main/java/org/dynjs/parser/Executor.java @@ -43,7 +43,7 @@ import org.dynjs.parser.statement.PreIncrementStatement; import org.dynjs.parser.statement.PrintStatement; import org.dynjs.parser.statement.RelationalOperationStatement; -import org.dynjs.parser.statement.ResolveByFieldStatement; +import org.dynjs.parser.statement.ResolveByIndexStatement; import org.dynjs.parser.statement.ResolveIdentifierStatement; import org.dynjs.parser.statement.ReturnStatement; import org.dynjs.parser.statement.StringLiteralStatement; @@ -53,8 +53,6 @@ import java.util.List; -import static me.qmx.jitescript.util.CodegenUtils.sig; - public class Executor implements Opcodes { private DynJSCompiler compiler = new DynJSCompiler(); @@ -329,11 +327,11 @@ public Statement executeNew(Statement leftHandSideExpression10) { } public Statement resolveByField(final Statement lhs, final String field) { - return new ResolveByFieldStatement(lhs, field); + return new ResolveByIndexStatement(lhs, field); } - public Statement defineByIndex(Statement lhs, Statement index) { - return null; + public Statement defineByIndex(final Statement lhs, final Statement index) { + return new ResolveByIndexStatement(lhs, index); } public Statement ifStatement(Statement vbool, Statement vthen, Statement velse) { diff --git a/dynjs/src/main/java/org/dynjs/parser/statement/ResolveByFieldStatement.java b/dynjs/src/main/java/org/dynjs/parser/statement/ResolveByFieldStatement.java deleted file mode 100644 index f8d9c7d18..000000000 --- a/dynjs/src/main/java/org/dynjs/parser/statement/ResolveByFieldStatement.java +++ /dev/null @@ -1,26 +0,0 @@ -package org.dynjs.parser.statement; - -import me.qmx.jitescript.CodeBlock; -import org.dynjs.compiler.DynJSCompiler; -import org.dynjs.parser.Statement; - -import static me.qmx.jitescript.util.CodegenUtils.sig; - -public class ResolveByFieldStatement implements Statement { - - private final Statement lhs; - private final String field; - - public ResolveByFieldStatement(Statement lhs, String field) { - this.lhs = lhs; - this.field = field; - } - - @Override - public CodeBlock getCodeBlock() { - return CodeBlock.newCodeBlock() - .append(lhs.getCodeBlock()) - .ldc(field) - .invokeinterface(DynJSCompiler.Types.Scope, "resolve", sig(Object.class, String.class)); - } -} diff --git a/dynjs/src/main/java/org/dynjs/parser/statement/ResolveByIndexStatement.java b/dynjs/src/main/java/org/dynjs/parser/statement/ResolveByIndexStatement.java new file mode 100644 index 000000000..ca225c770 --- /dev/null +++ b/dynjs/src/main/java/org/dynjs/parser/statement/ResolveByIndexStatement.java @@ -0,0 +1,30 @@ +package org.dynjs.parser.statement; + +import me.qmx.jitescript.CodeBlock; +import org.dynjs.compiler.DynJSCompiler; +import org.dynjs.parser.Statement; + +import static me.qmx.jitescript.util.CodegenUtils.sig; + +public class ResolveByIndexStatement implements Statement { + + private final Statement lhs; + private final Statement index; + + public ResolveByIndexStatement(Statement lhs, String index) { + this(lhs, new StringLiteralStatement(index)); + + } + public ResolveByIndexStatement(Statement lhs, Statement index) { + this.lhs = lhs; + this.index = index; + } + + @Override + public CodeBlock getCodeBlock() { + return CodeBlock.newCodeBlock() + .append(lhs.getCodeBlock()) + .append(index.getCodeBlock()) + .invokeinterface(DynJSCompiler.Types.Scope, "resolve", sig(Object.class, String.class)); + } +} diff --git a/dynjs/src/test/java/org/dynjs/runtime/DynJSTest.java b/dynjs/src/test/java/org/dynjs/runtime/DynJSTest.java index 1b7b00b8e..7f5a3272a 100644 --- a/dynjs/src/test/java/org/dynjs/runtime/DynJSTest.java +++ b/dynjs/src/test/java/org/dynjs/runtime/DynJSTest.java @@ -227,6 +227,7 @@ public void testBasicObjectLiteral() { public void testObjectLiteralPropertyAccess() { check("var x = {w:true}; var result = x.w;", true); check("var x = {'y':false}; var result = x.y;", false); + check("var x = {'z':true}; var result = x['z'];", true); } private void check(String scriptlet) { From 9d6f810a48384c602b93f9d5fffe2730157c6c08 Mon Sep 17 00:00:00 2001 From: Douglas Campos Date: Thu, 29 Dec 2011 01:45:37 -0200 Subject: [PATCH 11/11] better method name --- dynjs/src/main/antlr3/org/dynjs/parser/ES3Walker.g | 2 +- dynjs/src/main/java/org/dynjs/parser/Executor.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dynjs/src/main/antlr3/org/dynjs/parser/ES3Walker.g b/dynjs/src/main/antlr3/org/dynjs/parser/ES3Walker.g index a12d5134b..40f4d1c10 100755 --- a/dynjs/src/main/antlr3/org/dynjs/parser/ES3Walker.g +++ b/dynjs/src/main/antlr3/org/dynjs/parser/ES3Walker.g @@ -399,7 +399,7 @@ callExpression returns [Statement value] memberExpression returns [Statement value] : ^( BYINDEX leftHandSideExpression expression) - { $value = executor.defineByIndex($leftHandSideExpression.value, $expression.value); } + { $value = executor.resolveByIndex($leftHandSideExpression.value, $expression.value); } | ^( BYFIELD leftHandSideExpression Identifier ) { $value = executor.resolveByField($leftHandSideExpression.value, $Identifier.text); } ; diff --git a/dynjs/src/main/java/org/dynjs/parser/Executor.java b/dynjs/src/main/java/org/dynjs/parser/Executor.java index 1096b8134..85d9c9003 100644 --- a/dynjs/src/main/java/org/dynjs/parser/Executor.java +++ b/dynjs/src/main/java/org/dynjs/parser/Executor.java @@ -330,7 +330,7 @@ public Statement resolveByField(final Statement lhs, final String field) { return new ResolveByIndexStatement(lhs, field); } - public Statement defineByIndex(final Statement lhs, final Statement index) { + public Statement resolveByIndex(final Statement lhs, final Statement index) { return new ResolveByIndexStatement(lhs, index); }