Refactoring. Add AsyncCallback support

This commit is contained in:
konsoletyper 2015-02-07 18:36:18 +04:00
parent 942542df6f
commit 3b1d6851a4
175 changed files with 555 additions and 292 deletions

View File

@ -82,6 +82,7 @@
<module>teavm-platform</module> <module>teavm-platform</module>
<module>teavm-cli</module> <module>teavm-cli</module>
<module>teavm-chrome-rdp</module> <module>teavm-chrome-rdp</module>
<module>teavm-tests</module>
</modules> </modules>
<dependencyManagement> <dependencyManagement>

View File

@ -49,6 +49,16 @@
<artifactId>teavm-core</artifactId> <artifactId>teavm-core</artifactId>
<version>${project.version}</version> <version>${project.version}</version>
</dependency> </dependency>
<dependency>
<groupId>org.teavm</groupId>
<artifactId>teavm-jso</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.teavm</groupId>
<artifactId>teavm-dom</artifactId>
<version>${project.version}</version>
</dependency>
<dependency> <dependency>
<groupId>com.google.code.gson</groupId> <groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId> <artifactId>gson</artifactId>
@ -74,34 +84,6 @@
</instructions> </instructions>
</configuration> </configuration>
</plugin> </plugin>
<plugin>
<groupId>org.teavm</groupId>
<artifactId>teavm-maven-plugin</artifactId>
<version>${project.version}</version>
<dependencies>
<dependency>
<groupId>org.teavm</groupId>
<artifactId>teavm-platform</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
<executions>
<execution>
<id>generate-javascript-tests</id>
<goals>
<goal>build-test-javascript</goal>
</goals>
<phase>process-test-classes</phase>
<configuration>
<minifying>false</minifying>
<properties>
<java.util.Locale.available>en, en_US, en_GB, ru, ru_RU</java.util.Locale.available>
</properties>
<incremental>${teavm.classlib.test.incremental}</incremental>
</configuration>
</execution>
</executions>
</plugin>
<plugin> <plugin>
<groupId>org.codehaus.mojo</groupId> <groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId> <artifactId>exec-maven-plugin</artifactId>
@ -135,15 +117,6 @@
</arguments> </arguments>
</configuration> </configuration>
</plugin> </plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<excludes>
<exclude>org/teavm/platform/metadata/*.java</exclude>
</excludes>
</configuration>
</plugin>
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId> <artifactId>maven-source-plugin</artifactId>

View File

@ -16,7 +16,7 @@
package org.teavm.classlib.impl; package org.teavm.classlib.impl;
import org.teavm.diagnostics.Diagnostics; import org.teavm.diagnostics.Diagnostics;
import org.teavm.javascript.ni.PreserveOriginalName; import org.teavm.javascript.spi.PreserveOriginalName;
import org.teavm.model.*; import org.teavm.model.*;
/** /**

View File

@ -23,8 +23,8 @@ import java.net.URL;
import java.util.*; import java.util.*;
import org.teavm.codegen.SourceWriter; import org.teavm.codegen.SourceWriter;
import org.teavm.dependency.*; import org.teavm.dependency.*;
import org.teavm.javascript.ni.Generator; import org.teavm.javascript.spi.Generator;
import org.teavm.javascript.ni.GeneratorContext; import org.teavm.javascript.spi.GeneratorContext;
import org.teavm.model.CallLocation; import org.teavm.model.CallLocation;
import org.teavm.model.MethodDescriptor; import org.teavm.model.MethodDescriptor;
import org.teavm.model.MethodReference; import org.teavm.model.MethodReference;

View File

@ -22,8 +22,8 @@ import org.teavm.codegen.SourceWriter;
import org.teavm.dependency.DependencyAgent; import org.teavm.dependency.DependencyAgent;
import org.teavm.dependency.DependencyPlugin; import org.teavm.dependency.DependencyPlugin;
import org.teavm.dependency.MethodDependency; import org.teavm.dependency.MethodDependency;
import org.teavm.javascript.ni.Generator; import org.teavm.javascript.spi.Generator;
import org.teavm.javascript.ni.GeneratorContext; import org.teavm.javascript.spi.GeneratorContext;
import org.teavm.model.CallLocation; import org.teavm.model.CallLocation;
import org.teavm.model.MethodReference; import org.teavm.model.MethodReference;

View File

@ -20,10 +20,10 @@ import org.teavm.codegen.SourceWriter;
import org.teavm.dependency.DependencyAgent; import org.teavm.dependency.DependencyAgent;
import org.teavm.dependency.DependencyPlugin; import org.teavm.dependency.DependencyPlugin;
import org.teavm.dependency.MethodDependency; import org.teavm.dependency.MethodDependency;
import org.teavm.javascript.ni.Generator; import org.teavm.javascript.spi.Generator;
import org.teavm.javascript.ni.GeneratorContext; import org.teavm.javascript.spi.GeneratorContext;
import org.teavm.javascript.ni.Injector; import org.teavm.javascript.spi.Injector;
import org.teavm.javascript.ni.InjectorContext; import org.teavm.javascript.spi.InjectorContext;
import org.teavm.model.*; import org.teavm.model.*;
/** /**

View File

@ -17,8 +17,8 @@ package org.teavm.classlib.java.lang;
import java.io.IOException; import java.io.IOException;
import org.teavm.codegen.SourceWriter; import org.teavm.codegen.SourceWriter;
import org.teavm.javascript.ni.Generator; import org.teavm.javascript.spi.Generator;
import org.teavm.javascript.ni.GeneratorContext; import org.teavm.javascript.spi.GeneratorContext;
import org.teavm.model.MethodReference; import org.teavm.model.MethodReference;
/** /**

View File

@ -17,10 +17,10 @@ package org.teavm.classlib.java.lang;
import java.io.IOException; import java.io.IOException;
import org.teavm.codegen.SourceWriter; import org.teavm.codegen.SourceWriter;
import org.teavm.javascript.ni.Generator; import org.teavm.javascript.spi.Generator;
import org.teavm.javascript.ni.GeneratorContext; import org.teavm.javascript.spi.GeneratorContext;
import org.teavm.javascript.ni.Injector; import org.teavm.javascript.spi.Injector;
import org.teavm.javascript.ni.InjectorContext; import org.teavm.javascript.spi.InjectorContext;
import org.teavm.model.MethodReference; import org.teavm.model.MethodReference;
/** /**

View File

@ -17,10 +17,10 @@ package org.teavm.classlib.java.lang;
import java.io.IOException; import java.io.IOException;
import org.teavm.codegen.SourceWriter; import org.teavm.codegen.SourceWriter;
import org.teavm.javascript.ni.Generator; import org.teavm.javascript.spi.Generator;
import org.teavm.javascript.ni.GeneratorContext; import org.teavm.javascript.spi.GeneratorContext;
import org.teavm.javascript.ni.Injector; import org.teavm.javascript.spi.Injector;
import org.teavm.javascript.ni.InjectorContext; import org.teavm.javascript.spi.InjectorContext;
import org.teavm.model.MethodReference; import org.teavm.model.MethodReference;
/** /**

View File

@ -17,8 +17,8 @@ package org.teavm.classlib.java.lang;
import java.io.IOException; import java.io.IOException;
import org.teavm.codegen.SourceWriter; import org.teavm.codegen.SourceWriter;
import org.teavm.javascript.ni.Generator; import org.teavm.javascript.spi.Generator;
import org.teavm.javascript.ni.GeneratorContext; import org.teavm.javascript.spi.GeneratorContext;
import org.teavm.model.MethodReference; import org.teavm.model.MethodReference;
/** /**

View File

@ -17,8 +17,8 @@ package org.teavm.classlib.java.lang;
import java.io.IOException; import java.io.IOException;
import org.teavm.codegen.SourceWriter; import org.teavm.codegen.SourceWriter;
import org.teavm.javascript.ni.Generator; import org.teavm.javascript.spi.Generator;
import org.teavm.javascript.ni.GeneratorContext; import org.teavm.javascript.spi.GeneratorContext;
import org.teavm.model.MethodReference; import org.teavm.model.MethodReference;
/** /**

View File

@ -18,10 +18,10 @@ package org.teavm.classlib.java.lang;
import java.io.IOException; import java.io.IOException;
import org.teavm.codegen.SourceWriter; import org.teavm.codegen.SourceWriter;
import org.teavm.dependency.*; import org.teavm.dependency.*;
import org.teavm.javascript.ni.Generator; import org.teavm.javascript.spi.Generator;
import org.teavm.javascript.ni.GeneratorContext; import org.teavm.javascript.spi.GeneratorContext;
import org.teavm.javascript.ni.Injector; import org.teavm.javascript.spi.Injector;
import org.teavm.javascript.ni.InjectorContext; import org.teavm.javascript.spi.InjectorContext;
import org.teavm.model.CallLocation; import org.teavm.model.CallLocation;
import org.teavm.model.MethodReference; import org.teavm.model.MethodReference;

View File

@ -19,8 +19,8 @@ import java.io.IOException;
import org.teavm.dependency.DependencyAgent; import org.teavm.dependency.DependencyAgent;
import org.teavm.dependency.DependencyPlugin; import org.teavm.dependency.DependencyPlugin;
import org.teavm.dependency.MethodDependency; import org.teavm.dependency.MethodDependency;
import org.teavm.javascript.ni.Injector; import org.teavm.javascript.spi.Injector;
import org.teavm.javascript.ni.InjectorContext; import org.teavm.javascript.spi.InjectorContext;
import org.teavm.model.CallLocation; import org.teavm.model.CallLocation;
import org.teavm.model.MethodReference; import org.teavm.model.MethodReference;

View File

@ -18,8 +18,8 @@ package org.teavm.classlib.java.lang;
import java.io.IOException; import java.io.IOException;
import org.teavm.codegen.SourceWriter; import org.teavm.codegen.SourceWriter;
import org.teavm.dependency.*; import org.teavm.dependency.*;
import org.teavm.javascript.ni.Generator; import org.teavm.javascript.spi.Generator;
import org.teavm.javascript.ni.GeneratorContext; import org.teavm.javascript.spi.GeneratorContext;
import org.teavm.model.CallLocation; import org.teavm.model.CallLocation;
import org.teavm.model.FieldReference; import org.teavm.model.FieldReference;
import org.teavm.model.MethodReference; import org.teavm.model.MethodReference;

View File

@ -16,7 +16,7 @@
package org.teavm.classlib.java.lang; package org.teavm.classlib.java.lang;
import org.teavm.classlib.java.io.TSerializable; import org.teavm.classlib.java.io.TSerializable;
import org.teavm.javascript.ni.GeneratedBy; import org.teavm.javascript.spi.GeneratedBy;
/** /**
* *

View File

@ -18,7 +18,7 @@ package org.teavm.classlib.java.lang;
import org.teavm.classlib.impl.charset.UTF16Helper; import org.teavm.classlib.impl.charset.UTF16Helper;
import org.teavm.classlib.impl.unicode.UnicodeHelper; import org.teavm.classlib.impl.unicode.UnicodeHelper;
import org.teavm.dependency.PluggableDependency; import org.teavm.dependency.PluggableDependency;
import org.teavm.javascript.ni.GeneratedBy; import org.teavm.javascript.spi.GeneratedBy;
/** /**
* *

View File

@ -16,8 +16,8 @@
package org.teavm.classlib.java.lang; package org.teavm.classlib.java.lang;
import org.teavm.dependency.PluggableDependency; import org.teavm.dependency.PluggableDependency;
import org.teavm.javascript.ni.GeneratedBy; import org.teavm.javascript.spi.GeneratedBy;
import org.teavm.javascript.ni.InjectedBy; import org.teavm.javascript.spi.InjectedBy;
/** /**
* *

View File

@ -17,7 +17,7 @@ package org.teavm.classlib.java.lang;
import org.teavm.classlib.java.io.TIOException; import org.teavm.classlib.java.io.TIOException;
import org.teavm.classlib.java.io.TOutputStream; import org.teavm.classlib.java.io.TOutputStream;
import org.teavm.javascript.ni.GeneratedBy; import org.teavm.javascript.spi.GeneratedBy;
/** /**
* *

View File

@ -17,7 +17,7 @@ package org.teavm.classlib.java.lang;
import org.teavm.classlib.java.io.TIOException; import org.teavm.classlib.java.io.TIOException;
import org.teavm.classlib.java.io.TOutputStream; import org.teavm.classlib.java.io.TOutputStream;
import org.teavm.javascript.ni.GeneratedBy; import org.teavm.javascript.spi.GeneratedBy;
/** /**
* *

View File

@ -15,8 +15,8 @@
*/ */
package org.teavm.classlib.java.lang; package org.teavm.classlib.java.lang;
import org.teavm.javascript.ni.GeneratedBy; import org.teavm.javascript.spi.GeneratedBy;
import org.teavm.javascript.ni.InjectedBy; import org.teavm.javascript.spi.InjectedBy;
/** /**
* *

View File

@ -16,7 +16,7 @@
package org.teavm.classlib.java.lang; package org.teavm.classlib.java.lang;
import org.teavm.classlib.java.io.TSerializable; import org.teavm.classlib.java.io.TSerializable;
import org.teavm.javascript.ni.Rename; import org.teavm.javascript.spi.Rename;
/** /**
* *

View File

@ -15,7 +15,7 @@
*/ */
package org.teavm.classlib.java.lang; package org.teavm.classlib.java.lang;
import org.teavm.javascript.ni.GeneratedBy; import org.teavm.javascript.spi.GeneratedBy;
/** /**
* *

View File

@ -15,7 +15,7 @@
*/ */
package org.teavm.classlib.java.lang; package org.teavm.classlib.java.lang;
import org.teavm.javascript.ni.GeneratedBy; import org.teavm.javascript.spi.GeneratedBy;
/** /**
* *

View File

@ -15,7 +15,7 @@
*/ */
package org.teavm.classlib.java.lang; package org.teavm.classlib.java.lang;
import org.teavm.javascript.ni.GeneratedBy; import org.teavm.javascript.spi.GeneratedBy;
/** /**
* *

View File

@ -16,10 +16,10 @@
package org.teavm.classlib.java.lang; package org.teavm.classlib.java.lang;
import org.teavm.dependency.PluggableDependency; import org.teavm.dependency.PluggableDependency;
import org.teavm.javascript.ni.GeneratedBy; import org.teavm.javascript.spi.GeneratedBy;
import org.teavm.javascript.ni.InjectedBy; import org.teavm.javascript.spi.InjectedBy;
import org.teavm.javascript.ni.Rename; import org.teavm.javascript.spi.Rename;
import org.teavm.javascript.ni.Superclass; import org.teavm.javascript.spi.Superclass;
/** /**
* *

View File

@ -15,7 +15,7 @@
*/ */
package org.teavm.classlib.java.lang; package org.teavm.classlib.java.lang;
import org.teavm.javascript.ni.Superclass; import org.teavm.javascript.spi.Superclass;
/** /**
* *

View File

@ -24,7 +24,7 @@ import org.teavm.classlib.java.util.THashMap;
import org.teavm.classlib.java.util.TMap; import org.teavm.classlib.java.util.TMap;
import org.teavm.classlib.java.util.regex.TPattern; import org.teavm.classlib.java.util.regex.TPattern;
import org.teavm.dependency.PluggableDependency; import org.teavm.dependency.PluggableDependency;
import org.teavm.javascript.ni.InjectedBy; import org.teavm.javascript.spi.InjectedBy;
/** /**
* *

View File

@ -18,7 +18,7 @@ package org.teavm.classlib.java.lang;
import org.teavm.classlib.java.io.TPrintStream; import org.teavm.classlib.java.io.TPrintStream;
import org.teavm.classlib.java.lang.reflect.TArray; import org.teavm.classlib.java.lang.reflect.TArray;
import org.teavm.dependency.PluggableDependency; import org.teavm.dependency.PluggableDependency;
import org.teavm.javascript.ni.GeneratedBy; import org.teavm.javascript.spi.GeneratedBy;
/** /**
* *

View File

@ -15,14 +15,18 @@
*/ */
package org.teavm.classlib.java.lang; package org.teavm.classlib.java.lang;
import org.teavm.javascript.ni.GeneratedBy; import org.teavm.dom.browser.TimerHandler;
import org.teavm.runtime.Async; import org.teavm.dom.browser.Window;
import org.teavm.javascript.spi.Async;
import org.teavm.jso.JS;
import org.teavm.platform.async.AsyncCallback;
/** /**
* *
* @author Alexey Andreev * @author Alexey Andreev
*/ */
public class TThread extends TObject implements TRunnable { public class TThread extends TObject implements TRunnable {
private static Window window = (Window)JS.getGlobal();
private static TThread currentThread = new TThread(TString.wrap("main")); private static TThread currentThread = new TThread(TString.wrap("main"));
private TString name; private TString name;
private TRunnable target; private TRunnable target;
@ -60,9 +64,16 @@ public class TThread extends TObject implements TRunnable {
} }
@Async @Async
@GeneratedBy(ThreadNativeGenerator.class)
public static native void yield(); public static native void yield();
private static void yield(final AsyncCallback<Void> callback) {
window.setTimeout(new TimerHandler() {
@Override public void onTimer() {
callback.complete(null);
}
}, 0);
}
public void interrupt() { public void interrupt() {
} }
@ -86,11 +97,14 @@ public class TThread extends TObject implements TRunnable {
return true; return true;
} }
public static void sleep(long millis) throws TInterruptedException {
sleep((double)millis);
}
@Async @Async
@GeneratedBy(ThreadNativeGenerator.class) public static native void sleep(long millis) throws TInterruptedException;
private static native void sleep(double millis) throws TInterruptedException;
private static void sleep(long millis, final AsyncCallback<Void> callback) {
window.setTimeout(new TimerHandler() {
@Override public void onTimer() {
callback.complete(null);
}
}, millis);
}
} }

