Example usage for org.objectweb.asm Opcodes ALOAD

List of usage examples for org.objectweb.asm Opcodes ALOAD

Introduction

In this page you can find the example usage for org.objectweb.asm Opcodes ALOAD.

Prototype

int ALOAD

To view the source code for org.objectweb.asm Opcodes ALOAD.

Click Source Link

Usage

From source file:com.asakusafw.dag.compiler.builtin.SplitOperatorGenerator.java

License:Apache License

private static ClassData generateClass(Context context, UserOperator operator, ClassDescription target) {
    OperatorInput input = operator.getInput(Split.ID_INPUT);
    OperatorOutput left = operator.getOutput(Split.ID_OUTPUT_LEFT);
    OperatorOutput right = operator.getOutput(Split.ID_OUTPUT_RIGHT);

    List<PropertyMapping> mappings = Invariants
            .safe(() -> JoinedModelUtil.getPropertyMappings(context.getClassLoader(), operator));

    ClassWriter writer = newWriter(target, Object.class, Result.class);
    FieldRef leftField = defineField(writer, target, "leftBuffer", typeOf(left.getDataType()));
    FieldRef rightField = defineField(writer, target, "rightBuffer", typeOf(right.getDataType()));

    Map<OperatorOutput, FieldRef> deps = defineDependenciesConstructor(context, operator.getOutputs(), target,
            writer, method -> {// w  ww  . ja v a2 s.  c o m
                method.visitVarInsn(Opcodes.ALOAD, 0);
                getNew(method, left.getDataType());
                putField(method, leftField);
                method.visitVarInsn(Opcodes.ALOAD, 0);
                getNew(method, right.getDataType());
                putField(method, rightField);
            });

    defineResultAdd(writer, method -> {
        LocalVarRef inputVar = cast(method, 1, input.getDataType());

        method.visitVarInsn(Opcodes.ALOAD, 0);
        getField(method, leftField);
        LocalVarRef leftVar = putLocalVar(method, Type.OBJECT, 2);

        method.visitVarInsn(Opcodes.ALOAD, 0);
        getField(method, rightField);
        LocalVarRef rightVar = putLocalVar(method, Type.OBJECT, 3);

        Map<OperatorInput, ValueRef> inputs = new HashMap<>();
        Map<OperatorOutput, ValueRef> outputs = new HashMap<>();
        inputs.put(input, inputVar);
        outputs.put(left, leftVar);
        outputs.put(right, rightVar);
        mapping(method, context.getDataModelLoader(), mappings, inputs, outputs);

        method.visitVarInsn(Opcodes.ALOAD, 0);
        getField(method, deps.get(left));
        leftVar.load(method);
        invokeResultAdd(method);

        method.visitVarInsn(Opcodes.ALOAD, 0);
        getField(method, deps.get(right));
        rightVar.load(method);
        invokeResultAdd(method);
    });
    return new ClassData(target, writer::toByteArray);
}

From source file:com.asakusafw.dag.compiler.builtin.SummarizeOperatorGenerator.java

License:Apache License

private static ClassData generateClass(Context context, UserOperator operator, ClassDescription target) {
    ClassDescription mapperClass = generateMapperClass(context, operator, target);
    ClassDescription combinerClass = generateCombinerClass(context, operator, target);

    ClassWriter writer = newWriter(target, CombineResult.class);
    writer.visitInnerClass(mapperClass.getInternalName(), target.getInternalName(), mapperClass.getSimpleName(),
            Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC);
    writer.visitInnerClass(combinerClass.getInternalName(), target.getInternalName(),
            combinerClass.getSimpleName(), Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC);

    OperatorOutput output = operator.getOutput(Summarize.ID_OUTPUT);
    defineDependenciesConstructor(context, operator.getOutputs(), target, writer, method -> {
        method.visitVarInsn(Opcodes.ALOAD, 0);
        getNew(method, combinerClass);/* www  . j a v a2s  . com*/
        getNew(method, output.getDataType());
        method.visitVarInsn(Opcodes.ALOAD, 1);
        method.visitMethodInsn(Opcodes.INVOKESPECIAL, typeOf(CombineResult.class).getInternalName(),
                CONSTRUCTOR_NAME, Type.getMethodDescriptor(Type.VOID_TYPE, typeOf(ObjectCombiner.class),
                        typeOf(DataModel.class), typeOf(Result.class)),
                false);
    }, Lang.discard());

    return new ClassData(target, writer::toByteArray);
}

From source file:com.asakusafw.dag.compiler.builtin.SummarizeOperatorGenerator.java

License:Apache License

