@Override public void emit(GeneratorContext context, SourceWriter writer, MethodReference methodRef) throws IOException { emit(writer, index -> writer.append(context.getParameterName(index + 1))); }
private void generateArrayCopy(GeneratorContext context, SourceWriter writer) throws IOException { String src = context.getParameterName(1); String srcPos = context.getParameterName(2); String dest = context.getParameterName(3); String destPos = context.getParameterName(4); String length = context.getParameterName(5); writer.append("if (" + src + " !== " + dest + " || " + destPos + " < " + srcPos + ") {").indent().newLine(); writer.append("for (var i = 0; i < " + length + "; i = (i + 1) | 0) {").indent().softNewLine(); writer.append(dest + ".data[" + destPos + "++] = " + src + ".data[" + srcPos + "++];").softNewLine(); writer.outdent().append("}").softNewLine(); writer.outdent().append("} else {").indent().softNewLine(); writer.append(srcPos + " = (" + srcPos + " + " + length + ") | 0;").softNewLine(); writer.append(destPos + " = (" + destPos + " + " + length + ") | 0;").softNewLine(); writer.append("for (var i = 0; i < " + length + "; i = (i + 1) | 0) {").indent().softNewLine(); writer.append(dest + ".data[--" + destPos + "] = " + src + ".data[--" + srcPos + "];").softNewLine(); writer.outdent().append("}").softNewLine(); writer.outdent().append("}").softNewLine(); }
private void generateSet(GeneratorContext context, SourceWriter writer) throws IOException { String array = context.getParameterName(1); String item = context.getParameterName(3); writer.append("var type = " + array + ".constructor.$meta.item;").softNewLine(); boolean first = true; for (int i = 0; i < primitives.length; ++i) { String wrapper = "java.lang." + primitiveWrappers[i]; MethodReference methodRef = new MethodReference(wrapper, primitives[i].toLowerCase() + "Value", primitiveTypes[i]); ClassReader cls = context.getClassSource().get(methodRef.getClassName()); if (cls == null || cls.getMethod(methodRef.getDescriptor()) == null) { continue; } if (!first) { writer.append(" else "); } first = false; writer.append("if (type === $rt_" + primitives[i].toLowerCase() + "cls()) {").indent().softNewLine(); writer.append(item + " = ").appendMethodBody(methodRef).append("(" + item + ");").softNewLine(); writer.outdent().append("}"); } writer.softNewLine(); writer.append(array + ".data[" + context.getParameterName(2) + "] = " + item + ";").softNewLine(); }
@Override public void generate(GeneratorContext context, SourceWriter writer, MethodReference methodRef) throws IOException { switch (methodRef.getName()) { case "compare": writer.append("return Long_compare(").append(context.getParameterName(1)).append(", ") .append(context.getParameterName(2)).append(");").softNewLine(); context.useLongLibrary(); break; case "divideUnsigned": writer.append("return Long_udiv(").append(context.getParameterName(1)).append(", ") .append(context.getParameterName(2)).append(");").softNewLine(); context.useLongLibrary(); break; case "remainderUnsigned": writer.append("return Long_urem(").append(context.getParameterName(1)).append(", ") .append(context.getParameterName(2)).append(");").softNewLine(); context.useLongLibrary(); break; } } }
private void generateNewInstance(GeneratorContext context, SourceWriter writer) throws IOException { String type = context.getParameterName(1); String length = context.getParameterName(2); writer.append("if (").append(type).append(".$meta.primitive) {").softNewLine().indent(); for (String primitive : primitives) { writer.append("if (" + type + " == $rt_" + primitive.toLowerCase() + "cls()) {").indent().softNewLine(); writer.append("return $rt_create" + primitive + "Array(" + length + ");").softNewLine(); writer.outdent().append("}").softNewLine(); } writer.outdent().append("} else {").indent().softNewLine(); writer.append("return $rt_createArray(" + type + ", " + length + ")").softNewLine(); writer.outdent().append("}").softNewLine(); }
private void generateGetLength(GeneratorContext context, SourceWriter writer) throws IOException { String array = context.getParameterName(1); writer.append("if (" + array + " === null || " + array + ".constructor.$meta.item === undefined) {") .softNewLine().indent(); MethodReference cons = new MethodReference("java.lang.IllegalArgumentException", "<init>", ValueType.VOID); writer.append("$rt_throw(").appendInit(cons).append("());").softNewLine(); writer.outdent().append("}").softNewLine(); writer.append("return " + array + ".data.length;").softNewLine(); }
private void generateLookup(GeneratorContext context, SourceWriter writer) throws IOException { String param = context.getParameterName(1); writer.append("switch ($rt_ustr(" + param + ")) {").softNewLine().indent(); for (String name : context.getClassSource().getClassNames()) { writer.append("case \"" + name + "\": ").appendClass(name).append(".$clinit(); ") .append("return ").appendClass(name).append(";").softNewLine(); } writer.append("default: return null;").softNewLine(); writer.outdent().append("}").softNewLine(); }
private void function(GeneratorContext context, SourceWriter writer, String name, int paramCount) throws IOException { writer.append("return ").append(name).append("("); for (int i = 0; i < paramCount; ++i) { if (i > 0) { writer.append(",").ws(); } writer.append(context.getParameterName(i + 1)); } writer.append(");").softNewLine(); } }
@Override public void emit(GeneratorContext context, SourceWriter writer, MethodReference methodRef) throws IOException { AstWriter astWriter = new AstWriter(writer); int paramIndex = 1; if (!isStatic) { int index = paramIndex++; astWriter.declareNameEmitter("this", prec -> writer.append(context.getParameterName(index))); } for (int i = 0; i < parameterNames.length; ++i) { int index = paramIndex++; astWriter.declareNameEmitter(parameterNames[i], prec -> writer.append(context.getParameterName(index))); } astWriter.hoist(ast); if (ast instanceof Block) { for (Node child = ast.getFirstChild(); child != null; child = child.getNext()) { astWriter.print((AstNode) child); writer.softNewLine(); } } else { astWriter.print(ast); writer.softNewLine(); } } }
private void generateGet(GeneratorContext context, SourceWriter writer) throws IOException { String array = context.getParameterName(1); writer.append("var item = " + array + ".data[" + context.getParameterName(2) + "];").softNewLine(); writer.append("var type = " + array + ".constructor.$meta.item;").softNewLine(); for (int i = 0; i < primitives.length; ++i) { String wrapper = "java.lang." + primitiveWrappers[i]; MethodReference methodRef = new MethodReference(wrapper, "valueOf", primitiveTypes[i], ValueType.object(wrapper)); ClassReader cls = context.getClassSource().get(methodRef.getClassName()); if (cls == null || cls.getMethod(methodRef.getDescriptor()) == null) { continue; } writer.append("if (type === $rt_" + primitives[i].toLowerCase() + "cls()) {").indent().softNewLine(); writer.append("return ").appendMethodBody(methodRef).append("(item);").softNewLine(); writer.outdent().append("} else "); } writer.append("{").indent().softNewLine(); writer.append("return item;").softNewLine(); writer.outdent().append("}").softNewLine(); }
private void generateSchedule(GeneratorContext context, SourceWriter writer, boolean timeout) throws IOException { MethodReference launchRef = new MethodReference(Platform.class, "launchThread", PlatformRunnable.class, void.class); String runnable = context.getParameterName(1); writer.append("return setTimeout(function()").ws().append("{").indent().softNewLine(); if (timeout) { writer.appendMethodBody(launchRef); } else { writer.append("$rt_threadStarter(").appendMethodBody(launchRef).append(")"); } writer.append("(").append(runnable).append(");").softNewLine(); writer.outdent().append("},").ws().append(timeout ? context.getParameterName(2) : "0") .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(); }
private void writeFunctionAsObject(GeneratorContext context, SourceWriter writer) throws IOException { String thisName = context.getParameterName(1); String methodName = context.getParameterName(2); writer.append("if").ws().append("(typeof ").append(thisName).ws().append("!==").ws().append("\"function\")") .ws().append("return ").append(thisName).append(";").softNewLine(); writer.append("var result").ws().append("=").ws().append("{};").softNewLine(); writer.append("result[").append(methodName).append("]").ws().append("=").ws().append(thisName) .append(";").softNewLine(); writer.append("return result;").softNewLine(); }
@Override public void generate(GeneratorContext context, SourceWriter writer, MethodReference methodRef) throws IOException { writer.append("var result = [];").softNewLine(); writer.append("for (var key in ").append(context.getParameterName(1)).append(") {").indent().softNewLine(); writer.append("result.push(key);").softNewLine(); writer.outdent().append("}").softNewLine(); writer.append("return result;").softNewLine(); } }
writer.append(body).softNewLine(); writer.outdent().append("}).call(").append(!method.hasModifier(ElementModifier.STATIC) ? context.getParameterName(0) : "null"); for (int i = 0; i < args.size(); ++i) { writer.append(",").ws(); wrapParameter(writer, context.getParameterName(i + 1));
private void generateStringToJavaScript(GeneratorContext context, SourceWriter writer) throws IOException { FieldReference charsField = new FieldReference("java.lang.String", "characters"); writer.append("var result = \"\";").softNewLine(); writer.append("var data = ").append(context.getParameterName(1)).append('.') .appendField(charsField).append(".data;").softNewLine(); writer.append("for (var i = 0; i < data.length; i = (i + 1) | 0) {").indent().softNewLine(); writer.append("result += String.fromCharCode(data[i]);").softNewLine(); writer.outdent().append("}").softNewLine(); writer.append("return result;").softNewLine(); } }
private void writeFunction(GeneratorContext context, SourceWriter writer) throws IOException { String thisName = context.getParameterName(1); String methodName = context.getParameterName(2); writer.append("var name").ws().append('=').ws().append("'jso$functor$'").ws().append('+').ws() .append(methodName).append(';').softNewLine(); writer.append("if").ws().append("(!").append(thisName).append("[name])").ws().append('{') .indent().softNewLine(); writer.append("var fn").ws().append('=').ws().append("function()").ws().append('{') .indent().softNewLine(); writer.append("return ").append(thisName).append('[').append(methodName).append(']') .append(".apply(").append(thisName).append(',').ws().append("arguments);").softNewLine(); writer.outdent().append("};").softNewLine(); writer.append(thisName).append("[name]").ws().append('=').ws().append("function()").ws().append('{') .indent().softNewLine(); writer.append("return fn;").softNewLine(); writer.outdent().append("};").softNewLine(); writer.outdent().append('}').softNewLine(); writer.append("return ").append(thisName).append("[name]();").softNewLine(); }
private void generateNewInstance(GeneratorContext context, SourceWriter writer) throws IOException { String cls = context.getParameterName(1); writer.append("if").ws().append("($rt_resuming())").ws().append("{").indent().softNewLine(); writer.append("var $r = $rt_nativeThread().pop();").softNewLine(); writer.append(cls + ".$$constructor$$($r);").softNewLine(); writer.append("if").ws().append("($rt_suspending())").ws().append("{").indent().softNewLine(); writer.append("return $rt_nativeThread().push($r);").softNewLine(); writer.outdent().append("}").softNewLine(); writer.append("return $r;").softNewLine(); writer.outdent().append("}").softNewLine(); writer.append("if").ws().append("(!").append(cls).append(".hasOwnProperty('$$constructor$$'))") .ws().append("{").indent().softNewLine(); writer.append("return null;").softNewLine(); writer.outdent().append("}").softNewLine(); writer.append("var $r").ws().append('=').ws().append("new ").append(cls).append("();").softNewLine(); writer.append(cls).append(".$$constructor$$($r);").softNewLine(); writer.append("if").ws().append("($rt_suspending())").ws().append("{").indent().softNewLine(); writer.append("return $rt_nativeThread().push($r);").softNewLine(); writer.outdent().append("}").softNewLine(); writer.append("return $r;").softNewLine(); }
private void generateAnnotations(GeneratorContext context, SourceWriter writer) throws IOException { writer.append("var c").ws().append("=").ws().append("'$$annotations$$';").softNewLine(); for (String clsName : context.getClassSource().getClassNames()) { ClassReader annotCls = context.getClassSource().get(clsName + "$$__annotations__$$"); if (annotCls != null) { writer.appendClass(clsName).append("[c]").ws().append("=").ws(); MethodReference ctor = new MethodReference(annotCls.getName(), "<init>", ValueType.VOID); writer.appendInit(ctor); writer.append("();").softNewLine(); } } MethodReference selfRef = new MethodReference(Platform.class, "getAnnotations", PlatformClass.class, Annotation[].class); writer.appendMethodBody(selfRef).ws().append("=").ws().append("function(cls)").ws().append("{").softNewLine() .indent(); writer.append("if").ws().append("(!cls.hasOwnProperty(c))").ws().append("{").indent().softNewLine(); writer.append("return null;").softNewLine(); writer.outdent().append("}").softNewLine(); writer.append("return cls[c].").appendMethod("getAnnotations", Annotation[].class).append("();").softNewLine(); writer.outdent().append("};").softNewLine(); writer.append("return ").appendMethodBody(selfRef).append("(").append(context.getParameterName(1)) .append(");").softNewLine(); } }
private void generateEnumConstants(GeneratorContext context, SourceWriter writer) throws IOException { writer.append("var c").ws().append("=").ws().append("'$$enumConstants$$';").softNewLine(); for (String clsName : context.getClassSource().getClassNames()) { ClassReader cls = context.getClassSource().get(clsName); MethodReader method = cls.getMethod(new MethodDescriptor("values", ValueType.arrayOf(ValueType.object(clsName)))); if (method != null) { writer.appendClass(clsName).append("[c]").ws().append("=").ws(); writer.appendMethodBody(method.getReference()); writer.append(";").softNewLine(); } } MethodReference selfRef = new MethodReference(Platform.class, "getEnumConstants", PlatformClass.class, Enum[].class); writer.appendMethodBody(selfRef).ws().append("=").ws().append("function(cls)").ws().append("{").softNewLine() .indent(); writer.append("if").ws().append("(!cls.hasOwnProperty(c))").ws().append("{").indent().softNewLine(); writer.append("return null;").softNewLine(); writer.outdent().append("}").softNewLine(); writer.append("if").ws().append("(typeof cls[c]").ws().append("===").ws().append("\"function\")").ws() .append("{").indent().softNewLine(); writer.append("cls[c]").ws().append("=").ws().append("cls[c]();").softNewLine(); writer.outdent().append("}").softNewLine(); writer.append("return cls[c];").softNewLine(); writer.outdent().append("};").softNewLine(); writer.append("return ").appendMethodBody(selfRef).append("(").append(context.getParameterName(1)) .append(");").softNewLine(); }