View File

@ -17,9 +17,9 @@ package org.teavm.classlib.java.lang;
import org.teavm.classlib.java.io.TPrintStream; import org.teavm.classlib.java.io.TPrintStream;
import org.teavm.classlib.java.util.TArrays; import org.teavm.classlib.java.util.TArrays;
import org.teavm.javascript.ni.Remove; import org.teavm.javascript.spi.Remove;
import org.teavm.javascript.ni.Rename; import org.teavm.javascript.spi.Rename;
import org.teavm.javascript.ni.Superclass; import org.teavm.javascript.spi.Superclass;
/** /**
* *

View File

@ -17,8 +17,8 @@ package org.teavm.classlib.java.lang;
import java.io.IOException; import java.io.IOException;
import org.teavm.codegen.SourceWriter; import org.teavm.codegen.SourceWriter;
import org.teavm.javascript.ni.Generator; import org.teavm.javascript.spi.Generator;
import org.teavm.javascript.ni.GeneratorContext; import org.teavm.javascript.spi.GeneratorContext;
import org.teavm.model.MethodReference; import org.teavm.model.MethodReference;
/** /**

View File

@ -18,8 +18,8 @@ package org.teavm.classlib.java.lang.reflect;
import java.io.IOException; import java.io.IOException;
import org.teavm.codegen.SourceWriter; import org.teavm.codegen.SourceWriter;
import org.teavm.dependency.*; import org.teavm.dependency.*;
import org.teavm.javascript.ni.Generator; import org.teavm.javascript.spi.Generator;
import org.teavm.javascript.ni.GeneratorContext; import org.teavm.javascript.spi.GeneratorContext;
import org.teavm.model.CallLocation; import org.teavm.model.CallLocation;
import org.teavm.model.ClassReader; import org.teavm.model.ClassReader;
import org.teavm.model.MethodDescriptor; import org.teavm.model.MethodDescriptor;

View File

@ -17,7 +17,7 @@ package org.teavm.classlib.java.lang.reflect;
import org.teavm.classlib.java.lang.*; import org.teavm.classlib.java.lang.*;
import org.teavm.dependency.PluggableDependency; import org.teavm.dependency.PluggableDependency;
import org.teavm.javascript.ni.GeneratedBy; import org.teavm.javascript.spi.GeneratedBy;
/** /**
* *

View File

@ -21,7 +21,7 @@ import org.teavm.classlib.java.lang.TException;
import org.teavm.classlib.java.lang.TIllegalArgumentException; import org.teavm.classlib.java.lang.TIllegalArgumentException;
import org.teavm.classlib.java.lang.TNullPointerException; import org.teavm.classlib.java.lang.TNullPointerException;
import org.teavm.classlib.java.lang.TString; import org.teavm.classlib.java.lang.TString;
import org.teavm.javascript.ni.Rename; import org.teavm.javascript.spi.Rename;
/** /**
* A {@code URISyntaxException} will be thrown if some information could not be parsed * A {@code URISyntaxException} will be thrown if some information could not be parsed

View File

@ -20,8 +20,8 @@ import org.teavm.codegen.SourceWriter;
import org.teavm.dependency.DependencyAgent; import org.teavm.dependency.DependencyAgent;
import org.teavm.dependency.DependencyPlugin; import org.teavm.dependency.DependencyPlugin;
import org.teavm.dependency.MethodDependency; import org.teavm.dependency.MethodDependency;
import org.teavm.javascript.ni.Generator; import org.teavm.javascript.spi.Generator;
import org.teavm.javascript.ni.GeneratorContext; import org.teavm.javascript.spi.GeneratorContext;
import org.teavm.model.CallLocation; import org.teavm.model.CallLocation;
import org.teavm.model.MethodReference; import org.teavm.model.MethodReference;

View File

@ -17,8 +17,8 @@ package org.teavm.classlib.java.util;
import java.io.IOException; import java.io.IOException;
import org.teavm.codegen.SourceWriter; import org.teavm.codegen.SourceWriter;
import org.teavm.javascript.ni.Generator; import org.teavm.javascript.spi.Generator;
import org.teavm.javascript.ni.GeneratorContext; import org.teavm.javascript.spi.GeneratorContext;
import org.teavm.model.MethodReference; import org.teavm.model.MethodReference;
/** /**

View File

@ -16,7 +16,7 @@
package org.teavm.classlib.java.util; package org.teavm.classlib.java.util;
import org.teavm.classlib.java.lang.*; import org.teavm.classlib.java.lang.*;
import org.teavm.javascript.ni.Rename; import org.teavm.javascript.spi.Rename;
/** /**
* *

View File

@ -18,7 +18,7 @@ package org.teavm.classlib.java.util;
import java.util.Arrays; import java.util.Arrays;
import org.teavm.classlib.java.io.TSerializable; import org.teavm.classlib.java.io.TSerializable;
import org.teavm.classlib.java.lang.*; import org.teavm.classlib.java.lang.*;
import org.teavm.javascript.ni.Rename; import org.teavm.javascript.spi.Rename;
/** /**
* *

View File

@ -17,7 +17,7 @@ package org.teavm.classlib.java.util;
import org.teavm.classlib.java.io.TSerializable; import org.teavm.classlib.java.io.TSerializable;
import org.teavm.classlib.java.lang.*; import org.teavm.classlib.java.lang.*;
import org.teavm.javascript.ni.Rename; import org.teavm.javascript.spi.Rename;
/** /**
* *

View File

@ -18,7 +18,7 @@ package org.teavm.classlib.java.util;
import org.teavm.classlib.java.lang.TComparable; import org.teavm.classlib.java.lang.TComparable;
import org.teavm.classlib.java.lang.TSystem; import org.teavm.classlib.java.lang.TSystem;
import org.teavm.dependency.PluggableDependency; import org.teavm.dependency.PluggableDependency;
import org.teavm.javascript.ni.GeneratedBy; import org.teavm.javascript.spi.GeneratedBy;
/** /**
* *

View File

@ -39,7 +39,7 @@ import org.teavm.classlib.java.lang.TCloneNotSupportedException;
import org.teavm.classlib.java.lang.TIllegalArgumentException; import org.teavm.classlib.java.lang.TIllegalArgumentException;
import org.teavm.classlib.java.lang.TIllegalStateException; import org.teavm.classlib.java.lang.TIllegalStateException;
import org.teavm.classlib.java.lang.TObject; import org.teavm.classlib.java.lang.TObject;
import org.teavm.javascript.ni.Rename; import org.teavm.javascript.spi.Rename;
public class THashMap<K, V> extends TAbstractMap<K, V> implements TSerializable { public class THashMap<K, V> extends TAbstractMap<K, V> implements TSerializable {
transient int elementCount; transient int elementCount;

View File

@ -20,7 +20,7 @@ import org.teavm.classlib.java.io.TSerializable;
import org.teavm.classlib.java.lang.TCloneNotSupportedException; import org.teavm.classlib.java.lang.TCloneNotSupportedException;
import org.teavm.classlib.java.lang.TCloneable; import org.teavm.classlib.java.lang.TCloneable;
import org.teavm.classlib.java.lang.TObject; import org.teavm.classlib.java.lang.TObject;
import org.teavm.javascript.ni.Rename; import org.teavm.javascript.spi.Rename;
/** /**
* *

View File

@ -18,7 +18,7 @@ package org.teavm.classlib.java.util;
import org.teavm.classlib.java.io.TSerializable; import org.teavm.classlib.java.io.TSerializable;
import org.teavm.classlib.java.lang.TMath; import org.teavm.classlib.java.lang.TMath;
import org.teavm.classlib.java.lang.TObject; import org.teavm.classlib.java.lang.TObject;
import org.teavm.javascript.ni.GeneratedBy; import org.teavm.javascript.spi.GeneratedBy;
/** /**
* *

View File

@ -19,7 +19,7 @@ import org.teavm.classlib.java.lang.TIllegalStateException;
import org.teavm.classlib.java.lang.TObject; import org.teavm.classlib.java.lang.TObject;
import org.teavm.classlib.java.lang.TString; import org.teavm.classlib.java.lang.TString;
import org.teavm.dependency.PluggableDependency; import org.teavm.dependency.PluggableDependency;
import org.teavm.javascript.ni.GeneratedBy; import org.teavm.javascript.spi.GeneratedBy;
/** /**
* *

View File

@ -21,8 +21,8 @@ import org.teavm.codegen.SourceWriter;
import org.teavm.dependency.DependencyAgent; import org.teavm.dependency.DependencyAgent;
import org.teavm.dependency.DependencyPlugin; import org.teavm.dependency.DependencyPlugin;
import org.teavm.dependency.MethodDependency; import org.teavm.dependency.MethodDependency;
import org.teavm.javascript.ni.Generator; import org.teavm.javascript.spi.Generator;
import org.teavm.javascript.ni.GeneratorContext; import org.teavm.javascript.spi.GeneratorContext;
import org.teavm.model.CallLocation; import org.teavm.model.CallLocation;
import org.teavm.model.MethodReference; import org.teavm.model.MethodReference;

View File

@ -17,8 +17,8 @@ package org.teavm.classlib.java.util.logging;
import java.io.IOException; import java.io.IOException;
import org.teavm.codegen.SourceWriter; import org.teavm.codegen.SourceWriter;
import org.teavm.javascript.ni.Generator; import org.teavm.javascript.spi.Generator;
import org.teavm.javascript.ni.GeneratorContext; import org.teavm.javascript.spi.GeneratorContext;
import org.teavm.model.MethodReference; import org.teavm.model.MethodReference;
/** /**

View File

@ -18,7 +18,7 @@ package org.teavm.classlib.java.util.logging;
import org.teavm.classlib.java.lang.*; import org.teavm.classlib.java.lang.*;
import org.teavm.classlib.java.util.THashMap; import org.teavm.classlib.java.util.THashMap;
import org.teavm.classlib.java.util.TMap; import org.teavm.classlib.java.util.TMap;
import org.teavm.javascript.ni.GeneratedBy; import org.teavm.javascript.spi.GeneratedBy;
/** /**
* *

View File

@ -22,5 +22,5 @@ import org.teavm.model.CallLocation;
* @author Alexey Andreev * @author Alexey Andreev
*/ */
public interface DependencyPlugin { public interface DependencyPlugin {
void methodAchieved(DependencyAgent checker, MethodDependency method, CallLocation location); void methodAchieved(DependencyAgent agent, MethodDependency method, CallLocation location);
} }

