@Override public void visit(InvocationExpr expr) { for (Expr argument : expr.getArguments()) { argument.acceptVisitor(this); } }
public static InvocationExpr invoke(MethodReference method, Expr target, Expr[] arguments) { InvocationExpr expr = new InvocationExpr(); expr.setMethod(method); expr.setType(InvocationType.DYNAMIC); expr.getArguments().add(target); expr.getArguments().addAll(Arrays.asList(arguments)); return expr; }
public static InvocationExpr invokeSpecial(MethodReference method, Expr target, Expr[] arguments) { InvocationExpr expr = new InvocationExpr(); expr.setMethod(method); expr.setType(InvocationType.SPECIAL); expr.getArguments().add(target); expr.getArguments().addAll(Arrays.asList(arguments)); return expr; }
public static InvocationExpr constructObject(MethodReference method, Expr[] arguments) { InvocationExpr expr = new InvocationExpr(); expr.setMethod(method); expr.setType(InvocationType.CONSTRUCTOR); expr.getArguments().addAll(Arrays.asList(arguments)); return expr; }
@Override public WasmExpression apply(InvocationExpr invocation, WasmIntrinsicManager manager) { switch (invocation.getMethod().getName()) { case "wrap": return manager.generate(invocation.getArguments().get(0)); default: throw new AssertionError(); } } }
public static InvocationExpr invokeStatic(MethodReference method, Expr[] arguments) { InvocationExpr expr = new InvocationExpr(); expr.setMethod(method); expr.setType(InvocationType.STATIC); expr.getArguments().addAll(Arrays.asList(arguments)); return expr; }
@Override public void apply(IntrinsicContext context, InvocationExpr invocation) { switch (invocation.getMethod().getName()) { case "getJavaClass": case "getMetadata": context.emit(invocation.getArguments().get(0)); break; case "setJavaClass": break; } } }
@Override public WasmExpression apply(InvocationExpr invocation, WasmIntrinsicManager manager) { InvocationExpr expr = new InvocationExpr(); MethodReference method = new MethodReference(WasmRuntime.class.getName(), invocation.getMethod().getDescriptor()); expr.setMethod(method); expr.setType(InvocationType.SPECIAL); expr.getArguments().addAll(invocation.getArguments()); return manager.generate(expr); } }
private void writeBinary(IntrinsicContext context, InvocationExpr invocation, String operation) { context.writer().print("((int32_t) ((uint32_t) "); context.emit(invocation.getArguments().get(0)); context.writer().print(" " + operation + " (uint32_t) "); context.emit(invocation.getArguments().get(1)); context.writer().print("))"); } }
private void putValue(IntrinsicContext context, InvocationExpr invocation, String type) { context.writer().print("(*(" + type + "*) "); context.emit(invocation.getArguments().get(0)); context.writer().print(" = "); context.emit(invocation.getArguments().get(1)); context.writer().print(")"); }
@Override public WasmExpression apply(InvocationExpr invocation, WasmIntrinsicManager manager) { switch (invocation.getMethod().getName()) { case "getClass": return manager.generate(invocation.getArguments().get(0)); default: throw new IllegalArgumentException(invocation.getMethod().toString()); } } }
private void writeBinary(IntrinsicContext context, InvocationExpr invocation, String operation) { context.writer().print("((int64_t) ((uint64_t) "); context.emit(invocation.getArguments().get(0)); context.writer().print(" " + operation + " (uint64_t) "); context.emit(invocation.getArguments().get(1)); context.writer().print("))"); } }
private void getValue(IntrinsicContext context, InvocationExpr invocation, String type) { context.writer().print("(*(" + type + "*) "); context.emit(invocation.getArguments().get(0)); context.writer().print(")"); }
@Override public void apply(IntrinsicContext context, InvocationExpr invocation) { switch (invocation.getMethod().getName()) { case "getPlatformObject": case "asJavaClass": context.emit(invocation.getArguments().get(0)); break; case "createQueue": context.writer().print("NULL"); break; } } }
@Override public WasmExpression apply(InvocationExpr invocation, WasmIntrinsicManager manager) { WasmInt32Constant constant = new WasmInt32Constant(0); constant.setLocation(invocation.getLocation()); constants.add(constant); int callSiteSize = classGenerator.getClassSize(CallSite.class.getName()); WasmExpression id = manager.generate(invocation.getArguments().get(0)); WasmExpression offset = new WasmIntBinary(WasmIntType.INT32, WasmIntBinaryOperation.MUL, id, new WasmInt32Constant(callSiteSize)); return new WasmIntBinary(WasmIntType.INT32, WasmIntBinaryOperation.ADD, constant, offset); } }
private WasmExpression fieldAccess(WasmIntrinsicManager manager, InvocationExpr expr, FieldReference field) { QualificationExpr qualification = new QualificationExpr(); qualification.setField(field); qualification.setQualified(expr.getArguments().get(0)); qualification.setLocation(expr.getLocation()); return manager.generate(qualification); } }
private void generateAllocStack(Expr sizeExpr) { if (stackVariable != null) { throw new IllegalStateException("Call to ShadowStack.allocStack must be done only once"); } stackVariable = getTemporary(WasmType.INT32); stackVariable.setName("__stack__"); InvocationExpr expr = new InvocationExpr(); expr.setType(InvocationType.SPECIAL); expr.setMethod(new MethodReference(WasmRuntime.class, "allocStack", int.class, Address.class)); expr.getArguments().add(sizeExpr); expr.acceptVisitor(this); result = new WasmSetLocal(stackVariable, result); }
@Override public void apply(IntrinsicContext context, InvocationExpr invocation) { switch (invocation.getMethod().getName()) { case "findCallSiteById": context.writer().print("(callSites + "); context.emit(invocation.getArguments().get(0)); context.writer().print(")"); break; } } }
@Override public void apply(IntrinsicContext context, InvocationExpr invocation) { switch (invocation.getMethod().getName()) { case "getPlatformClass": context.writer().print("CLASS_OF("); context.emit(invocation.getArguments().get(0)); context.writer().print(")"); break; } } }
private void printFieldAccess(IntrinsicContext context, InvocationExpr invocation, FieldReference field) { context.writer().print("FIELD("); context.emit(invocation.getArguments().get(0)); context.writer().print(","); context.writer().print(context.names().forClass(field.getClassName())).print(", "); context.writer().print(context.names().forMemberField(field)); context.writer().print(")"); } }