static ClassDescription generateMapperClass(Context context, UserOperator operator, ClassDescription outer) {
    ClassDescription target = getMapperName(outer);

    OperatorInput input = operator.getInput(Summarize.ID_INPUT);
    OperatorOutput output = operator.getOutput(Summarize.ID_OUTPUT);

    ClassWriter writer = newWriter(target, Object.class, Function.class);
    writer.visitOuterClass(outer.getInternalName(), target.getSimpleName(), null);

    FieldRef buffer = defineField(writer, target, "buffer", typeOf(output.getDataType()));
    defineEmptyConstructor(writer, Object.class, method -> {
        method.visitVarInsn(Opcodes.ALOAD, 0);
        getNew(method, output.getDataType());
        putField(method, buffer);/*from   ww w  . j ava2  s .co m*/
    });

    MethodVisitor method = writer.visitMethod(Opcodes.ACC_PUBLIC, "apply",
            Type.getMethodDescriptor(typeOf(Object.class), typeOf(Object.class)), null, null);

    LocalVarRef inputVar = cast(method, 1, input.getDataType());
    buffer.load(method);
    LocalVarRef outputVar = putLocalVar(method, Type.OBJECT, 2);

    outputVar.load(method);
    resetDataModel(method, output.getDataType());

    List<PropertyFolding> foldings = Invariants
            .safe(() -> SummarizedModelUtil.getPropertyFoldings(context.getClassLoader(), operator));
    DataModelReference inputModel = context.getDataModelLoader().load(input.getDataType());
    DataModelReference outputModel = context.getDataModelLoader().load(output.getDataType());
    Set<PropertyReference> nullChecked = new HashSet<>();
    for (PropertyFolding folding : foldings) {
        PropertyMapping mapping = folding.getMapping();
        Aggregation aggregation = folding.getAggregation();
        PropertyReference src = Invariants.requireNonNull(inputModel.findProperty(mapping.getSourceProperty()));
        PropertyReference dst = Invariants
                .requireNonNull(outputModel.findProperty(mapping.getDestinationProperty()));
        mapping(method, target, aggregation, src, dst, inputVar, outputVar, nullChecked);
    }

    outputVar.load(method);
    method.visitInsn(Opcodes.ARETURN);
    method.visitMaxs(0, 0);
    method.visitEnd();

    if (nullChecked.isEmpty() == false) {
        defineCheckNull(writer, operator, inputModel);
    }

    return context.addClassFile(new ClassData(target, writer::toByteArray));
}

From source file:com.asakusafw.dag.compiler.builtin.SummarizeOperatorGenerator.java

License:Apache License

private static void defineCheckNull(ClassWriter writer, UserOperator operator, DataModelReference inputType) {

    MethodVisitor method = writer.visitMethod(Opcodes.ACC_PRIVATE | Opcodes.ACC_STATIC, METHOD_CHECK_NON_NULL,
            Type.getMethodDescriptor(Type.VOID_TYPE, typeOf(ValueOption.class), typeOf(Object.class),
                    typeOf(String.class)),
            null, null);//from w  ww  . j  a v a  2s  .c o m

    LocalVarRef optionVar = new LocalVarRef(Opcodes.ALOAD, 0);
    LocalVarRef objectVar = new LocalVarRef(Opcodes.ALOAD, 1);
    LocalVarRef nameVar = new LocalVarRef(Opcodes.ALOAD, 2);

    // if (option.isNull()) {
    Label ifEnd = new Label();
    optionVar.load(method);
    getNullity(method, VALUE_DESC);
    method.visitJumpInsn(Opcodes.IFEQ, ifEnd);

    // new NullPointerException ...
    method.visitTypeInsn(Opcodes.NEW, typeOf(NullPointerException.class).getInternalName());
    method.visitInsn(Opcodes.DUP);

    // str = String.format("<type>.%s must not be null (in <operator>): %s", name, object)
    getConst(method,
            String.format("%s.%%s must not be null (in %s.%s): %%s", inputType.getDeclaration().getSimpleName(),
                    operator.getMethod().getDeclaringClass().getSimpleName(), operator.getMethod().getName()));

    getArray(method, typeOf(Object.class), new LocalVarRef[] { nameVar, objectVar });
    method.visitMethodInsn(Opcodes.INVOKESTATIC, typeOf(String.class).getInternalName(), "format",
            Type.getMethodDescriptor(typeOf(String.class), typeOf(String.class), typeOf(Object[].class)),
            false);

    // throw new NullPointerException(str)
    method.visitMethodInsn(Opcodes.INVOKESPECIAL, typeOf(NullPointerException.class).getInternalName(),
            CONSTRUCTOR_NAME, Type.getMethodDescriptor(Type.VOID_TYPE, typeOf(String.class)), false);

    method.visitInsn(Opcodes.ATHROW);

    method.visitLabel(ifEnd);
    // }
    method.visitInsn(Opcodes.RETURN);
    method.visitMaxs(0, 0);
    method.visitEnd();
}

From source file:com.asakusafw.dag.compiler.builtin.UpdateOperatorGenerator.java

License:Apache License

