Git Product home page Git Product logo

dynjs's Introduction

dynjs - ECMAScript Runtime for the JVM

Build Status

Bug Reports

We're using GitHub Issues. Please let us know what issues you find!

Setting up environment

Getting JDK7

OSX can get information on installing at the java site.

Download and install it to your user (not to the entire machine) and before running mvn install run (or use Java7 as default compiler):

	export JAVA_HOME=$(/usr/libexec/java_home -v 1.7)

Getting started

Building from sources

  1. git clone https://github.com/dynjs/dynjs.git && cd dynjs
  2. mvn install -s support/settings.xml

Download

Alternatively download the latest dynjs dist zip package from our CI job, then unpack it somewhere. As a convenience, you can symlink bin/dynjs to some directory enlisted on your $PATH, it should work fine!

Running

Run ./bin/dynjs --console for the REPL and try the snippet below:

var x = 1 + 1;
print(x);

For more options, run ./dynjs --help.

dynjs's People

Contributors

abstractj avatar ahirata avatar akiellor avatar anba avatar aslakknutsen avatar bbrowning avatar bobmcwhirter avatar brunorg avatar caiofilipini avatar danielpassos avatar dchohfi avatar enebo avatar hns avatar joshk avatar lance avatar m0wfo avatar malaporte avatar mwaysolutions avatar n0mer avatar ngsankha avatar owenthereal avatar pbalduino avatar petercardona avatar porcelli avatar qmx avatar sergioazevedo avatar stephenc avatar stephenjudkins avatar t-beckmann avatar thiagofm avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

dynjs's Issues

Regex fails with some whacky regexes

This regex taken from an express.js dependency causes a stack to be generated.

var ipv6Part = "(?:[0-9a-f]+::?)+";
var regex = new RegExp("^((?:" + ipv6Part + ")|(?:::)(?:" + ipv6Part + ")?)");

Stack:

Exception in thread "main" org.dynjs.exception.ThrowException: SyntaxError: nested repeat is not allowed
at .(org/dynjs/runtime/builtins/types/BuiltinRegExp.java:0)
at .(regexp.js:4)
at org.dynjs.runtime.builtins.types.regexp.DynRegExp.setPatternAndFlags(DynRegExp.java:101)
at org.dynjs.runtime.builtins.types.BuiltinRegExp.call(BuiltinRegExp.java:70)
at org.dynjs.runtime.AbstractNativeFunction.call(AbstractNativeFunction.java:67)
at org.dynjs.runtime.ExecutionContext.call(ExecutionContext.java:210)
at org.dynjs.runtime.ExecutionContext.construct(ExecutionContext.java:281)
at java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:636)
at org.projectodd.rephract.LinkPlan.linkInvocation(LinkPlan.java:186)
at org.dynjs.parser.ast.NewOperatorExpression.interpret(NewOperatorExpression.java:93)
at org.dynjs.parser.ast.VariableDeclaration.interpret(VariableDeclaration.java:61)
at org.dynjs.parser.ast.VariableStatement.interpret(VariableStatement.java:87)
at org.dynjs.parser.ast.BlockStatement.interpret(BlockStatement.java:151)
at org.dynjs.runtime.interp.InterpretedBasicBlock.call(InterpretedBasicBlock.java:29)
at org.dynjs.runtime.wrapper.JavascriptProgram.execute(JavascriptProgram.java:36)
at org.dynjs.runtime.ExecutionContext.execute(ExecutionContext.java:175)
at org.dynjs.runtime.Runner.execute(Runner.java:93)
at org.dynjs.cli.Main.executeRunner(Main.java:119)
at org.dynjs.cli.Main.executeFile(Main.java:149)
at org.dynjs.cli.Main.run(Main.java:101)
at org.dynjs.cli.Main.main(Main.java:48)

A TypeError exception is thrown when opal.js file is imported

I am trying to use DynJs to integrate asciidoctor.js to Java. Asciidoctor.js has a dependency to opal.js library. Opal.js used is located at https://github.com/asciidoctor/asciidoctor.js/blob/master/dist/opal.js.

Those files works when they are executed from a browser.

The java code used is:

Config config = new Config();
DynJS dynjs = new DynJS(config);

final Runner runner = dynjs.newRunner();
runner.withSource(new File("src/test/java/sc/opal.js")).execute();

Maybe the problem is that opal is using a feature not supported by DynJs.

Thank you so much for your support.

Support for Java byte arrays in Javascript

Moving http://jira.codehaus.org/browse/DYNJS-107 to GH Issues

