Skip to content

Commit

Permalink
adding support for exposing builtins
Browse files Browse the repository at this point in the history
  • Loading branch information
qmx committed Apr 2, 2012
1 parent 04e9857 commit 680d7f8
Show file tree
Hide file tree
Showing 4 changed files with 85 additions and 8 deletions.
24 changes: 17 additions & 7 deletions dynjs/src/main/java/org/dynjs/runtime/DynJS.java
Expand Up @@ -24,24 +24,25 @@
import org.antlr.runtime.tree.CommonTree;
import org.antlr.runtime.tree.CommonTreeNodeStream;
import org.dynjs.api.Function;
import org.dynjs.api.Scope;
import org.dynjs.compiler.DynJSCompiler;
import org.dynjs.exception.SyntaxError;
import org.dynjs.parser.ES3Lexer;
import org.dynjs.parser.ES3Parser;
import org.dynjs.parser.ES3Walker;
import org.dynjs.parser.Executor;
import org.dynjs.parser.Statement;
import org.dynjs.parser.*;
import org.dynjs.runtime.loader.Builtin;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Set;

public class DynJS {

private final DynJSCompiler compiler;
private final DynJSConfig config;

public DynJS(DynJSConfig config) {
compiler = new DynJSCompiler(config);
this.config = config;
compiler = new DynJSCompiler(this.config);
}

public void eval(DynThreadContext context, String expression) {
Expand Down Expand Up @@ -90,10 +91,19 @@ private List<Statement> parseSourceCode(DynThreadContext context, ES3Lexer lexer

private void execute(DynThreadContext context, List<Statement> result) {
Script script = compiler.compile(result.toArray(new Statement[]{}));
script.setGlobalScope(context.getScope());
Scope globalScope = context.getScope();
initBuiltins(globalScope);
script.setGlobalScope(globalScope);
script.execute(context);
}

private void initBuiltins(Scope globalScope) {
Set<Builtin> builtins = config.getBuiltins();
for (Builtin builtin : builtins) {
globalScope.define(builtin.getBindingName(), builtin.getBoundObject());
}
}

public Function compile(CodeBlock codeBlock, final String[] args) {
return this.compiler.compile(new DynFunction(codeBlock) {
public String[] getArguments() {
Expand Down
13 changes: 13 additions & 0 deletions dynjs/src/main/java/org/dynjs/runtime/DynJSConfig.java
Expand Up @@ -16,9 +16,15 @@
*/
package org.dynjs.runtime;

import org.dynjs.runtime.loader.Builtin;

import java.util.LinkedHashSet;
import java.util.Set;

public class DynJSConfig {

private boolean debug;
private Set<Builtin> builtins = new LinkedHashSet<>();

public void enableDebug() {
this.debug = true;
Expand All @@ -28,4 +34,11 @@ public boolean isDebug() {
return debug;
}

public void addBuiltin(String bindingName, Object boundObject) {
builtins.add(new Builtin(bindingName, boundObject));
}

public Set<Builtin> getBuiltins() {
return builtins;
}
}
20 changes: 20 additions & 0 deletions dynjs/src/main/java/org/dynjs/runtime/loader/Builtin.java
@@ -0,0 +1,20 @@
package org.dynjs.runtime.loader;

public class Builtin {

private final String bindingName;
private final Object boundObject;

public Builtin(String bindingName, Object boundObject) {
this.bindingName = bindingName;
this.boundObject = boundObject;
}

public String getBindingName() {
return bindingName;
}

public Object getBoundObject() {
return boundObject;
}
}
36 changes: 35 additions & 1 deletion dynjs/src/test/java/org/dynjs/runtime/DynJSTest.java
Expand Up @@ -17,6 +17,7 @@
package org.dynjs.runtime;

import org.dynjs.api.Function;
import org.dynjs.api.Scope;
import org.dynjs.exception.ReferenceError;
import org.junit.Before;
import org.junit.Test;
Expand All @@ -27,10 +28,11 @@ public class DynJSTest {

private DynJS dynJS;
private DynThreadContext context;
private DynJSConfig config;

@Before
public void setUp() {
DynJSConfig config = new DynJSConfig();
config = new DynJSConfig();
// config.enableDebug();
dynJS = new DynJS(config);
context = new DynThreadContext();
Expand Down Expand Up @@ -240,6 +242,12 @@ public void testLiteralArray() {
check("var x = []; x[33] = 'lol'; var result = x[33] == 'lol';");
}

@Test
public void testBuiltinLoading() {
config.addBuiltin("sample", new BypassFunction());
check("var result = sample(true);");
}

private void check(String scriptlet) {
check(scriptlet, true);
}
Expand All @@ -250,4 +258,30 @@ private void check(String scriptlet, Boolean expected) {
assertThat(result).isEqualTo(expected);
}

private class BypassFunction implements Function{
@Override
public Object call(DynThreadContext context, Object[] arguments) {
return arguments[0];
}

@Override
public void setContext(DynThreadContext context) {
//To change body of implemented methods use File | Settings | File Templates.
}

@Override
public Scope getEnclosingScope() {
return null; //To change body of implemented methods use File | Settings | File Templates.
}

@Override
public Object resolve(String name) {
return null; //To change body of implemented methods use File | Settings | File Templates.
}

@Override
public void define(String property, Object value) {
//To change body of implemented methods use File | Settings | File Templates.
}
}
}

0 comments on commit 680d7f8

Please sign in to comment.