private static ClassData generateClass(Context context, UserOperator operator, ClassDescription target) {
    OperatorInput input = operator.getInput(Update.ID_INPUT);
    OperatorOutput output = operator.getOutput(Update.ID_OUTPUT);

    ClassWriter writer = newWriter(target, Object.class, Result.class);
    FieldRef impl = defineOperatorField(writer, operator, target);
    Map<OperatorProperty, FieldRef> map = defineConstructor(context, operator, target, writer, method -> {
        setOperatorField(method, operator, impl);
    });//w w w  .  j a  v a  2  s.c o  m
    defineResultAdd(writer, method -> {
        cast(method, 1, input.getDataType());
        List<ValueRef> arguments = new ArrayList<>();
        arguments.add(impl);
        arguments.add(new LocalVarRef(Opcodes.ALOAD, 1));
        appendSecondaryInputs(arguments::add, operator, map::get);
        appendArguments(arguments::add, operator, map::get);
        invoke(method, context, operator, arguments);

        method.visitVarInsn(Opcodes.ALOAD, 0);
        getField(method, map.get(output));
        method.visitVarInsn(Opcodes.ALOAD, 1);
        invokeResultAdd(method);
    });
    return new ClassData(target, writer::toByteArray);
}

From source file:com.asakusafw.dag.compiler.builtin.Util.java

License:Apache License

static void setOperatorField(MethodVisitor method, UserOperator operator, FieldRef field) {
    method.visitVarInsn(Opcodes.ALOAD, 0);
    AsmUtil.getNew(method, operator.getImplementationClass());
    AsmUtil.putField(method, field);/* ww w.  j ava 2 s .  c o m*/
}

From source file:com.asakusafw.dag.compiler.builtin.Util.java

License:Apache License

static Map<OperatorProperty, FieldRef> defineConstructor(Context context, Operator operator,
        ClassDescription aClass, ClassVisitor writer, Consumer<MethodVisitor> body) {
    return defineConstructor(context, operator, aClass, writer, method -> {
        method.visitVarInsn(Opcodes.ALOAD, 0);
        method.visitMethodInsn(Opcodes.INVOKESPECIAL, AsmUtil.typeOf(Object.class).getInternalName(),
                CONSTRUCTOR_NAME, Type.getMethodDescriptor(Type.VOID_TYPE), false);
    }, body);//from  w  ww. java2 s .c om
}

From source file:com.asakusafw.dag.compiler.builtin.Util.java

License:Apache License

static void getGroupList(MethodVisitor method, Context context, OperatorInput input) {
    method.visitVarInsn(Opcodes.ALOAD, 1);
    getInt(method, context.getGroupIndex(input));
    method.visitMethodInsn(Opcodes.INVOKESTATIC, AsmUtil.typeOf(CoGroupOperationUtil.class).getInternalName(),
            "getList", Type.getMethodDescriptor(AsmUtil.typeOf(List.class),
                    AsmUtil.typeOf(CoGroupOperation.Input.class), Type.INT_TYPE),
            false);//from  w  w  w  . j  av a2  s.c om
}

From source file:com.asakusafw.dag.compiler.builtin.Util.java

License:Apache License

static void getGroupIterable(MethodVisitor method, Context context, OperatorInput input) {
    method.visitVarInsn(Opcodes.ALOAD, 1);
    getInt(method, context.getGroupIndex(input));
    method.visitMethodInsn(Opcodes.INVOKESTATIC, AsmUtil.typeOf(CoGroupOperationUtil.class).getInternalName(),
            "getIterable", Type.getMethodDescriptor(AsmUtil.typeOf(Iterable.class),
                    AsmUtil.typeOf(CoGroupOperation.Input.class), Type.INT_TYPE),
            false);//from  ww w  .  ja v a 2s . com
}

From source file:com.asakusafw.dag.compiler.builtin.Util.java

License:Apache License

static void defineBuildKey(ClassGeneratorContext context, ClassWriter writer, TypeDescription dataType,
        Group group) {/*from ww w  .  j  a  va2s. c o  m*/
    DataModelReference type = context.getDataModelLoader().load(dataType);
    List<PropertyReference> props = group.getGrouping().stream()
            .map(p -> Invariants.requireNonNull(type.findProperty(p))).collect(Collectors.toList());

    MethodVisitor v = writer.visitMethod(Opcodes.ACC_PUBLIC | Opcodes.ACC_FINAL, "buildKey",
            Type.getMethodDescriptor(Type.VOID_TYPE, typeOf(KeyBuffer.class), typeOf(Object.class)), null,
            null);

    LocalVarRef key = new LocalVarRef(Opcodes.ALOAD, 1);
    LocalVarRef object = cast(v, 2, dataType);
    for (PropertyReference p : props) {
        key.load(v);
        object.load(v);
        getOption(v, p);
        v.visitMethodInsn(Opcodes.INVOKEINTERFACE, typeOf(KeyBuffer.class).getInternalName(), "append",
                Type.getMethodDescriptor(typeOf(KeyBuffer.class), typeOf(Object.class)), true);
        v.visitInsn(Opcodes.POP);
    }

    v.visitInsn(Opcodes.RETURN);
    v.visitMaxs(0, 0);
    v.visitEnd();
}