bob mcwhirter added a comment - 28/May/13 1:11 PM
Not currently possible, but a useful addition.

Volker Hahn added a comment - 30/May/13 5:42 AM
@bob: Is there an alternative way to get a Java Byte array?

Lance Ball added a comment - 06/Jun/13 10:23 AM - edited
As a stopgap, you could try having a Java class with a method like, createByteArray(). E.g. ByteArrayFactory.java

package me.developer.factories;

public class ByteArrayFactory {
    public static Byte[] newByteArray(int length) {
        return new Byte[length];
    }
}

And then in javascript

var javaBytes = me.developer.factories.ByteArrayFactory.newByteArray( 10 );

MethodGenerator fails method calls with primitive types on Java objects

When a Java interface or abstract class contains a method with primitive type parameters, JS implementations of the class fail to construct. For example in Java:

package org.foo;
public interface Foobar {
    public void doSomething(boolean now);
}

And then in JS:

var impl = {
  doSomething: function(now) {
    console.log(now);
  }
}

var foo = new Foobar( impl );

Fails with something akin to:

org.dynjs.exception.ThrowException: java.lang.VerifyError: Bad local variable type
Exception Details:
  Location:
        org/dynjs/gen/impl/FoobarJS_0.callWithParameters(Ljava/lang/String;Z)Ljava/lang/String; @48: aload_2
  Reason:
    Type integer (current frame, locals[2]) is not assignable to reference type
  Current Frame:
    bci: @48
    flags: { }
    locals: { 'org/dynjs/gen/impl/FoobarJS_0', 'java/lang/String', integer }
    stack: { 'org/dynjs/runtime/ExecutionContext', 'java/lang/Object', 'org/dynjs/gen/impl/FoobarJS_0', '[Ljava/lang/Object;', '[Ljava/lang/Object;', integer }
  Bytecode:
    0000000: 2ab4 0011 2ab4 000f 1214 b900 1a03 0059
    0000010: b200 20a5 0006 a700 0757 a700 1e2a b400
    0000020: 0f5f 2a12 21bd 0023 5912 242b 5359 1225
    0000030: 2c53 b600 2ba7 0009 2a2b 2cb7 002d 2ab6
    0000040: 0031 b600 3712 39b6 003f b800 45c0 0047
    0000050: b0                                     
  Stackmap Table:
    same_locals_1_stack_item_frame(@25,Object[#35])
    same_locals_1_stack_item_frame(@29,Object[#35])
    same_frame(@56)
    same_locals_1_stack_item_frame(@62,Object[#35])

someUndefinedObj.property throws TypeError, possibly related to #95

I'm using the org.dynjs:dynjs:0.3.0-SNAPSHOT artifact (included in io.nodyn:nodyn:0.1.1-SNAPSHOT from https://oss.sonatype.org/content/repositories/snapshots), and the statement if(someUndefinedObj.property) { } throws a TypeError, whereas the expected behavior (for me) is that the undefinedObj.property evaluates to false. Maybe related to issue #95. Stack trace:

org.dynjs.exception.ThrowException: TypeError: undefined cannot be coerced to an object: about
    at ...
    at org.dynjs.runtime.Types.checkObjectCoercible(Types.java:32)
    at org.dynjs.parser.ast.DotExpression.interpret(DotExpression.java:74)
    at org.dynjs.parser.ast.IfStatement.interpret(IfStatement.java:105)

Cannot Access Static Fields of Interfaces

When I try to access the AUTO_ACKNOWLEDGE static field of the javax.jms.Session interface, for example, I get the following error:

java.lang.IllegalArgumentException: not invocable, no method type

nodyn fails to run jasmine with dynjs HEAD

There was an error loading the module jasmine-jvm/executor.js. Error message: TypeError: cannot construct with: interface org.jasmine.Executor
org.dynjs.exception.ThrowException: TypeError: cannot construct with: interface org.jasmine.Executor
    at <global>.<native function: require>(jasmine-jvm/executor.js:1)
    at <global>.<eval>(<eval>:1)
    at <global>.<eval>(Unknown Source)
    at org.dynjs.runtime.interp.InvokeDynamicInterpretingVisitor.visit(InvokeDynamicInterpretingVisitor.java:121)
    at org.dynjs.parser.ast.NewOperatorExpression.accept(NewOperatorExpression.java:52)
    at org.dynjs.runtime.interp.InvokeDynamicInterpretingVisitor.visit(InvokeDynamicInterpretingVisitor.java:35)
    at org.dynjs.parser.ast.AssignmentExpression.accept(AssignmentExpression.java:32)
    at org.dynjs.runtime.interp.BasicInterpretingVisitor.visit(BasicInterpretingVisitor.java:480)
    at org.dynjs.parser.ast.ExpressionStatement.accept(ExpressionStatement.java:54)
    at org.dynjs.runtime.interp.BasicInterpretingVisitor.visit(BasicInterpretingVisitor.java:286)
    at org.dynjs.parser.ast.BlockStatement.accept(BlockStatement.java:117)
    at org.dynjs.runtime.interp.InterpretedBasicBlock.call(InterpretedBasicBlock.java:28)
    at org.dynjs.runtime.wrapper.JavascriptProgram.execute(JavascriptProgram.java:37)
    at org.dynjs.runtime.ExecutionContext.execute(ExecutionContext.java:123)
    at org.dynjs.runtime.Runner.execute(Runner.java:82)
    at org.dynjs.runtime.modules.ClasspathModuleProvider.load(ClasspathModuleProvider.java:25)
    at org.dynjs.runtime.builtins.Require.call(Require.java:153)
    at org.dynjs.runtime.AbstractNativeFunction.call(AbstractNativeFunction.java:67)
    at org.dynjs.runtime.ExecutionContext.internalCall(ExecutionContext.java:202)
    at org.dynjs.runtime.ExecutionContext.call(ExecutionContext.java:151)
    at org.dynjs.runtime.linker.InterpretingInvokeDynamicHandler.call(InterpretingInvokeDynamicHandler.java:40)
    at org.dynjs.runtime.interp.InvokeDynamicInterpretingVisitor.visit(InvokeDynamicInterpretingVisitor.java:93)
    at org.dynjs.parser.ast.FunctionCallExpression.accept(FunctionCallExpression.java:85)
    at org.dynjs.runtime.interp.BasicInterpretingVisitor.visit(BasicInterpretingVisitor.java:961)
    at org.dynjs.parser.ast.DotExpression.accept(DotExpression.java:70)
    at org.dynjs.runtime.interp.BasicInterpretingVisitor.visit(BasicInterpretingVisitor.java:480)
    at org.dynjs.parser.ast.ExpressionStatement.accept(ExpressionStatement.java:54)
    at org.dynjs.runtime.interp.BasicInterpretingVisitor.visit(BasicInterpretingVisitor.java:286)
    at org.dynjs.parser.ast.BlockStatement.accept(BlockStatement.java:117)
    at org.dynjs.runtime.interp.InterpretedBasicBlock.call(InterpretedBasicBlock.java:28)
    at org.dynjs.runtime.wrapper.JavascriptProgram.execute(JavascriptProgram.java:37)
    at org.dynjs.runtime.ExecutionContext.eval(ExecutionContext.java:138)
    at org.dynjs.runtime.Runner.evaluate(Runner.java:102)
    at org.dynjs.runtime.DynJS.evaluate(DynJS.java:61)
    at org.jasmine.Runtime.execute(Runtime.java:44)
    at org.jasmine.cli.Main.main(Main.java:14)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at org.codehaus.mojo.exec.ExecJavaMojo$1.run(ExecJavaMojo.java:297)
    at java.lang.Thread.run(Thread.java:744)
[WARNING]
java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at org.codehaus.mojo.exec.ExecJavaMojo$1.run(ExecJavaMojo.java:297)
    at java.lang.Thread.run(Thread.java:744)
Caused by: org.dynjs.exception.ThrowException: TypeError: null cannot be coerced to an object: executor
    at <global>.<eval>(<eval>:1)
    at <global>.<eval>(Unknown Source)
    at org.dynjs.runtime.Types.checkObjectCoercible(Types.java:35)
    at org.dynjs.runtime.interp.BasicInterpretingVisitor.visit(BasicInterpretingVisitor.java:967)
    at org.dynjs.parser.ast.DotExpression.accept(DotExpression.java:70)
    at org.dynjs.runtime.interp.BasicInterpretingVisitor.visit(BasicInterpretingVisitor.java:480)
    at org.dynjs.parser.ast.ExpressionStatement.accept(ExpressionStatement.java:54)
    at org.dynjs.runtime.interp.BasicInterpretingVisitor.visit(BasicInterpretingVisitor.java:286)
    at org.dynjs.parser.ast.BlockStatement.accept(BlockStatement.java:117)
    at org.dynjs.runtime.interp.InterpretedBasicBlock.call(InterpretedBasicBlock.java:28)
    at org.dynjs.runtime.wrapper.JavascriptProgram.execute(JavascriptProgram.java:37)
    at org.dynjs.runtime.ExecutionContext.eval(ExecutionContext.java:138)
    at org.dynjs.runtime.Runner.evaluate(Runner.java:102)
    at org.dynjs.runtime.DynJS.evaluate(DynJS.java:61)
    at org.jasmine.Runtime.execute(Runtime.java:44)
    at org.jasmine.cli.Main.main(Main.java:14)

Fails to call java.lang.String.startsWith

I'm using jasmine-jvm to write some jasmine tests.

Dyn.js is silently failing in the following code:

    var path = new java.lang.String('/~/my/path');
    if (path.startsWith('/~')) { // Fails here
        this.handleRegistration(request);
    }

This was tested with dyn.js 0.2.1 and 0.2.2.

InvokeDynamicInterpretingVisitor should generate more useful error messages

Moving http://jira.codehaus.org/browse/DYNJS-119 to GH Issues

The error message generated when calling a non-existent method on a Java object is not terribly useful. InvokeDynmaicInterpretingVisitor#visit should generate more useful error messages. Specifically, the method that is "not callable" should be a part of the error message, and the stack trace should be minimized.

Here's how it looks now:

Starting test: src/test/resources/filesystem|async_file_test.js|testWrite
Aug 27, 2013 12:20:33 PM org.vertx.java.core.logging.impl.JULLogDelegate error
SEVERE: Exception in DynJS JavaScript verticle
org.dynjs.exception.ThrowException: TypeError: not callable
at Object.write(<eval>:18)
at <global>.<anonymous>(<eval>:38)
at <global>.<anonymous>(vertx/file_system.js:691)
at <global>.<anonymous>(vertx/file_system.js:47)
at <global>.<anonymous>(vertx/file_system.js:47)
at <global>.<anonymous>(vertx/file_system.js:47)
at <global>.<anonymous>(vertx/file_system.js:47)
at <global>.<eval>(<eval>:75)
at <global>.<eval>(Unknown Source)
at org.dynjs.runtime.interp.InvokeDynamicInterpretingVisitor.visit(InvokeDynamicInterpretingVisitor.java:97)
at org.dynjs.parser.ast.FunctionCallExpression.accept(FunctionCallExpression.java:85)
at org.dynjs.runtime.interp.BasicInterpretingVisitor.visit(BasicInterpretingVisitor.java:461)
at org.dynjs.parser.ast.ExpressionStatement.accept(ExpressionStatement.java:54)
at org.dynjs.runtime.interp.BasicInterpretingVisitor.visit(BasicInterpretingVisitor.java:267)
at org.dynjs.parser.ast.BlockStatement.accept(BlockStatement.java:102)
at org.dynjs.runtime.interp.InterpretedBasicBlock.call(InterpretedBasicBlock.java:28)
at org.dynjs.runtime.BasicBlockDelegate.call(BasicBlockDelegate.java:26)
at org.dynjs.runtime.CompilableBasicBlock.call(CompilableBasicBlock.java:24)
at org.dynjs.runtime.wrapper.JavascriptFunction.call(JavascriptFunction.java:61)
at org.dynjs.runtime.ExecutionContext.internalCall(ExecutionContext.java:218)
at org.dynjs.runtime.ExecutionContext.call(ExecutionContext.java:167)
at org.dynjs.runtime.linker.InterpretingInvokeDynamicHandler.call(InterpretingInvokeDynamicHandler.java:40)
at org.dynjs.runtime.interp.InvokeDynamicInterpretingVisitor.visit(InvokeDynamicInterpretingVisitor.java:93)
at org.dynjs.parser.ast.FunctionCallExpression.accept(FunctionCallExpression.java:85)
at org.dynjs.runtime.interp.BasicInterpretingVisitor.visit(BasicInterpretingVisitor.java:461)
at org.dynjs.parser.ast.ExpressionStatement.accept(ExpressionStatement.java:54)
at org.dynjs.runtime.interp.BasicInterpretingVisitor.visit(BasicInterpretingVisitor.java:267)
at org.dynjs.parser.ast.BlockStatement.accept(BlockStatement.java:102)
at org.dynjs.runtime.interp.InterpretedBasicBlock.call(InterpretedBasicBlock.java:28)
at org.dynjs.runtime.BasicBlockDelegate.call(BasicBlockDelegate.java:26)
at org.dynjs.runtime.CompilableBasicBlock.call(CompilableBasicBlock.java:24)
at org.dynjs.runtime.interp.BasicInterpretingVisitor.invokeCompiledBlockStatement(BasicInterpretingVisitor.java:1506)
at org.dynjs.runtime.interp.BasicInterpretingVisitor.visit(BasicInterpretingVisitor.java:750)
at org.dynjs.parser.ast.IfStatement.accept(IfStatement.java:81)
at org.dynjs.runtime.interp.BasicInterpretingVisitor.visit(BasicInterpretingVisitor.java:267)
at org.dynjs.parser.ast.BlockStatement.accept(BlockStatement.java:102)
at org.dynjs.runtime.interp.InterpretedBasicBlock.call(InterpretedBasicBlock.java:28)
at org.dynjs.runtime.BasicBlockDelegate.call(BasicBlockDelegate.java:26)
at org.dynjs.runtime.CompilableBasicBlock.call(CompilableBasicBlock.java:24)
at org.dynjs.runtime.wrapper.JavascriptFunction.call(JavascriptFunction.java:61)
at org.dynjs.runtime.ExecutionContext.internalCall(ExecutionContext.java:218)
at org.dynjs.runtime.ExecutionContext.call(ExecutionContext.java:167)
at org.dynjs.runtime.linker.InterpretingInvokeDynamicHandler.call(InterpretingInvokeDynamicHandler.java:40)
at org.dynjs.runtime.interp.InvokeDynamicInterpretingVisitor.visit(InvokeDynamicInterpretingVisitor.java:93)
at org.dynjs.parser.ast.FunctionCallExpression.accept(FunctionCallExpression.java:85)
at org.dynjs.runtime.interp.BasicInterpretingVisitor.visit(BasicInterpretingVisitor.java:461)
at org.dynjs.parser.ast.ExpressionStatement.accept(ExpressionStatement.java:54)
at org.dynjs.runtime.interp.BasicInterpretingVisitor.visit(BasicInterpretingVisitor.java:267)
at org.dynjs.parser.ast.BlockStatement.accept(BlockStatement.java:102)
at org.dynjs.runtime.interp.InterpretedBasicBlock.call(InterpretedBasicBlock.java:28)
at org.dynjs.runtime.BasicBlockDelegate.call(BasicBlockDelegate.java:26)
at org.dynjs.runtime.CompilableBasicBlock.call(CompilableBasicBlock.java:24)
at org.dynjs.runtime.interp.BasicInterpretingVisitor.invokeCompiledBlockStatement(BasicInterpretingVisitor.java:1506)
at org.dynjs.runtime.interp.BasicInterpretingVisitor.visit(BasicInterpretingVisitor.java:748)
at org.dynjs.parser.ast.IfStatement.accept(IfStatement.java:81)
at org.dynjs.runtime.interp.BasicInterpretingVisitor.visit(BasicInterpretingVisitor.java:267)
at org.dynjs.parser.ast.BlockStatement.accept(BlockStatement.java:102)
at org.dynjs.runtime.interp.InterpretedBasicBlock.call(InterpretedBasicBlock.java:28)
at org.dynjs.runtime.BasicBlockDelegate.call(BasicBlockDelegate.java:26)
at org.dynjs.runtime.CompilableBasicBlock.call(CompilableBasicBlock.java:24)
at org.dynjs.runtime.wrapper.JavascriptFunction.call(JavascriptFunction.java:61)
at org.dynjs.runtime.ExecutionContext.internalCall(ExecutionContext.java:218)
at org.dynjs.runtime.ExecutionContext.call(ExecutionContext.java:167)
at org.dynjs.runtime.ExecutionContext.call(ExecutionContext.java:162)
at org.dynjs.gen.impl.HandlerJS_0.handle(Unknown Source)
at org.vertx.java.core.impl.DefaultFutureResult.checkCallHandler(DefaultFutureResult.java:123)
at org.vertx.java.core.impl.DefaultFutureResult.setHandler(DefaultFutureResult.java:97)
at org.vertx.java.core.impl.BlockingAction$1$1.run(BlockingAction.java:58)
at org.vertx.java.core.impl.DefaultContext$3.run(DefaultContext.java:170)
at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:354)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:348)
at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:101)
at java.lang.Thread.run(Thread.java:724)

implementing an abstract class causes a ArrayIndexOutOfBoundsException

Hi,

I'm trying to create a jetty server in javascript. As template I have used the java example from http://www.eclipse.org/jetty/documentation/current/embedding-jetty.html.

This is my javascript which is causing the exception.

...
handler = new org.eclipse.jetty.server.handler.AbstractHandler( {
    handle: function(target, baseRequest, request, response) {
    }
});
...

I'm using dynjs 0.2.0.

Here is the stracktrace.
Exception in thread "main" org.dynjs.exception.ThrowException: java.lang.ArrayIndexOutOfBoundsException: -1
at .(:6)
at .(Unknown Source)
at org.dynjs.runtime.interp.InvokeDynamicInterpretingVisitor.visit(InvokeDynamicInterpretingVisitor.java:125)
at org.dynjs.parser.ast.NewOperatorExpression.accept(NewOperatorExpression.java:52)
at org.dynjs.runtime.interp.BasicInterpretingVisitor.visit(BasicInterpretingVisitor.java:1422)
at org.dynjs.parser.ast.VariableDeclaration.accept(VariableDeclaration.java:43)
at org.dynjs.runtime.interp.BasicInterpretingVisitor.visit(BasicInterpretingVisitor.java:1433)
at org.dynjs.parser.ast.VariableStatement.accept(VariableStatement.java:71)
at org.dynjs.runtime.interp.BasicInterpretingVisitor.visit(BasicInterpretingVisitor.java:281)
at org.dynjs.parser.ast.BlockStatement.accept(BlockStatement.java:102)
at org.dynjs.runtime.interp.InterpretedBasicBlock.call(InterpretedBasicBlock.java:28)
at org.dynjs.runtime.BasicBlockDelegate.call(BasicBlockDelegate.java:26)
at org.dynjs.runtime.CompilableBasicBlock.call(CompilableBasicBlock.java:24)
at org.dynjs.runtime.wrapper.JavascriptProgram.execute(JavascriptProgram.java:37)
at org.dynjs.runtime.ExecutionContext.eval(ExecutionContext.java:155)
at org.dynjs.runtime.Runner.evaluate(Runner.java:102)
at org.dynjs.runtime.DynJS.evaluate(DynJS.java:51)
at org.dynjs.runtime.DynJS.evaluate(DynJS.java:60)
at com.mytest.moddev.dynjs.FSShell.runScript(FSShell.java:64)
at com.mytest.moddev.dynjs.FSShell.main(FSShell.java:49)
Caused by: java.lang.ArrayIndexOutOfBoundsException: -1
at org.objectweb.asm.Frame.a(Unknown Source)
at org.objectweb.asm.Frame.a(Unknown Source)
at org.objectweb.asm.MethodWriter.visitMaxs(Unknown Source)
at org.objectweb.asm.tree.MethodNode.accept(Unknown Source)
at org.objectweb.asm.tree.MethodNode.accept(Unknown Source)
at org.objectweb.asm.tree.ClassNode.accept(Unknown Source)
at me.qmx.jitescript.JiteClass.toBytes(JiteClass.java:234)
at org.dynjs.runtime.linker.java.JSJavaImplementationManager.createImplementationWrapper(JSJavaImplementationManager.java:134)
at org.dynjs.runtime.linker.java.JSJavaImplementationManager.getImplementationWrapper(JSJavaImplementationManager.java:90)
at org.dynjs.runtime.linker.java.JSJavaImplementationManager.getImplementationWrapper(JSJavaImplementationManager.java:45)
at org.dynjs.runtime.linker.java.JSJavaImplementationLinkStrategy.makeImplementation(JSJavaImplementationLinkStrategy.java:56)
at java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:566)
at org.projectodd.rephract.RephractLinker.linkInvocation(RephractLinker.java:74)
at org.dynjs.runtime.linker.InterpretingInvokeDynamicHandler.construct(InterpretingInvokeDynamicHandler.java:44)
at org.dynjs.runtime.interp.InvokeDynamicInterpretingVisitor.visit(InvokeDynamicInterpretingVisitor.java:119)

Add support for missing CallSite functions

In addition to the fact that we expose Java StackElements instead of Javascript CallSite instances in a stack trace, we also need to add support for a half dozen methods defined by the V8 stack trace API. See StackElement.java. The following methods are not implemented:

public int getColumnNumber() {
    return 0;
}

public StackElement getEvalOrigin() {
    return null;
}

public boolean isTopLevel() {
    return false;
}

public boolean isEval() {
    return false;
}

public boolean isNative() {
    return false;
}

public boolean isConstructor() {
    return false;
}

thread safety

Is there any proper way to compile JS function once and execute it in multiple threads?
I'm trying to catch function to variable - something like

        fn = (JSFunction) dynJS.evaluate(compilerScript,"\n;\n" +
                "(function(){return function(coffeeScriptSource, bare){return CoffeeScript.compile(coffeeScriptSource, {bare: !!bare});};})();" );

but invoking it in multiple threads produce exceptions

Null result from java function call is transformed into undefined

When calling a function from a Java object that returns "null", that null value somehow becomes "undefined" in JavaScript. The following test passes when using Nashorn, but fails with DynJS (0.3.0-SNAPSHOT)

public class TestClass {
    public Object thing() {
        return null;
    }
};

@Test
public void testReturnNullFromJava() throws ScriptException, NoSuchMethodException {
    ScriptEngine engine = new ScriptEngineManager().getEngineByName("dynjs");
    engine.eval("var doSomething = function(o) { return o.thing() === null; }");
    TestCase.assertTrue((Boolean) ((Invocable) engine).invokeFunction("doSomething", new TestClass()));
}

normalize JVM options

try to make the JVM settings more consistent

  • dynjs.compat.rhino.enabled
  • dynjs.compat.npm.enabled

Multi line regular expressions do not split on line feed as it seems they should

Here is a simple example.

function println(msg) {
  java.lang.System.out.println(msg);
}

var multiline = "FOO=bar\nFOOBAR=boom\n";
var regex = new RegExp(/([\w+]+)\s*\=\s*(.*)/gmi);
var lines = regex.exec(multiline);
var print = (typeof console !== 'undefined') ? console.log : println;


for (var i=0;i<lines.length;i++) {
  print(">> LINE " + lines[i]);
  print(".....");
}

Running this under nashorn produces the following:

$ jrunscript regexp.js
>> LINE FOO=bar
.....
>> LINE FOO
.....
>> LINE bar
.....

Running under node produces the following:

$ node regexp.js
>> LINE FOO=bar
.....
>> LINE FOO
.....
>> LINE bar
.....

Running under dynjs produces the following:

$ ./bin/dynjs regexp.js                                                                                                                   ✭ ✱ ◼
>> LINE FOO=bar
FOOBAR=boom

.....
>> LINE FOO
.....
>> LINE bar
FOOBAR=boom

.....

Java 1.6

The binary seems to be compiled for Java 1.7.

Is it worth trying to compile for 1.6 or is it just not going to work?

IncompatibleClassChangeError trying to compile a script

I am compiling a script like this:

    public Object compile(String script) {
        ExecutionContext context = dynjs.getExecutionContext();
        JavascriptParser parser = new JavascriptParser(context);
        ProgramTree tree = parser.parse(script, null, true);
        JSProgram program = context.getCompiler().compileProgram(context, tree, true);
        return program;
    }

And I am getting the following exception:

java.lang.IncompatibleClassChangeError: class org.objectweb.asm.tree.ClassNode has interface org.objectweb.asm.ClassVisitor as super class
    at __randomizedtesting.SeedInfo.seed([FBC6D4B7E26E0CAB:1965035321C8AAE0]:0)
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:792)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
    at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at me.qmx.jitescript.JiteClass.toBytes(JiteClass.java:197)
    at org.dynjs.compiler.bytecode.AbstractBytecodeCompiler.defineClass(AbstractBytecodeCompiler.java:45)
    at org.dynjs.compiler.bytecode.BytecodeBasicBlockCompiler.compile(BytecodeBasicBlockCompiler.java:85)
    at org.dynjs.compiler.JSCompiler.compileBasicBlock(JSCompiler.java:54)
    at org.dynjs.compiler.ProgramCompiler.compile(ProgramCompiler.java:12)
    at org.dynjs.compiler.JSCompiler.compileProgram(JSCompiler.java:46)
    at org.elasticsearch.script.dynjs.JavascriptScriptEngineService.compile(JavascriptScriptEngineService.java:52)
    at org.elasticsearch.script.ScriptComparisonsTest.testWithAll(ScriptComparisonsTest.java:56)
    at org.elasticsearch.script.ScriptComparisonsTest.testScriptingServices(ScriptComparisonsTest.java:43)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at com.carrotsearch.randomizedtesting.RandomizedRunner.invoke(RandomizedRunner.java:1617)
    at com.carrotsearch.randomizedtesting.RandomizedRunner$6.evaluate(RandomizedRunner.java:826)
    at com.carrotsearch.randomizedtesting.RandomizedRunner$7.evaluate(RandomizedRunner.java:862)
    at com.carrotsearch.randomizedtesting.RandomizedRunner$8.evaluate(RandomizedRunner.java:876)
    at org.apache.lucene.util.TestRuleSetupTeardownChained$1.evaluate(TestRuleSetupTeardownChained.java:50)
    at org.apache.lucene.util.TestRuleFieldCacheSanity$1.evaluate(TestRuleFieldCacheSanity.java:51)
    at org.apache.lucene.util.AbstractBeforeAfterRule$1.evaluate(AbstractBeforeAfterRule.java:46)
    at com.carrotsearch.randomizedtesting.rules.SystemPropertiesInvariantRule$1.evaluate(SystemPropertiesInvariantRule.java:55)
    at org.apache.lucene.util.TestRuleThreadAndTestName$1.evaluate(TestRuleThreadAndTestName.java:49)
    at org.apache.lucene.util.TestRuleIgnoreAfterMaxFailures$1.evaluate(TestRuleIgnoreAfterMaxFailures.java:70)
    at org.apache.lucene.util.TestRuleMarkFailure$1.evaluate(TestRuleMarkFailure.java:48)
    at com.carrotsearch.randomizedtesting.rules.StatementAdapter.evaluate(StatementAdapter.java:36)
    at com.carrotsearch.randomizedtesting.ThreadLeakControl$StatementRunner.run(ThreadLeakControl.java:359)
    at com.carrotsearch.randomizedtesting.ThreadLeakControl.forkTimeoutingTask(ThreadLeakControl.java:783)
    at com.carrotsearch.randomizedtesting.ThreadLeakControl$3.evaluate(ThreadLeakControl.java:443)
    at com.carrotsearch.randomizedtesting.RandomizedRunner.runSingleTest(RandomizedRunner.java:835)
    at com.carrotsearch.randomizedtesting.RandomizedRunner$3.evaluate(RandomizedRunner.java:737)
    at com.carrotsearch.randomizedtesting.RandomizedRunner$4.evaluate(RandomizedRunner.java:771)
    at com.carrotsearch.randomizedtesting.RandomizedRunner$5.evaluate(RandomizedRunner.java:782)
    at org.apache.lucene.util.AbstractBeforeAfterRule$1.evaluate(AbstractBeforeAfterRule.java:46)
    at org.apache.lucene.util.TestRuleStoreClassName$1.evaluate(TestRuleStoreClassName.java:42)
    at com.carrotsearch.randomizedtesting.rules.SystemPropertiesInvariantRule$1.evaluate(SystemPropertiesInvariantRule.java:55)
    at com.carrotsearch.randomizedtesting.rules.NoShadowingOrOverridesOnMethodsRule$1.evaluate(NoShadowingOrOverridesOnMethodsRule.java:39)
    at com.carrotsearch.randomizedtesting.rules.NoShadowingOrOverridesOnMethodsRule$1.evaluate(NoShadowingOrOverridesOnMethodsRule.java:39)
    at com.carrotsearch.randomizedtesting.rules.StatementAdapter.evaluate(StatementAdapter.java:36)
    at org.apache.lucene.util.TestRuleAssertionsRequired$1.evaluate(TestRuleAssertionsRequired.java:43)
    at org.apache.lucene.util.TestRuleMarkFailure$1.evaluate(TestRuleMarkFailure.java:48)
    at org.apache.lucene.util.TestRuleIgnoreAfterMaxFailures$1.evaluate(TestRuleIgnoreAfterMaxFailures.java:70)
    at org.apache.lucene.util.TestRuleIgnoreTestSuites$1.evaluate(TestRuleIgnoreTestSuites.java:55)
    at com.carrotsearch.randomizedtesting.rules.StatementAdapter.evaluate(StatementAdapter.java:36)
    at com.carrotsearch.randomizedtesting.ThreadLeakControl$StatementRunner.run(ThreadLeakControl.java:359)
    at java.lang.Thread.run(Thread.java:724)

Performance issues

I'm confused a bit but at my cases Rhino 1.74 outperforms DynJS 0.21 a lot...
I'm running LESS and CoffeeScript compilers in both runtimes.
WTF?

Support runtime binding of Java object methods to JS Objects

Supported by Nashorn - this would be a nice addition to dynjs.

var obj = {};
Object.bindProperties(obj, myJavaObject);
print(obj.foo); // calls myJavaObject.getFoo() bean getter

From the nashorn-dev mailing list, "The above 'binds' bean-style properties of your Java object to the script object "obj". The script object could have usual proto and so on. This flexible option allows your script object to behave as normal script object -- but some properties being implemented in Java".

References:
https://wiki.openjdk.java.net/display/Nashorn/Nashorn+jsr223+engine+notes
https://wiki.openjdk.java.net/display/Nashorn/Nashorn+extensions

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.