mirror of
https://github.com/Eaglercraft-TeaVM-Fork/eagler-teavm.git
synced 2024-12-22 16:14:10 -08:00
Further removal of direct JavaScript generation from classlib
This commit is contained in:
parent
82b110ad4c
commit
dd25ae4759
|
@ -29,8 +29,6 @@ import org.teavm.vm.spi.TeaVMPlugin;
|
||||||
public class JCLPlugin implements TeaVMPlugin {
|
public class JCLPlugin implements TeaVMPlugin {
|
||||||
@Override
|
@Override
|
||||||
public void install(TeaVMHost host) {
|
public void install(TeaVMHost host) {
|
||||||
host.add(new EnumDependencySupport());
|
|
||||||
host.add(new EnumTransformer());
|
|
||||||
host.add(new ObjectEnrichRenderer());
|
host.add(new ObjectEnrichRenderer());
|
||||||
ServiceLoaderSupport serviceLoaderSupp = new ServiceLoaderSupport(host.getClassLoader());
|
ServiceLoaderSupport serviceLoaderSupp = new ServiceLoaderSupport(host.getClassLoader());
|
||||||
host.add(serviceLoaderSupp);
|
host.add(serviceLoaderSupp);
|
||||||
|
|
|
@ -0,0 +1,54 @@
|
||||||
|
/*
|
||||||
|
* 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.classlib.java.lang;
|
||||||
|
|
||||||
|
import org.teavm.classlib.impl.unicode.UnicodeHelper;
|
||||||
|
import org.teavm.classlib.impl.unicode.UnicodeSupport;
|
||||||
|
import org.teavm.model.MethodReference;
|
||||||
|
import org.teavm.platform.metadata.MetadataGenerator;
|
||||||
|
import org.teavm.platform.metadata.MetadataGeneratorContext;
|
||||||
|
import org.teavm.platform.metadata.Resource;
|
||||||
|
import org.teavm.platform.metadata.StringResource;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Alexey Andreev
|
||||||
|
*/
|
||||||
|
public class CharacterMetadataGenerator implements MetadataGenerator {
|
||||||
|
@Override
|
||||||
|
public Resource generateMetadata(MetadataGeneratorContext context, MethodReference method) {
|
||||||
|
switch (method.getName()) {
|
||||||
|
case "obtainDigitMapping":
|
||||||
|
return generateObtainDigitMapping(context);
|
||||||
|
case "obtainClasses":
|
||||||
|
return generateObtainClasses(context);
|
||||||
|
default:
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Resource generateObtainDigitMapping(MetadataGeneratorContext context) {
|
||||||
|
StringResource res = context.createResource(StringResource.class);
|
||||||
|
res.setValue(UnicodeHelper.encodeIntByte(UnicodeSupport.getDigitValues()));
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Resource generateObtainClasses(MetadataGeneratorContext context) {
|
||||||
|
StringResource res = context.createResource(StringResource.class);
|
||||||
|
res.setValue(UnicodeHelper.compressRle(UnicodeSupport.getClasses()));
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,88 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 2014 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.classlib.java.lang;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import org.teavm.classlib.impl.unicode.UnicodeHelper;
|
|
||||||
import org.teavm.classlib.impl.unicode.UnicodeSupport;
|
|
||||||
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.CallLocation;
|
|
||||||
import org.teavm.model.MethodReference;
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @author Alexey Andreev
|
|
||||||
*/
|
|
||||||
public class CharacterNativeGenerator implements Generator, DependencyPlugin {
|
|
||||||
@Override
|
|
||||||
public void generate(GeneratorContext context, SourceWriter writer, MethodReference methodRef) throws IOException {
|
|
||||||
switch (methodRef.getName()) {
|
|
||||||
case "toLowerCase":
|
|
||||||
writer.append("return String.fromCharCode(").append(context.getParameterName(1))
|
|
||||||
.append(").toLowerCase().charCodeAt(0)|0;").softNewLine();
|
|
||||||
break;
|
|
||||||
case "toUpperCase":
|
|
||||||
writer.append("return String.fromCharCode(").append(context.getParameterName(1))
|
|
||||||
.append(").toUpperCase().charCodeAt(0)|0;").softNewLine();
|
|
||||||
break;
|
|
||||||
case "obtainDigitMapping":
|
|
||||||
generateObtainDigitMapping(writer);
|
|
||||||
break;
|
|
||||||
case "obtainClasses":
|
|
||||||
generateObtainClasses(writer);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void methodAchieved(DependencyAgent agent, MethodDependency method, CallLocation location) {
|
|
||||||
switch (method.getReference().getName()) {
|
|
||||||
case "obtainDigitMapping":
|
|
||||||
case "obtainClasses":
|
|
||||||
method.getResult().propagate(agent.getType("java.lang.String"));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void generateObtainDigitMapping(SourceWriter writer) throws IOException {
|
|
||||||
String str = UnicodeHelper.encodeIntByte(UnicodeSupport.getDigitValues());
|
|
||||||
writer.append("return $rt_str(");
|
|
||||||
splitString(writer, str);
|
|
||||||
writer.append(");").softNewLine();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void generateObtainClasses(SourceWriter writer) throws IOException {
|
|
||||||
String str = UnicodeHelper.compressRle(UnicodeSupport.getClasses());
|
|
||||||
writer.append("return $rt_str(");
|
|
||||||
splitString(writer, str);
|
|
||||||
writer.append(");").softNewLine();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void splitString(SourceWriter writer, String str) throws IOException {
|
|
||||||
for (int i = 0; i < str.length(); i += 512) {
|
|
||||||
if (i > 0) {
|
|
||||||
writer.ws().append("+").newLine();
|
|
||||||
}
|
|
||||||
int j = Math.min(i + 512, str.length());
|
|
||||||
writer.append("\"").append(str.substring(i, j)).append("\"");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,37 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 2013 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.classlib.java.lang;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import org.teavm.javascript.spi.Injector;
|
|
||||||
import org.teavm.javascript.spi.InjectorContext;
|
|
||||||
import org.teavm.model.*;
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @author Alexey Andreev <konsoletyper@gmail.com>
|
|
||||||
*/
|
|
||||||
public class ClassNativeGenerator implements Injector {
|
|
||||||
@Override
|
|
||||||
public void generate(InjectorContext context, MethodReference methodRef) throws IOException {
|
|
||||||
switch (methodRef.getName()) {
|
|
||||||
case "getEnumConstantsImpl":
|
|
||||||
context.writeExpr(context.getArgument(0));
|
|
||||||
context.getWriter().append(".values()");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,41 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 2013 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.classlib.java.lang;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import org.teavm.codegen.SourceWriter;
|
|
||||||
import org.teavm.javascript.spi.Generator;
|
|
||||||
import org.teavm.javascript.spi.GeneratorContext;
|
|
||||||
import org.teavm.model.MethodReference;
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @author Alexey Andreev
|
|
||||||
*/
|
|
||||||
public class ConsoleOutputStreamGenerator implements Generator {
|
|
||||||
@Override
|
|
||||||
public void generate(GeneratorContext context, SourceWriter writer, MethodReference methodRef) throws IOException {
|
|
||||||
if (methodRef.getClassName().endsWith("_stderr")) {
|
|
||||||
if (methodRef.getName().equals("write")) {
|
|
||||||
writer.append("$rt_putStderr(").append(context.getParameterName(1)).append(");").softNewLine();
|
|
||||||
}
|
|
||||||
} else if (methodRef.getClassName().endsWith("_stdout")) {
|
|
||||||
if (methodRef.getName().equals("write")) {
|
|
||||||
writer.append("$rt_putStdout(").append(context.getParameterName(1)).append(");").softNewLine();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,110 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 2013 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.classlib.java.lang;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import org.teavm.codegen.SourceWriter;
|
|
||||||
import org.teavm.dependency.*;
|
|
||||||
import org.teavm.javascript.spi.Generator;
|
|
||||||
import org.teavm.javascript.spi.GeneratorContext;
|
|
||||||
import org.teavm.javascript.spi.Injector;
|
|
||||||
import org.teavm.javascript.spi.InjectorContext;
|
|
||||||
import org.teavm.model.CallLocation;
|
|
||||||
import org.teavm.model.MethodReference;
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @author Alexey Andreev <konsoletyper@gmail.com>
|
|
||||||
*/
|
|
||||||
public class ObjectNativeGenerator implements Generator, Injector, DependencyPlugin {
|
|
||||||
@Override
|
|
||||||
public void generate(GeneratorContext context, SourceWriter writer, MethodReference methodRef) throws IOException {
|
|
||||||
switch (methodRef.getDescriptor().getName()) {
|
|
||||||
case "<init>":
|
|
||||||
generateInit(context, writer);
|
|
||||||
break;
|
|
||||||
case "hashCode":
|
|
||||||
case "identity":
|
|
||||||
generateHashCode(context, writer);
|
|
||||||
break;
|
|
||||||
case "clone":
|
|
||||||
generateClone(context, writer);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void generate(InjectorContext context, MethodReference methodRef) throws IOException {
|
|
||||||
switch (methodRef.getName()) {
|
|
||||||
case "getClass":
|
|
||||||
generateGetClass(context);
|
|
||||||
break;
|
|
||||||
case "wrap":
|
|
||||||
generateWrap(context);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void methodAchieved(DependencyAgent agent, MethodDependency method, CallLocation location) {
|
|
||||||
switch (method.getReference().getName()) {
|
|
||||||
case "clone":
|
|
||||||
method.getVariable(0).connect(method.getResult());
|
|
||||||
break;
|
|
||||||
case "getClass":
|
|
||||||
achieveGetClass(agent, method);
|
|
||||||
break;
|
|
||||||
case "wrap":
|
|
||||||
method.getVariable(1).connect(method.getResult());
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void generateInit(GeneratorContext context, SourceWriter writer) throws IOException {
|
|
||||||
writer.append(context.getParameterName(0)).append(".$id = $rt_nextId();").softNewLine();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void generateGetClass(InjectorContext context) throws IOException {
|
|
||||||
SourceWriter writer = context.getWriter();
|
|
||||||
writer.append("$rt_cls(");
|
|
||||||
context.writeExpr(context.getArgument(0));
|
|
||||||
writer.append(".constructor)");
|
|
||||||
}
|
|
||||||
|
|
||||||
private void achieveGetClass(DependencyAgent agent, MethodDependency method) {
|
|
||||||
MethodReference initMethod = new MethodReference(Class.class, "createNew", Class.class);
|
|
||||||
agent.linkMethod(initMethod, null).use();
|
|
||||||
method.getResult().propagate(agent.getType("java.lang.Class"));
|
|
||||||
}
|
|
||||||
|
|
||||||
private void generateHashCode(GeneratorContext context, SourceWriter writer) throws IOException {
|
|
||||||
writer.append("return ").append(context.getParameterName(0)).append(".$id;").softNewLine();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void generateClone(GeneratorContext context, SourceWriter writer) throws IOException {
|
|
||||||
String obj = context.getParameterName(0);
|
|
||||||
writer.append("var copy = new ").append(obj).append(".constructor();").softNewLine();
|
|
||||||
writer.append("for (var field in " + obj + ") {").softNewLine().indent();
|
|
||||||
writer.append("if (!" + obj + ".hasOwnProperty(field)) {").softNewLine().indent();
|
|
||||||
writer.append("continue;").softNewLine().outdent().append("}").softNewLine();
|
|
||||||
writer.append("copy[field] = " + obj + "[field];").softNewLine().outdent().append("}").softNewLine();
|
|
||||||
writer.append("return copy;").softNewLine();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void generateWrap(InjectorContext context) throws IOException {
|
|
||||||
context.writeExpr(context.getArgument(0));
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,49 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 2013 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.classlib.java.lang;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import org.teavm.dependency.DependencyAgent;
|
|
||||||
import org.teavm.dependency.DependencyPlugin;
|
|
||||||
import org.teavm.dependency.MethodDependency;
|
|
||||||
import org.teavm.javascript.spi.Injector;
|
|
||||||
import org.teavm.javascript.spi.InjectorContext;
|
|
||||||
import org.teavm.model.CallLocation;
|
|
||||||
import org.teavm.model.MethodReference;
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @author Alexey Andreev
|
|
||||||
*/
|
|
||||||
public class StringNativeGenerator implements Injector, DependencyPlugin {
|
|
||||||
@Override
|
|
||||||
public void methodAchieved(DependencyAgent agent, MethodDependency method, CallLocation location) {
|
|
||||||
switch (method.getReference().getName()) {
|
|
||||||
case "wrap":
|
|
||||||
method.getVariable(1).connect(method.getResult());
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void generate(InjectorContext context, MethodReference methodRef) throws IOException {
|
|
||||||
switch (methodRef.getName()) {
|
|
||||||
case "wrap":
|
|
||||||
context.writeExpr(context.getArgument(0));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -48,9 +48,6 @@ public class SystemNativeGenerator implements Generator, DependencyPlugin {
|
||||||
.appendField(new FieldReference("java.lang.System", "err"))
|
.appendField(new FieldReference("java.lang.System", "err"))
|
||||||
.ws().append('=').ws().append(context.getParameterName(1)).append(";").softNewLine();
|
.ws().append('=').ws().append(context.getParameterName(1)).append(";").softNewLine();
|
||||||
break;
|
break;
|
||||||
case "identityHashCode":
|
|
||||||
writer.append("return ").append(context.getParameterName(1)).append(".$id;").softNewLine();
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -16,7 +16,6 @@
|
||||||
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.spi.GeneratedBy;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
|
@ -80,7 +79,6 @@ public class TBoolean extends TObject implements TSerializable, TComparable<TBoo
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@GeneratedBy(ObjectNativeGenerator.class)
|
|
||||||
public int hashCode() {
|
public int hashCode() {
|
||||||
return value ? 1231 : 1237;
|
return value ? 1231 : 1237;
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,8 +17,9 @@ 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.platform.Platform;
|
||||||
import org.teavm.javascript.spi.GeneratedBy;
|
import org.teavm.platform.metadata.MetadataProvider;
|
||||||
|
import org.teavm.platform.metadata.StringResource;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
|
@ -222,18 +223,21 @@ public class TCharacter extends TObject implements TComparable<TCharacter> {
|
||||||
return UTF16Helper.lowSurrogate(codePoint);
|
return UTF16Helper.lowSurrogate(codePoint);
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: implement toLowerCase/toUpperCase/toTitleCase using UnicodeData.txt instead of built-in JS
|
public static char toLowerCase(char ch) {
|
||||||
@GeneratedBy(CharacterNativeGenerator.class)
|
return (char)toLowerCase((int)ch);
|
||||||
public static native char toLowerCase(char ch);
|
}
|
||||||
|
|
||||||
@GeneratedBy(CharacterNativeGenerator.class)
|
public static int toLowerCase(int ch) {
|
||||||
public static native int toLowerCase(int ch);
|
return Platform.stringFromCharCode(ch).toLowerCase().charCodeAt(0);
|
||||||
|
}
|
||||||
|
|
||||||
@GeneratedBy(CharacterNativeGenerator.class)
|
public static char toUpperCase(char ch) {
|
||||||
public static native char toUpperCase(char ch);
|
return (char)toUpperCase((int)ch);
|
||||||
|
}
|
||||||
|
|
||||||
@GeneratedBy(CharacterNativeGenerator.class)
|
public static int toUpperCase(int codePoint) {
|
||||||
public static native int toUpperCase(int codePoint);
|
return Platform.stringFromCharCode(codePoint).toUpperCase().charCodeAt(0);
|
||||||
|
}
|
||||||
|
|
||||||
public static int digit(char ch, int radix) {
|
public static int digit(char ch, int radix) {
|
||||||
return digit((int)ch, radix);
|
return digit((int)ch, radix);
|
||||||
|
@ -286,25 +290,23 @@ public class TCharacter extends TObject implements TComparable<TCharacter> {
|
||||||
|
|
||||||
private static int[] getDigitMapping() {
|
private static int[] getDigitMapping() {
|
||||||
if (digitMapping == null) {
|
if (digitMapping == null) {
|
||||||
digitMapping = UnicodeHelper.decodeIntByte(obtainDigitMapping());
|
digitMapping = UnicodeHelper.decodeIntByte(obtainDigitMapping().getValue());
|
||||||
}
|
}
|
||||||
return digitMapping;
|
return digitMapping;
|
||||||
}
|
}
|
||||||
|
|
||||||
@GeneratedBy(CharacterNativeGenerator.class)
|
@MetadataProvider(CharacterMetadataGenerator.class)
|
||||||
@PluggableDependency(CharacterNativeGenerator.class)
|
private static native StringResource obtainDigitMapping();
|
||||||
private static native String obtainDigitMapping();
|
|
||||||
|
|
||||||
private static UnicodeHelper.Range[] getClasses() {
|
private static UnicodeHelper.Range[] getClasses() {
|
||||||
if (classMapping == null) {
|
if (classMapping == null) {
|
||||||
classMapping = UnicodeHelper.extractRle(obtainClasses());
|
classMapping = UnicodeHelper.extractRle(obtainClasses().getValue());
|
||||||
}
|
}
|
||||||
return classMapping;
|
return classMapping;
|
||||||
}
|
}
|
||||||
|
|
||||||
@GeneratedBy(CharacterNativeGenerator.class)
|
@MetadataProvider(CharacterMetadataGenerator.class)
|
||||||
@PluggableDependency(CharacterNativeGenerator.class)
|
private static native StringResource obtainClasses();
|
||||||
private static native String obtainClasses();
|
|
||||||
|
|
||||||
public static int toChars(int codePoint, char[] dst, int dstIndex) {
|
public static int toChars(int codePoint, char[] dst, int dstIndex) {
|
||||||
if (codePoint >= UTF16Helper.SUPPLEMENTARY_PLANE) {
|
if (codePoint >= UTF16Helper.SUPPLEMENTARY_PLANE) {
|
||||||
|
|
|
@ -16,7 +16,6 @@
|
||||||
package org.teavm.classlib.java.lang;
|
package org.teavm.classlib.java.lang;
|
||||||
|
|
||||||
import org.teavm.classlib.impl.DeclaringClassMetadataGenerator;
|
import org.teavm.classlib.impl.DeclaringClassMetadataGenerator;
|
||||||
import org.teavm.javascript.spi.InjectedBy;
|
|
||||||
import org.teavm.platform.Platform;
|
import org.teavm.platform.Platform;
|
||||||
import org.teavm.platform.PlatformClass;
|
import org.teavm.platform.PlatformClass;
|
||||||
import org.teavm.platform.metadata.ClassResource;
|
import org.teavm.platform.metadata.ClassResource;
|
||||||
|
@ -144,12 +143,9 @@ public class TClass<T> extends TObject {
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
public T[] getEnumConstants() {
|
public T[] getEnumConstants() {
|
||||||
return isEnum() ? (T[])getEnumConstantsImpl(platformClass) : null;
|
return isEnum() ? (T[])Platform.getEnumConstants(platformClass) : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@InjectedBy(ClassNativeGenerator.class)
|
|
||||||
private static native Object[] getEnumConstantsImpl(PlatformClass cls);
|
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
public T cast(TObject obj) {
|
public T cast(TObject obj) {
|
||||||
if (obj != null && !isAssignableFrom((TClass<?>)(Object)obj.getClass())) {
|
if (obj != null && !isAssignableFrom((TClass<?>)(Object)obj.getClass())) {
|
||||||
|
|
|
@ -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.spi.GeneratedBy;
|
import org.teavm.platform.Platform;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
|
@ -25,6 +25,7 @@ import org.teavm.javascript.spi.GeneratedBy;
|
||||||
*/
|
*/
|
||||||
class TConsoleOutputStream_stderr extends TOutputStream {
|
class TConsoleOutputStream_stderr extends TOutputStream {
|
||||||
@Override
|
@Override
|
||||||
@GeneratedBy(ConsoleOutputStreamGenerator.class)
|
public void write(int b) throws TIOException {
|
||||||
public native void write(int b) throws TIOException;
|
Platform.getConsole().error(b);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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.spi.GeneratedBy;
|
import org.teavm.platform.Platform;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
|
@ -25,6 +25,7 @@ import org.teavm.javascript.spi.GeneratedBy;
|
||||||
*/
|
*/
|
||||||
class TConsoleOutputStream_stdout extends TOutputStream {
|
class TConsoleOutputStream_stdout extends TOutputStream {
|
||||||
@Override
|
@Override
|
||||||
@GeneratedBy(ConsoleOutputStreamGenerator.class)
|
public void write(int b) throws TIOException {
|
||||||
public native void write(int b) throws TIOException;
|
Platform.getConsole().output(b);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,11 +15,9 @@
|
||||||
*/
|
*/
|
||||||
package org.teavm.classlib.java.lang;
|
package org.teavm.classlib.java.lang;
|
||||||
|
|
||||||
import org.teavm.dependency.PluggableDependency;
|
|
||||||
import org.teavm.javascript.spi.GeneratedBy;
|
|
||||||
import org.teavm.javascript.spi.InjectedBy;
|
|
||||||
import org.teavm.javascript.spi.Rename;
|
import org.teavm.javascript.spi.Rename;
|
||||||
import org.teavm.javascript.spi.Superclass;
|
import org.teavm.javascript.spi.Superclass;
|
||||||
|
import org.teavm.platform.Platform;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
|
@ -31,18 +29,20 @@ public class TObject {
|
||||||
public TObject() {
|
public TObject() {
|
||||||
}
|
}
|
||||||
|
|
||||||
@GeneratedBy(ObjectNativeGenerator.class)
|
|
||||||
@Rename("<init>")
|
@Rename("<init>")
|
||||||
private native void init();
|
private void init() {
|
||||||
|
Platform.getPlatformObject(this).setId(Platform.nextObjectId());
|
||||||
|
}
|
||||||
|
|
||||||
@InjectedBy(ObjectNativeGenerator.class)
|
|
||||||
@Rename("getClass")
|
@Rename("getClass")
|
||||||
@PluggableDependency(ObjectNativeGenerator.class)
|
public final TClass<?> getClass0() {
|
||||||
public native final TClass<?> getClass0();
|
return TClass.getClass(Platform.getPlatformObject(this).getPlatformClass());
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@GeneratedBy(ObjectNativeGenerator.class)
|
public int hashCode() {
|
||||||
public native int hashCode();
|
return identity();
|
||||||
|
}
|
||||||
|
|
||||||
@Rename("equals")
|
@Rename("equals")
|
||||||
public boolean equals0(TObject other) {
|
public boolean equals0(TObject other) {
|
||||||
|
@ -54,13 +54,19 @@ public class TObject {
|
||||||
return getClass().getName() + "@" + TInteger.toHexString(identity());
|
return getClass().getName() + "@" + TInteger.toHexString(identity());
|
||||||
}
|
}
|
||||||
|
|
||||||
@GeneratedBy(ObjectNativeGenerator.class)
|
int identity() {
|
||||||
native int identity();
|
return Platform.getPlatformObject(this).getId();
|
||||||
|
}
|
||||||
|
|
||||||
@GeneratedBy(ObjectNativeGenerator.class)
|
|
||||||
@PluggableDependency(ObjectNativeGenerator.class)
|
|
||||||
@Override
|
@Override
|
||||||
protected native Object clone() throws TCloneNotSupportedException;
|
protected Object clone() throws TCloneNotSupportedException {
|
||||||
|
if (!(this instanceof TCloneable) && Platform.getPlatformObject(this)
|
||||||
|
.getPlatformClass().getMetadata().getArrayItem() == null) {
|
||||||
|
throw new TCloneNotSupportedException();
|
||||||
|
}
|
||||||
|
Platform.getPlatformObject(this).setId(Platform.nextObjectId());
|
||||||
|
return Platform.clone(this);
|
||||||
|
}
|
||||||
|
|
||||||
@Rename("notify")
|
@Rename("notify")
|
||||||
public final void notify0() {
|
public final void notify0() {
|
||||||
|
@ -88,7 +94,7 @@ public class TObject {
|
||||||
protected void finalize() throws TThrowable {
|
protected void finalize() throws TThrowable {
|
||||||
}
|
}
|
||||||
|
|
||||||
@InjectedBy(ObjectNativeGenerator.class)
|
public static TObject wrap(Object obj) {
|
||||||
@PluggableDependency(ObjectNativeGenerator.class)
|
return (TObject)obj;
|
||||||
public static native TObject wrap(Object obj);
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,8 +23,6 @@ import org.teavm.classlib.java.util.TComparator;
|
||||||
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.classlib.java.util.regex.TPattern;
|
import org.teavm.classlib.java.util.regex.TPattern;
|
||||||
import org.teavm.dependency.PluggableDependency;
|
|
||||||
import org.teavm.javascript.spi.InjectedBy;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
|
@ -592,9 +590,9 @@ public class TString extends TObject implements TSerializable, TComparable<TStri
|
||||||
return hashCode;
|
return hashCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
@InjectedBy(StringNativeGenerator.class)
|
public static TString wrap(String str) {
|
||||||
@PluggableDependency(StringNativeGenerator.class)
|
return (TString)(Object)str;
|
||||||
public static native TString wrap(String str);
|
}
|
||||||
|
|
||||||
public TString toLowerCase() {
|
public TString toLowerCase() {
|
||||||
if (isEmpty()) {
|
if (isEmpty()) {
|
||||||
|
|
|
@ -93,9 +93,9 @@ public final class TSystem extends TObject {
|
||||||
return currentTimeMillis() * 10000000;
|
return currentTimeMillis() * 10000000;
|
||||||
}
|
}
|
||||||
|
|
||||||
@GeneratedBy(SystemNativeGenerator.class)
|
public static int identityHashCode(Object x) {
|
||||||
@PluggableDependency(SystemNativeGenerator.class)
|
return ((TObject)x).identity();
|
||||||
public static native int identityHashCode(Object x);
|
}
|
||||||
|
|
||||||
public static TString lineSeparator() {
|
public static TString lineSeparator() {
|
||||||
return TString.wrap("\n");
|
return TString.wrap("\n");
|
||||||
|
|
|
@ -1,49 +0,0 @@
|
||||||
/*
|
|
||||||
* 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.classlib.java.lang;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import org.teavm.codegen.SourceWriter;
|
|
||||||
import org.teavm.javascript.spi.Generator;
|
|
||||||
import org.teavm.javascript.spi.GeneratorContext;
|
|
||||||
import org.teavm.model.MethodReference;
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @author Alexey Andreev <konsoletyper@gmail.com>
|
|
||||||
*/
|
|
||||||
public class ThreadNativeGenerator implements Generator {
|
|
||||||
@Override
|
|
||||||
public void generate(GeneratorContext context, SourceWriter writer, MethodReference methodRef) throws IOException {
|
|
||||||
if (methodRef.getName().equals("sleep")) {
|
|
||||||
generateSleep(context, writer);
|
|
||||||
} else if (methodRef.getName().equals("yield")) {
|
|
||||||
generateYield(context, writer);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void generateSleep(GeneratorContext context, SourceWriter writer) throws IOException {
|
|
||||||
writer.append("setTimeout(function() {").indent().softNewLine();
|
|
||||||
writer.append(context.getCompleteContinuation()).append("($rt_asyncResult(null));").softNewLine();
|
|
||||||
writer.outdent().append("},").ws().append(context.getParameterName(1)).append(");").softNewLine();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void generateYield(GeneratorContext context, SourceWriter writer) throws IOException {
|
|
||||||
writer.append("setTimeout(function() {").indent().softNewLine();
|
|
||||||
writer.append(context.getCompleteContinuation()).append("($rt_asyncResult(null));").softNewLine();
|
|
||||||
writer.outdent().append("},").ws().append("0);").softNewLine();
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -34,6 +34,10 @@ public final class Platform {
|
||||||
return (PlatformObject)JS.marshall(obj);
|
return (PlatformObject)JS.marshall(obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@GeneratedBy(PlatformGenerator.class)
|
||||||
|
@PluggableDependency(PlatformGenerator.class)
|
||||||
|
public static native Object clone(Object obj);
|
||||||
|
|
||||||
public static boolean isInstance(PlatformObject obj, PlatformClass cls) {
|
public static boolean isInstance(PlatformObject obj, PlatformClass cls) {
|
||||||
return obj != null && !JS.isUndefined(obj.getPlatformClass().getMetadata()) &&
|
return obj != null && !JS.isUndefined(obj.getPlatformClass().getMetadata()) &&
|
||||||
isAssignable(obj.getPlatformClass(), cls);
|
isAssignable(obj.getPlatformClass(), cls);
|
||||||
|
@ -60,6 +64,14 @@ public final class Platform {
|
||||||
return (PlatformPrimitives)JS.getGlobal();
|
return (PlatformPrimitives)JS.getGlobal();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static PlatformConsole getConsole() {
|
||||||
|
return (PlatformConsole)JS.getGlobal();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int nextObjectId() {
|
||||||
|
return ((PlatformHelper)JS.getGlobal()).nextId();
|
||||||
|
}
|
||||||
|
|
||||||
@GeneratedBy(PlatformGenerator.class)
|
@GeneratedBy(PlatformGenerator.class)
|
||||||
@PluggableDependency(PlatformGenerator.class)
|
@PluggableDependency(PlatformGenerator.class)
|
||||||
public static native <T> T newInstance(PlatformClass cls);
|
public static native <T> T newInstance(PlatformClass cls);
|
||||||
|
@ -75,4 +87,12 @@ public final class Platform {
|
||||||
@InjectedBy(PlatformGenerator.class)
|
@InjectedBy(PlatformGenerator.class)
|
||||||
@PluggableDependency(PlatformGenerator.class)
|
@PluggableDependency(PlatformGenerator.class)
|
||||||
public static native PlatformClass classFromResource(ClassResource resource);
|
public static native PlatformClass classFromResource(ClassResource resource);
|
||||||
|
|
||||||
|
@InjectedBy(PlatformGenerator.class)
|
||||||
|
@PluggableDependency(PlatformGenerator.class)
|
||||||
|
public static native Enum<?>[] getEnumConstants(PlatformClass cls);
|
||||||
|
|
||||||
|
public static PlatformString stringFromCharCode(int charCode) {
|
||||||
|
return ((PlatformHelper)JS.getGlobal()).getStringClass().fromCharCode(charCode);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,31 @@
|
||||||
|
/*
|
||||||
|
* 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;
|
||||||
|
|
||||||
|
import org.teavm.jso.JSMethod;
|
||||||
|
import org.teavm.jso.JSObject;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Alexey Andreev
|
||||||
|
*/
|
||||||
|
public interface PlatformConsole extends JSObject {
|
||||||
|
@JSMethod("rt_putStdout")
|
||||||
|
void output(int b);
|
||||||
|
|
||||||
|
@JSMethod("rt_putStderr")
|
||||||
|
void error(int b);
|
||||||
|
}
|
|
@ -0,0 +1,32 @@
|
||||||
|
/*
|
||||||
|
* 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;
|
||||||
|
|
||||||
|
import org.teavm.jso.JSMethod;
|
||||||
|
import org.teavm.jso.JSObject;
|
||||||
|
import org.teavm.jso.JSProperty;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Alexey Andreev
|
||||||
|
*/
|
||||||
|
interface PlatformHelper extends JSObject {
|
||||||
|
@JSMethod("$rt_nextId")
|
||||||
|
int nextId();
|
||||||
|
|
||||||
|
@JSProperty("String")
|
||||||
|
PlatformStringClass getStringClass();
|
||||||
|
}
|
|
@ -25,4 +25,10 @@ import org.teavm.jso.JSProperty;
|
||||||
public interface PlatformObject extends JSObject {
|
public interface PlatformObject extends JSObject {
|
||||||
@JSProperty("constructor")
|
@JSProperty("constructor")
|
||||||
PlatformClass getPlatformClass();
|
PlatformClass getPlatformClass();
|
||||||
|
|
||||||
|
@JSProperty("$id")
|
||||||
|
int getId();
|
||||||
|
|
||||||
|
@JSProperty("$id")
|
||||||
|
void setId(int id);
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,30 @@
|
||||||
|
/*
|
||||||
|
* 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;
|
||||||
|
|
||||||
|
import org.teavm.jso.JSObject;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Alexey Andreev
|
||||||
|
*/
|
||||||
|
public interface PlatformString extends JSObject {
|
||||||
|
PlatformString toUpperCase();
|
||||||
|
|
||||||
|
PlatformString toLowerCase();
|
||||||
|
|
||||||
|
int charCodeAt(int index);
|
||||||
|
}
|
|
@ -0,0 +1,26 @@
|
||||||
|
/*
|
||||||
|
* 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;
|
||||||
|
|
||||||
|
import org.teavm.jso.JSObject;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Alexey Andreev
|
||||||
|
*/
|
||||||
|
interface PlatformStringClass extends JSObject {
|
||||||
|
PlatformString fromCharCode(int charCode);
|
||||||
|
}
|
|
@ -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.classlib.impl;
|
package org.teavm.platform.plugin;
|
||||||
|
|
||||||
import org.teavm.dependency.*;
|
import org.teavm.dependency.*;
|
||||||
import org.teavm.model.CallLocation;
|
import org.teavm.model.CallLocation;
|
||||||
|
@ -21,6 +21,7 @@ import org.teavm.model.ClassReader;
|
||||||
import org.teavm.model.MethodDescriptor;
|
import org.teavm.model.MethodDescriptor;
|
||||||
import org.teavm.model.MethodReader;
|
import org.teavm.model.MethodReader;
|
||||||
import org.teavm.model.ValueType;
|
import org.teavm.model.ValueType;
|
||||||
|
import org.teavm.platform.Platform;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
|
@ -53,8 +54,8 @@ public class EnumDependencySupport implements DependencyListener {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void methodAchieved(DependencyAgent agent, MethodDependency method, CallLocation location) {
|
public void methodAchieved(DependencyAgent agent, MethodDependency method, CallLocation location) {
|
||||||
if (method.getReference().getClassName().equals("java.lang.Class") &&
|
if (method.getReference().getClassName().equals(Platform.class.getName()) &&
|
||||||
method.getReference().getName().equals("getEnumConstantsImpl")) {
|
method.getReference().getName().equals("getEnumConstants")) {
|
||||||
unlocked = true;
|
unlocked = true;
|
||||||
allEnums.connect(method.getResult().getArrayItem());
|
allEnums.connect(method.getResult().getArrayItem());
|
||||||
method.getResult().propagate(agent.getType("[java.lang.Enum"));
|
method.getResult().propagate(agent.getType("[java.lang.Enum"));
|
|
@ -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.classlib.impl;
|
package org.teavm.platform.plugin;
|
||||||
|
|
||||||
import org.teavm.diagnostics.Diagnostics;
|
import org.teavm.diagnostics.Diagnostics;
|
||||||
import org.teavm.javascript.spi.PreserveOriginalName;
|
import org.teavm.javascript.spi.PreserveOriginalName;
|
|
@ -37,6 +37,9 @@ public class PlatformGenerator implements Generator, Injector, DependencyPlugin
|
||||||
case "asJavaClass":
|
case "asJavaClass":
|
||||||
method.getResult().propagate(agent.getType("java.lang.Class"));
|
method.getResult().propagate(agent.getType("java.lang.Class"));
|
||||||
return;
|
return;
|
||||||
|
case "clone":
|
||||||
|
method.getVariable(0).connect(method.getResult());
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -47,6 +50,10 @@ public class PlatformGenerator implements Generator, Injector, DependencyPlugin
|
||||||
case "classFromResource":
|
case "classFromResource":
|
||||||
context.writeExpr(context.getArgument(0));
|
context.writeExpr(context.getArgument(0));
|
||||||
return;
|
return;
|
||||||
|
case "getEnumConstants":
|
||||||
|
context.writeExpr(context.getArgument(0));
|
||||||
|
context.getWriter().append(".values()");
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -59,6 +66,9 @@ public class PlatformGenerator implements Generator, Injector, DependencyPlugin
|
||||||
case "lookupClass":
|
case "lookupClass":
|
||||||
generateLookup(context, writer);
|
generateLookup(context, writer);
|
||||||
break;
|
break;
|
||||||
|
case "clone":
|
||||||
|
generateClone(context, writer);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -95,4 +105,16 @@ public class PlatformGenerator implements Generator, Injector, DependencyPlugin
|
||||||
writer.append("default: return null;").softNewLine();
|
writer.append("default: return null;").softNewLine();
|
||||||
writer.outdent().append("}").softNewLine();
|
writer.outdent().append("}").softNewLine();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void generateClone(GeneratorContext context, SourceWriter writer) throws IOException {
|
||||||
|
String obj = context.getParameterName(1);
|
||||||
|
writer.append("var copy").ws().append("=").ws().append("new ").append(obj).append(".constructor();")
|
||||||
|
.softNewLine();
|
||||||
|
writer.append("for").ws().append("(var field in " + obj + ")").ws().append("{").softNewLine().indent();
|
||||||
|
writer.append("if").ws().append("(!" + obj + ".hasOwnProperty(field))").ws().append("{").softNewLine().indent();
|
||||||
|
writer.append("continue;").softNewLine().outdent().append("}").softNewLine();
|
||||||
|
writer.append("copy[field]").ws().append("=").ws().append(obj).append("[field];")
|
||||||
|
.softNewLine().outdent().append("}").softNewLine();
|
||||||
|
writer.append("return copy;").softNewLine();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,5 +32,7 @@ public class PlatformPlugin implements TeaVMPlugin {
|
||||||
host.add(new AsyncMethodProcessor());
|
host.add(new AsyncMethodProcessor());
|
||||||
host.add(new NewInstanceDependencySupport());
|
host.add(new NewInstanceDependencySupport());
|
||||||
host.add(new ClassLookupDependencySupport());
|
host.add(new ClassLookupDependencySupport());
|
||||||
|
host.add(new EnumDependencySupport());
|
||||||
|
host.add(new EnumTransformer());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user