View File

@ -18,10 +18,10 @@ package org.teavm.javascript;
import java.util.*; import java.util.*;
import org.teavm.common.*; import org.teavm.common.*;
import org.teavm.javascript.ast.*; import org.teavm.javascript.ast.*;
import org.teavm.javascript.ni.GeneratedBy; import org.teavm.javascript.spi.GeneratedBy;
import org.teavm.javascript.ni.Generator; import org.teavm.javascript.spi.Generator;
import org.teavm.javascript.ni.InjectedBy; import org.teavm.javascript.spi.InjectedBy;
import org.teavm.javascript.ni.PreserveOriginalName; import org.teavm.javascript.spi.PreserveOriginalName;
import org.teavm.model.*; import org.teavm.model.*;
import org.teavm.model.util.AsyncProgramSplitter; import org.teavm.model.util.AsyncProgramSplitter;
import org.teavm.model.util.ProgramUtils; import org.teavm.model.util.ProgramUtils;

View File

@ -27,10 +27,10 @@ import org.teavm.debugging.information.DebugInformationEmitter;
import org.teavm.debugging.information.DeferredCallSite; import org.teavm.debugging.information.DeferredCallSite;
import org.teavm.debugging.information.DummyDebugInformationEmitter; import org.teavm.debugging.information.DummyDebugInformationEmitter;
import org.teavm.javascript.ast.*; import org.teavm.javascript.ast.*;
import org.teavm.javascript.ni.GeneratorContext; import org.teavm.javascript.spi.GeneratorContext;
import org.teavm.javascript.ni.InjectedBy; import org.teavm.javascript.spi.InjectedBy;
import org.teavm.javascript.ni.Injector; import org.teavm.javascript.spi.Injector;
import org.teavm.javascript.ni.InjectorContext; import org.teavm.javascript.spi.InjectorContext;
import org.teavm.model.*; import org.teavm.model.*;
/** /**
@ -53,6 +53,7 @@ public class Renderer implements ExprVisitor, StatementVisitor, RenderingContext
private Deque<LocationStackEntry> locationStack = new ArrayDeque<>(); private Deque<LocationStackEntry> locationStack = new ArrayDeque<>();
private DeferredCallSite lastCallSite; private DeferredCallSite lastCallSite;
private DeferredCallSite prevCallSite; private DeferredCallSite prevCallSite;
private Set<MethodReference> asyncMethods;
private boolean async; private boolean async;
private static class InjectorHolder { private static class InjectorHolder {
@ -76,12 +77,13 @@ public class Renderer implements ExprVisitor, StatementVisitor, RenderingContext
} }
public Renderer(SourceWriter writer, ListableClassHolderSource classSource, ClassLoader classLoader, public Renderer(SourceWriter writer, ListableClassHolderSource classSource, ClassLoader classLoader,
ServiceRepository services) { ServiceRepository services, Set<MethodReference> asyncMethods) {
this.naming = writer.getNaming(); this.naming = writer.getNaming();
this.writer = writer; this.writer = writer;
this.classSource = classSource; this.classSource = classSource;
this.classLoader = classLoader; this.classLoader = classLoader;
this.services = services; this.services = services;
this.asyncMethods = new HashSet<>(asyncMethods);
} }
@Override @Override
@ -695,6 +697,11 @@ public class Renderer implements ExprVisitor, StatementVisitor, RenderingContext
return async; return async;
} }
@Override
public boolean isAsync(MethodReference method) {
return asyncMethods.contains(method);
}
@Override @Override
public String getCompleteContinuation() { public String getCompleteContinuation() {
return "$return"; return "$return";

View File

@ -15,7 +15,7 @@
*/ */
package org.teavm.javascript.ast; package org.teavm.javascript.ast;
import org.teavm.javascript.ni.Generator; import org.teavm.javascript.spi.Generator;
import org.teavm.model.MethodReference; import org.teavm.model.MethodReference;
/** /**

View File

@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.teavm.runtime; package org.teavm.javascript.spi;
import java.lang.annotation.ElementType; import java.lang.annotation.ElementType;
import java.lang.annotation.Retention; import java.lang.annotation.Retention;

View File

@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.teavm.javascript.ni; package org.teavm.javascript.spi;
import java.lang.annotation.ElementType; import java.lang.annotation.ElementType;
import java.lang.annotation.Retention; import java.lang.annotation.Retention;

View File

@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.teavm.javascript.ni; package org.teavm.javascript.spi;
import java.io.IOException; import java.io.IOException;
import org.teavm.codegen.SourceWriter; import org.teavm.codegen.SourceWriter;

View File

@ -13,11 +13,12 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.teavm.javascript.ni; package org.teavm.javascript.spi;
import java.util.Properties; import java.util.Properties;
import org.teavm.common.ServiceRepository; import org.teavm.common.ServiceRepository;
import org.teavm.model.ListableClassReaderSource; import org.teavm.model.ListableClassReaderSource;
import org.teavm.model.MethodReference;
/** /**
* *
@ -35,4 +36,6 @@ public interface GeneratorContext extends ServiceRepository {
boolean isAsync(); boolean isAsync();
String getCompleteContinuation(); String getCompleteContinuation();
boolean isAsync(MethodReference method);
} }

View File

@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.teavm.javascript.ni; package org.teavm.javascript.spi;
import java.lang.annotation.ElementType; import java.lang.annotation.ElementType;
import java.lang.annotation.Retention; import java.lang.annotation.Retention;

View File

@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.teavm.javascript.ni; package org.teavm.javascript.spi;
import java.io.IOException; import java.io.IOException;
import org.teavm.model.MethodReference; import org.teavm.model.MethodReference;

View File

@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.teavm.javascript.ni; package org.teavm.javascript.spi;
import java.io.IOException; import java.io.IOException;
import java.util.Properties; import java.util.Properties;

View File

@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.teavm.javascript.ni; package org.teavm.javascript.spi;
import java.lang.annotation.ElementType; import java.lang.annotation.ElementType;
import java.lang.annotation.Retention; import java.lang.annotation.Retention;

View File

@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.teavm.javascript.ni; package org.teavm.javascript.spi;
import java.lang.annotation.ElementType; import java.lang.annotation.ElementType;
import java.lang.annotation.Retention; import java.lang.annotation.Retention;

View File

@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.teavm.javascript.ni; package org.teavm.javascript.spi;
import java.lang.annotation.*; import java.lang.annotation.*;

View File

@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.teavm.javascript.ni; package org.teavm.javascript.spi;
import java.lang.annotation.ElementType; import java.lang.annotation.ElementType;
import java.lang.annotation.Retention; import java.lang.annotation.Retention;

View File

@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.teavm.runtime; package org.teavm.javascript.spi;
import java.lang.annotation.ElementType; import java.lang.annotation.ElementType;
import java.lang.annotation.Retention; import java.lang.annotation.Retention;

View File

@ -21,10 +21,10 @@ import org.teavm.callgraph.CallGraph;
import org.teavm.callgraph.CallGraphNode; import org.teavm.callgraph.CallGraphNode;
import org.teavm.callgraph.CallSite; import org.teavm.callgraph.CallSite;
import org.teavm.diagnostics.Diagnostics; import org.teavm.diagnostics.Diagnostics;
import org.teavm.javascript.ni.InjectedBy; import org.teavm.javascript.spi.Async;
import org.teavm.javascript.spi.InjectedBy;
import org.teavm.javascript.spi.Sync;
import org.teavm.model.*; import org.teavm.model.*;
import org.teavm.runtime.Async;
import org.teavm.runtime.Sync;
/** /**
* *

View File

@ -17,9 +17,9 @@ package org.teavm.parsing;
import java.util.Map; import java.util.Map;
import org.teavm.common.Mapper; import org.teavm.common.Mapper;
import org.teavm.javascript.ni.Remove; import org.teavm.javascript.spi.Remove;
import org.teavm.javascript.ni.Rename; import org.teavm.javascript.spi.Rename;
import org.teavm.javascript.ni.Superclass; import org.teavm.javascript.spi.Superclass;
import org.teavm.model.*; import org.teavm.model.*;
import org.teavm.model.instructions.*; import org.teavm.model.instructions.*;
import org.teavm.model.util.ModelUtils; import org.teavm.model.util.ModelUtils;

View File

@ -26,10 +26,10 @@ import org.teavm.diagnostics.AccumulationDiagnostics;
import org.teavm.diagnostics.ProblemProvider; import org.teavm.diagnostics.ProblemProvider;
import org.teavm.javascript.*; import org.teavm.javascript.*;
import org.teavm.javascript.ast.ClassNode; import org.teavm.javascript.ast.ClassNode;
import org.teavm.javascript.ni.GeneratedBy; import org.teavm.javascript.spi.GeneratedBy;
import org.teavm.javascript.ni.Generator; import org.teavm.javascript.spi.Generator;
import org.teavm.javascript.ni.InjectedBy; import org.teavm.javascript.spi.InjectedBy;
import org.teavm.javascript.ni.Injector; import org.teavm.javascript.spi.Injector;
import org.teavm.model.*; import org.teavm.model.*;
import org.teavm.model.instructions.*; import org.teavm.model.instructions.*;
import org.teavm.model.util.*; import org.teavm.model.util.*;
@ -396,7 +396,7 @@ public class TeaVM implements TeaVMHost, ServiceRepository {
SourceWriterBuilder builder = new SourceWriterBuilder(naming); SourceWriterBuilder builder = new SourceWriterBuilder(naming);
builder.setMinified(minifying); builder.setMinified(minifying);
SourceWriter sourceWriter = builder.build(writer); SourceWriter sourceWriter = builder.build(writer);
Renderer renderer = new Renderer(sourceWriter, classSet, classLoader, this); Renderer renderer = new Renderer(sourceWriter, classSet, classLoader, this, asyncMethods);
renderer.setProperties(properties); renderer.setProperties(properties);
if (debugEmitter != null) { if (debugEmitter != null) {
int classIndex = 0; int classIndex = 0;

View File

@ -17,8 +17,8 @@ package org.teavm.vm.spi;
import java.util.Properties; import java.util.Properties;
import org.teavm.dependency.DependencyListener; import org.teavm.dependency.DependencyListener;
import org.teavm.javascript.ni.Generator; import org.teavm.javascript.spi.Generator;
import org.teavm.javascript.ni.Injector; import org.teavm.javascript.spi.Injector;
import org.teavm.model.ClassHolderTransformer; import org.teavm.model.ClassHolderTransformer;
import org.teavm.model.MethodReference; import org.teavm.model.MethodReference;
import org.teavm.vm.TeaVM; import org.teavm.vm.TeaVM;

View File

@ -29,7 +29,7 @@ import org.teavm.jso.JSProperty;
* *
* @author Alexey Andreev * @author Alexey Andreev
*/ */
public interface Window extends JSGlobal, EventTarget, StorageProvider { public interface Window extends JSGlobal, EventTarget, StorageProvider, TypedArrayFactory {
@JSProperty @JSProperty
HTMLDocument getDocument(); HTMLDocument getDocument();
@ -42,10 +42,14 @@ public interface Window extends JSGlobal, EventTarget, StorageProvider {
int setTimeout(TimerHandler handler, int delay); int setTimeout(TimerHandler handler, int delay);
int setTimeout(TimerHandler handler, double delay);
void clearTimeout(int timeoutId); void clearTimeout(int timeoutId);
int setInterval(TimerHandler handler, int delay); int setInterval(TimerHandler handler, int delay);
int setInterval(TimerHandler handler, double delay);
void clearInterval(int timeoutId); void clearInterval(int timeoutId);
@JSProperty("JSON") @JSProperty("JSON")
@ -53,79 +57,4 @@ public interface Window extends JSGlobal, EventTarget, StorageProvider {
@JSConstructor("XMLHttpRequest") @JSConstructor("XMLHttpRequest")
XMLHttpRequest createXMLHttpRequest(); XMLHttpRequest createXMLHttpRequest();
@JSConstructor("ArrayBuffer")
ArrayBuffer createArrayBuffer(int length);
@JSConstructor("Int8Array")
Int8Array createInt8Array(int length);
@JSConstructor("Int8Array")
Int8Array createInt8Array(ArrayBuffer buffer);
@JSConstructor("Int8Array")
Int8Array createInt8Array(ArrayBuffer buffer, int offset, int length);
@JSConstructor("Uint8Array")
Uint8Array createUint8Array(int length);
@JSConstructor("Uint8Array")
Uint8Array createUint8Array(ArrayBuffer buffer);
@JSConstructor("Uint8Array")
Uint8Array createUint8Array(ArrayBuffer buffer, int offset, int length);
@JSConstructor("Uint8ClampedArray")
Uint8ClampedArray createUint8ClampedArray(int length);
@JSConstructor("Uint8ClampedArray")
Uint8ClampedArray createUint8ClampedArray(ArrayBuffer buffer);
@JSConstructor("Uint8ClampedArray")
Uint8ClampedArray createUintClamped8Array(ArrayBuffer buffer, int offset, int length);
@JSConstructor("Int16Array")
Int16Array createInt16Array(int length);
@JSConstructor("Int16Array")
Int16Array createInt16Array(ArrayBuffer buffer);
@JSConstructor("Int16Array")
Int16Array createInt16Array(ArrayBuffer buffer, int offset, int length);
@JSConstructor("Uint16Array")
Uint16Array createUint16Array(int length);
@JSConstructor("Uint16Array")
Uint16Array createUint16Array(ArrayBuffer buffer);
@JSConstructor("Uint16Array")
Uint16Array createUint16Array(ArrayBuffer buffer, int offset, int length);
@JSConstructor("Int32Array")
Int32Array createInt32Array(int length);
@JSConstructor("Int32Array")
Int32Array createInt32Array(ArrayBuffer buffer);
@JSConstructor("Int32Array")
Int32Array createInt32Array(ArrayBuffer buffer, int offset, int length);
@JSConstructor("Float32Array")
Float32Array createFloat32Array(int length);
@JSConstructor("Float32Array")
Float32Array createFloat32Array(ArrayBuffer buffer);
@JSConstructor("Float32Array")
Float32Array createFloat32Array(ArrayBuffer buffer, int offset, int length);
@JSConstructor("Float64Array")
Float64Array createFloat64Array(int length);
@JSConstructor("Float64Array")
Float64Array createFloat64Array(ArrayBuffer buffer);
@JSConstructor("Float64Array")
Float64Array createFloat64Array(ArrayBuffer buffer, int offset, int length);
} }

View File

@ -0,0 +1,100 @@
/*
* Copyright 2015 Alexey Andreev.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.teavm.dom.typedarrays;
import org.teavm.jso.JSConstructor;
import org.teavm.jso.JSObject;
/**
*
* @author Alexey Andreev <konsoletyper@gmail.com>
*/
public interface TypedArrayFactory extends JSObject {
@JSConstructor("ArrayBuffer")
ArrayBuffer createArrayBuffer(int length);
@JSConstructor("Int8Array")
Int8Array createInt8Array(int length);
@JSConstructor("Int8Array")
Int8Array createInt8Array(ArrayBuffer buffer);
@JSConstructor("Int8Array")
Int8Array createInt8Array(ArrayBuffer buffer, int offset, int length);
@JSConstructor("Uint8Array")
Uint8Array createUint8Array(int length);
@JSConstructor("Uint8Array")
Uint8Array createUint8Array(ArrayBuffer buffer);
@JSConstructor("Uint8Array")
Uint8Array createUint8Array(ArrayBuffer buffer, int offset, int length);
@JSConstructor("Uint8ClampedArray")
Uint8ClampedArray createUint8ClampedArray(int length);
@JSConstructor("Uint8ClampedArray")
Uint8ClampedArray createUint8ClampedArray(ArrayBuffer buffer);
@JSConstructor("Uint8ClampedArray")
Uint8ClampedArray createUintClamped8Array(ArrayBuffer buffer, int offset, int length);
@JSConstructor("Int16Array")
Int16Array createInt16Array(int length);
@JSConstructor("Int16Array")
Int16Array createInt16Array(ArrayBuffer buffer);
@JSConstructor("Int16Array")
Int16Array createInt16Array(ArrayBuffer buffer, int offset, int length);
@JSConstructor("Uint16Array")
Uint16Array createUint16Array(int length);
@JSConstructor("Uint16Array")
Uint16Array createUint16Array(ArrayBuffer buffer);
@JSConstructor("Uint16Array")
Uint16Array createUint16Array(ArrayBuffer buffer, int offset, int length);
@JSConstructor("Int32Array")
Int32Array createInt32Array(int length);
@JSConstructor("Int32Array")
Int32Array createInt32Array(ArrayBuffer buffer);
@JSConstructor("Int32Array")
Int32Array createInt32Array(ArrayBuffer buffer, int offset, int length);
@JSConstructor("Float32Array")
Float32Array createFloat32Array(int length);
@JSConstructor("Float32Array")
Float32Array createFloat32Array(ArrayBuffer buffer);
@JSConstructor("Float32Array")
Float32Array createFloat32Array(ArrayBuffer buffer, int offset, int length);
@JSConstructor("Float64Array")
Float64Array createFloat64Array(int length);
@JSConstructor("Float64Array")
Float64Array createFloat64Array(ArrayBuffer buffer);
@JSConstructor("Float64Array")
Float64Array createFloat64Array(ArrayBuffer buffer, int offset, int length);
}

View File

@ -21,8 +21,8 @@ import net.java.html.js.JavaScriptBody;
import org.teavm.codegen.NamingStrategy; import org.teavm.codegen.NamingStrategy;
import org.teavm.codegen.SourceWriter; import org.teavm.codegen.SourceWriter;
import org.teavm.javascript.Renderer; import org.teavm.javascript.Renderer;
import org.teavm.javascript.ni.Generator; import org.teavm.javascript.spi.Generator;
import org.teavm.javascript.ni.GeneratorContext; import org.teavm.javascript.spi.GeneratorContext;
import org.teavm.model.*; import org.teavm.model.*;
/** /**

View File

@ -17,7 +17,7 @@ package org.teavm.html4j;
import net.java.html.js.JavaScriptBody; import net.java.html.js.JavaScriptBody;
import org.teavm.diagnostics.Diagnostics; import org.teavm.diagnostics.Diagnostics;
import org.teavm.javascript.ni.GeneratedBy; import org.teavm.javascript.spi.GeneratedBy;
import org.teavm.model.*; import org.teavm.model.*;
/** /**

View File

@ -15,7 +15,7 @@
*/ */
package org.teavm.html4j; package org.teavm.html4j;
import org.teavm.javascript.ni.GeneratedBy; import org.teavm.javascript.spi.GeneratedBy;
/** /**
* *

View File

@ -17,8 +17,8 @@ package org.teavm.html4j;
import java.io.IOException; import java.io.IOException;
import org.teavm.codegen.SourceWriter; import org.teavm.codegen.SourceWriter;
import org.teavm.javascript.ni.Generator; import org.teavm.javascript.spi.Generator;
import org.teavm.javascript.ni.GeneratorContext; import org.teavm.javascript.spi.GeneratorContext;
import org.teavm.model.*; import org.teavm.model.*;
/** /**

View File

@ -43,42 +43,6 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xs
<build> <build>
<plugins> <plugins>
<plugin>
<groupId>org.teavm</groupId>
<artifactId>teavm-maven-plugin</artifactId>
<version>${project.version}</version>
<dependencies>
<dependency>
<groupId>org.teavm</groupId>
<artifactId>teavm-classlib</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
<executions>
<execution>
<id>generate-javascript-tests</id>
<goals>
<goal>build-test-javascript</goal>
</goals>
<phase>process-test-classes</phase>
<configuration>
<minifying>false</minifying>
<properties>
<java.util.Locale.available>en, en_US, en_GB, ru, ru_RU</java.util.Locale.available>
</properties>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<excludes>
<exclude>**</exclude>
</excludes>
</configuration>
</plugin>
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-checkstyle-plugin</artifactId> <artifactId>maven-checkstyle-plugin</artifactId>

View File

@ -17,7 +17,7 @@ package org.teavm.jso;
import java.util.Iterator; import java.util.Iterator;
import org.teavm.dependency.PluggableDependency; import org.teavm.dependency.PluggableDependency;
import org.teavm.javascript.ni.InjectedBy; import org.teavm.javascript.spi.InjectedBy;
import org.teavm.jso.plugin.JSNativeGenerator; import org.teavm.jso.plugin.JSNativeGenerator;
/** /**
@ -101,6 +101,9 @@ public final class JS {
@InjectedBy(JSNativeGenerator.class) @InjectedBy(JSNativeGenerator.class)
public static native JSObject wrap(short num); public static native JSObject wrap(short num);
@InjectedBy(JSNativeGenerator.class)
public static native JSObject pass(Object obj);
public static <T extends JSObject> JSArray<T> wrap(T[] array) { public static <T extends JSObject> JSArray<T> wrap(T[] array) {
JSArray<T> result = createArray(array.length); JSArray<T> result = createArray(array.length);
for (int i = 0; i < array.length; ++i) { for (int i = 0; i < array.length; ++i) {

View File

@ -18,8 +18,8 @@ package org.teavm.jso.plugin;
import java.io.IOException; import java.io.IOException;
import java.util.List; import java.util.List;
import org.teavm.codegen.SourceWriter; import org.teavm.codegen.SourceWriter;
import org.teavm.javascript.ni.Generator; import org.teavm.javascript.spi.Generator;
import org.teavm.javascript.ni.GeneratorContext; import org.teavm.javascript.spi.GeneratorContext;
import org.teavm.model.*; import org.teavm.model.*;
/** /**

View File

@ -21,8 +21,8 @@ import org.teavm.dependency.*;
import org.teavm.javascript.ast.ConstantExpr; import org.teavm.javascript.ast.ConstantExpr;
import org.teavm.javascript.ast.Expr; import org.teavm.javascript.ast.Expr;
import org.teavm.javascript.ast.InvocationExpr; import org.teavm.javascript.ast.InvocationExpr;
import org.teavm.javascript.ni.Injector; import org.teavm.javascript.spi.Injector;
import org.teavm.javascript.ni.InjectorContext; import org.teavm.javascript.spi.InjectorContext;
import org.teavm.jso.JS; import org.teavm.jso.JS;
import org.teavm.model.CallLocation; import org.teavm.model.CallLocation;
import org.teavm.model.ClassReader; import org.teavm.model.ClassReader;
@ -88,6 +88,9 @@ public class JSNativeGenerator implements Injector, DependencyPlugin {
} }
writer.append("))"); writer.append("))");
break; break;
case "pass":
context.writeExpr(context.getArgument(0));
break;
case "wrap": case "wrap":
if (methodRef.getDescriptor().parameterType(0).isObject("java.lang.String")) { if (methodRef.getDescriptor().parameterType(0).isObject("java.lang.String")) {
writer.append("$rt_ustr("); writer.append("$rt_ustr(");

View File

@ -17,8 +17,8 @@ package org.teavm.jso.plugin;
import java.util.*; import java.util.*;
import org.teavm.diagnostics.Diagnostics; import org.teavm.diagnostics.Diagnostics;
import org.teavm.javascript.ni.GeneratedBy; import org.teavm.javascript.spi.GeneratedBy;
import org.teavm.javascript.ni.PreserveOriginalName; import org.teavm.javascript.spi.PreserveOriginalName;
import org.teavm.jso.*; import org.teavm.jso.*;
import org.teavm.model.*; import org.teavm.model.*;
import org.teavm.model.instructions.*; import org.teavm.model.instructions.*;

View File

@ -13,14 +13,14 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.teavm.runtime; package org.teavm.platform.async;
/** /**
* *
* @author Alexey Andreev * @author Alexey Andreev <konsoletyper@gmail.com>
*/ */
public interface AsyncCallback<T> { public interface AsyncCallback<T> {
void complete(T value); void complete(T result);
void error(Exception e); void error(Throwable e);
} }

View File

@ -0,0 +1,85 @@
/*
* Copyright 2015 Alexey Andreev.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.teavm.platform.plugin;
import java.io.IOException;
import org.teavm.codegen.SourceWriter;
import org.teavm.dependency.DependencyAgent;
import org.teavm.dependency.DependencyPlugin;
import org.teavm.dependency.MethodDependency;
import org.teavm.javascript.spi.Generator;
import org.teavm.javascript.spi.GeneratorContext;
import org.teavm.model.*;
import org.teavm.platform.async.AsyncCallback;
/**
*
* @author Alexey Andreev <konsoletyper@gmail.com>
*/
public class AsyncMethodGenerator implements Generator, DependencyPlugin {
private static final MethodReference completeMethod = new MethodReference(AsyncCallback.class, "complete",
Object.class, void.class);
private static final MethodReference errorMethod = new MethodReference(AsyncCallback.class, "error",
Throwable.class, void.class);
@Override
public void generate(GeneratorContext context, SourceWriter writer, MethodReference methodRef) throws IOException {
MethodReference asyncRef = getAsyncReference(methodRef);
writer.append("var callback").ws().append("=").ws().append("function()").ws().append("{}").softNewLine();
writer.append("callback.").appendMethod(completeMethod).ws().append("=").ws().append("function($this,").ws()
.append("val)").ws().append("{").indent().softNewLine();
writer.append("return $return($rt_asyncResult(val));").softNewLine();
writer.outdent().append("};").softNewLine();
writer.append("callback.").appendMethod(errorMethod).ws().append("=").ws().append("function($this,").ws()
.append("e)").ws().append("{").indent().softNewLine();
writer.append("return $return($rt_asyncError(e));").softNewLine();
writer.outdent().append("};").softNewLine();
writer.append("try").ws().append("{").indent().softNewLine();
writer.append("return ").appendMethodBody(asyncRef).append('(');
ClassReader cls = context.getClassSource().get(methodRef.getClassName());
MethodReader method = cls.getMethod(methodRef.getDescriptor());
int start = method.hasModifier(ElementModifier.STATIC) ? 1 : 0;
for (int i = start; i <= methodRef.parameterCount(); ++i) {
writer.append(context.getParameterName(i));
writer.append(',').ws();
}
writer.append("callback);").softNewLine();
writer.outdent().append("}").ws().append("catch($e)").ws().append("{").indent().softNewLine();
writer.append("return $return($rt_asyncError($e));").softNewLine();
writer.outdent().append("}").softNewLine();
}
private MethodReference getAsyncReference(MethodReference methodRef) {
ValueType[] signature = new ValueType[methodRef.parameterCount() + 2];
for (int i = 0; i < methodRef.parameterCount(); ++i) {
signature[i] = methodRef.getDescriptor().parameterType(i);
}
signature[methodRef.parameterCount()] = ValueType.parse(AsyncCallback.class);
signature[methodRef.parameterCount() + 1] = ValueType.VOID;
return new MethodReference(methodRef.getClassName(), methodRef.getName(), signature);
}
@Override
public void methodAchieved(DependencyAgent checker, MethodDependency method, CallLocation location) {
MethodReference asyncRef = getAsyncReference(method.getReference());
MethodDependency asyncMethod = checker.linkMethod(asyncRef, location);
int paramCount = method.getReference().parameterCount();
for (int i = 0; i <= paramCount; ++i) {
method.getVariable(i).connect(asyncMethod.getVariable(i));
}
asyncMethod.use();
}
}

View File

@ -0,0 +1,61 @@
/*
* Copyright 2015 Alexey Andreev.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.teavm.platform.plugin;
import org.teavm.dependency.PluggableDependency;
import org.teavm.diagnostics.Diagnostics;
import org.teavm.javascript.spi.Async;
import org.teavm.javascript.spi.GeneratedBy;
import org.teavm.model.*;
import org.teavm.platform.async.AsyncCallback;
/**
*
* @author Alexey Andreev <konsoletyper@gmail.com>
*/
public class AsyncMethodProcessor implements ClassHolderTransformer {
@Override
public void transformClass(ClassHolder cls, ClassReaderSource innerSource, Diagnostics diagnostics) {
for (MethodHolder method : cls.getMethods()) {
if (method.hasModifier(ElementModifier.NATIVE) &&
method.getAnnotations().get(Async.class.getName()) != null &&
method.getAnnotations().get(GeneratedBy.class.getName()) == null) {
ValueType[] signature = new ValueType[method.parameterCount() + 2];
for (int i = 0; i < method.parameterCount(); ++i) {
signature[i] = method.parameterType(i);
}
signature[method.parameterCount()] = ValueType.parse(AsyncCallback.class);
signature[method.parameterCount() + 1] = ValueType.VOID;
MethodDescriptor asyncDesc = new MethodDescriptor(method.getName(), signature);
MethodHolder asyncMethod = cls.getMethod(asyncDesc);
if (asyncMethod != null) {
if (asyncMethod.hasModifier(ElementModifier.STATIC) !=
method.hasModifier(ElementModifier.STATIC)) {
diagnostics.error(new CallLocation(method.getReference()), "Methods {{m0}} and {{m1}} must " +
"both be either static or non-static",
method.getReference(), asyncMethod.getReference());
}
AnnotationHolder annot = new AnnotationHolder(GeneratedBy.class.getName());
annot.getValues().put("value", new AnnotationValue(ValueType.parse(AsyncMethodGenerator.class)));
method.getAnnotations().add(annot);
annot = new AnnotationHolder(PluggableDependency.class.getName());
annot.getValues().put("value", new AnnotationValue(ValueType.parse(AsyncMethodGenerator.class)));
method.getAnnotations().add(annot);
}
}
}
}
}

View File

@ -19,8 +19,8 @@ import java.io.IOException;
import java.lang.reflect.Constructor; import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;
import org.teavm.codegen.SourceWriter; import org.teavm.codegen.SourceWriter;
import org.teavm.javascript.ni.Generator; import org.teavm.javascript.spi.Generator;
import org.teavm.javascript.ni.GeneratorContext; import org.teavm.javascript.spi.GeneratorContext;
import org.teavm.model.*; import org.teavm.model.*;
import org.teavm.platform.metadata.MetadataGenerator; import org.teavm.platform.metadata.MetadataGenerator;
import org.teavm.platform.metadata.MetadataProvider; import org.teavm.platform.metadata.MetadataProvider;

View File

@ -16,7 +16,7 @@
package org.teavm.platform.plugin; package org.teavm.platform.plugin;
import org.teavm.diagnostics.Diagnostics; import org.teavm.diagnostics.Diagnostics;
import org.teavm.javascript.ni.GeneratedBy; import org.teavm.javascript.spi.GeneratedBy;
import org.teavm.model.*; import org.teavm.model.*;
import org.teavm.platform.metadata.MetadataProvider; import org.teavm.platform.metadata.MetadataProvider;

View File

@ -29,5 +29,6 @@ public class PlatformPlugin implements TeaVMPlugin {
host.add(new ResourceTransformer()); host.add(new ResourceTransformer());
host.add(new ResourceAccessorTransformer(host)); host.add(new ResourceAccessorTransformer(host));
host.add(new ResourceAccessorDependencyListener()); host.add(new ResourceAccessorDependencyListener());
host.add(new AsyncMethodProcessor());
} }
} }

