@Override public void invoke(VariableReader receiver, VariableReader instance, MethodReference method, List<? extends VariableReader> arguments, InvocationType type) { ValueType[] paramTypes = method.getParameterTypes(); for (int i = 0; i < paramTypes.length; ++i) { if (!(paramTypes[i] instanceof ValueType.Primitive)) { escaping.add(arguments.get(i).getIndex()); } } if (instance != null) { escaping.add(instance.getIndex()); } if (receiver != null && !(method.getReturnType() instanceof ValueType.Primitive)) { escaping.add(receiver.getIndex()); } }
@Override public WasmExpression apply(InvocationExpr invocation, WasmIntrinsicManager manager) { WasmExpression selector = manager.generate(invocation.getArguments().get(0)); WasmIndirectCall call = new WasmIndirectCall(selector); for (ValueType type : invocation.getMethod().getParameterTypes()) { call.getParameterTypes().add(WasmGeneratorUtil.mapType(type)); } if (invocation.getMethod().getReturnType() != ValueType.VOID) { call.setReturnType(WasmGeneratorUtil.mapType(invocation.getMethod().getReturnType())); } for (int i = 1; i < invocation.getArguments().size(); ++i) { call.getArguments().add(manager.generate(invocation.getArguments().get(i))); } return call; } }
private MethodDependency createMethodDep(MethodReference methodRef, MethodHolder method) { ValueType[] arguments = methodRef.getParameterTypes(); int paramCount = arguments.length + 1; DependencyNode[] parameterNodes = new DependencyNode[arguments.length + 1]; parameterNodes[0] = createParameterNode(methodRef, ValueType.object(methodRef.getClassName()), 0); for (int i = 0; i < arguments.length; ++i) { parameterNodes[i + 1] = createParameterNode(methodRef, arguments[i], i + 1); } DependencyNode resultNode; if (methodRef.getDescriptor().getResultType() == ValueType.VOID) { resultNode = null; } else { resultNode = createResultNode(methodRef); } DependencyNode thrown = createThrownNode(methodRef); MethodDependency dep = new MethodDependency(this, parameterNodes, paramCount, resultNode, thrown, method, methodRef); if (method != null) { deferredTasks.add(() -> linkClass(dep.getMethod().getOwnerName()) .initClass(new CallLocation(dep.getMethod().getReference()))); } return dep; }
@Override public void visit(InvokeInstruction insn) { Expr[] exprArgs = new Expr[insn.getMethod().getParameterTypes().length]; for (int i = 0; i < insn.getArguments().size(); ++i) { exprArgs[i] = Expr.var(insn.getArguments().get(i).getIndex()); } InvocationExpr invocationExpr; if (insn.getInstance() != null) { if (insn.getType() == InvocationType.VIRTUAL) { invocationExpr = Expr.invoke(insn.getMethod(), Expr.var(insn.getInstance().getIndex()), exprArgs); } else { invocationExpr = Expr.invokeSpecial(insn.getMethod(), Expr.var(insn.getInstance().getIndex()), exprArgs); } } else { invocationExpr = Expr.invokeStatic(insn.getMethod(), exprArgs); } AssignmentStatement stmt; if (insn.getReceiver() != null) { stmt = Statement.assign(Expr.var(insn.getReceiver().getIndex()), invocationExpr); } else { stmt = Statement.assign(null, invocationExpr); } stmt.setLocation(currentLocation); stmt.setAsync(async); async = false; statements.add(stmt); }
public static String mangleMethod(MethodReference method) { String className = method.getClassName().length() + mangleString(method.getClassName()); StringBuilder sb = new StringBuilder("method$" + className + "_"); String name = mangleString(method.getName()); sb.append(mangleType(method.getReturnType())); sb.append(name.length() + "_" + name); sb.append(Arrays.stream(method.getParameterTypes()) .map(WasmMangling::mangleType) .collect(Collectors.joining())); return sb.toString(); }
@Override public void invoke(VariableReader receiver, VariableReader instance, MethodReference method, List<? extends VariableReader> arguments, InvocationType type) { ValueType[] paramTypes = method.getParameterTypes(); for (int i = 0; i < paramTypes.length; ++i) { if (!(paramTypes[i] instanceof ValueType.Primitive)) { escaping.add(arguments.get(i).getIndex()); } } if (instance != null) { escaping.add(instance.getIndex()); } if (receiver != null && !(method.getReturnType() instanceof ValueType.Primitive)) { escaping.add(receiver.getIndex()); } }
@Override public WasmExpression apply(InvocationExpr invocation, WasmIntrinsicManager manager) { WasmExpression selector = manager.generate(invocation.getArguments().get(0)); WasmIndirectCall call = new WasmIndirectCall(selector); for (ValueType type : invocation.getMethod().getParameterTypes()) { call.getParameterTypes().add(WasmGeneratorUtil.mapType(type)); } if (invocation.getMethod().getReturnType() != ValueType.VOID) { call.setReturnType(WasmGeneratorUtil.mapType(invocation.getMethod().getReturnType())); } for (int i = 1; i < invocation.getArguments().size(); ++i) { call.getArguments().add(manager.generate(invocation.getArguments().get(i))); } return call; } }
@Override public void visit(InvokeInstruction insn) { Expr[] exprArgs = new Expr[insn.getMethod().getParameterTypes().length]; for (int i = 0; i < insn.getArguments().size(); ++i) { exprArgs[i] = Expr.var(insn.getArguments().get(i).getIndex()); } InvocationExpr invocationExpr; if (insn.getInstance() != null) { if (insn.getType() == InvocationType.VIRTUAL) { invocationExpr = Expr.invoke(insn.getMethod(), Expr.var(insn.getInstance().getIndex()), exprArgs); } else { invocationExpr = Expr.invokeSpecial(insn.getMethod(), Expr.var(insn.getInstance().getIndex()), exprArgs); } } else { invocationExpr = Expr.invokeStatic(insn.getMethod(), exprArgs); } AssignmentStatement stmt; if (insn.getReceiver() != null) { stmt = Statement.assign(Expr.var(insn.getReceiver().getIndex()), invocationExpr); } else { stmt = Statement.assign(null, invocationExpr); } stmt.setLocation(currentLocation); stmt.setAsync(async); async = false; statements.add(stmt); }
private MethodDependency createMethodDep(MethodReference methodRef, MethodHolder method) { ValueType[] arguments = methodRef.getParameterTypes(); int paramCount = arguments.length + 1; DependencyNode[] parameterNodes = new DependencyNode[arguments.length + 1];