View File

@ -18,8 +18,8 @@ package org.teavm.platform.plugin;
import java.io.IOException; import java.io.IOException;
import org.teavm.javascript.ast.ConstantExpr; import org.teavm.javascript.ast.ConstantExpr;
import org.teavm.javascript.ast.Expr; import org.teavm.javascript.ast.Expr;
import org.teavm.javascript.ni.Injector; import org.teavm.javascript.spi.Injector;
import org.teavm.javascript.ni.InjectorContext; import org.teavm.javascript.spi.InjectorContext;
import org.teavm.model.MethodReference; import org.teavm.model.MethodReference;
import org.teavm.model.ValueType; import org.teavm.model.ValueType;

4
teavm-tests/.gitignore vendored Normal file
View File

@ -0,0 +1,4 @@
/target
/.settings
/.classpath
/.project

115
teavm-tests/pom.xml Normal file
View File

@ -0,0 +1,115 @@
<!--
Copyright 2015 Alexey Andreev.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.teavm</groupId>
<artifactId>teavm</artifactId>
<version>0.3.0-SNAPSHOT</version>
</parent>
<artifactId>teavm-tests</artifactId>
<name>TeaVM tests</name>
<description>Project containing TeaVM tests, as it is impossible to test each module separately</description>
<dependencies>
<dependency>
<groupId>org.teavm</groupId>
<artifactId>teavm-core</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.teavm</groupId>
<artifactId>teavm-classlib</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.teavm</groupId>
<artifactId>teavm-platform</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.teavm</groupId>
<artifactId>teavm-jso</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.teavm</groupId>
<artifactId>teavm-maven-plugin</artifactId>
<version>${project.version}</version>
<dependencies>
<dependency>
<groupId>org.teavm</groupId>
<artifactId>teavm-platform</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
<executions>
<execution>
<id>generate-javascript-tests</id>
<goals>
<goal>build-test-javascript</goal>
</goals>
<phase>process-test-classes</phase>
<configuration>
<minifying>false</minifying>
<properties>
<java.util.Locale.available>en, en_US, en_GB, ru, ru_RU</java.util.Locale.available>
</properties>
<incremental>${teavm.test.incremental}</incremental>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<excludes>
<exclude>org/teavm/platform/**/*.java</exclude>
<exclude>org/teavm/jso/**/*.java</exclude>
</excludes>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-checkstyle-plugin</artifactId>
<configuration>
<configLocation>../checkstyle.xml</configLocation>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

Some files were not shown because too many files have changed in this diff Show More