Example usage for org.objectweb.asm.commons GeneratorAdapter EQ

List of usage examples for org.objectweb.asm.commons GeneratorAdapter EQ

Introduction

In this page you can find the example usage for org.objectweb.asm.commons GeneratorAdapter EQ.

Prototype

int EQ

To view the source code for org.objectweb.asm.commons GeneratorAdapter EQ.

Click Source Link

Document

Constant for the #ifCmp method.

Usage

From source file:co.cask.cdap.internal.io.DatumWriterGenerator.java

License:Apache License

/**
 * Generates method body for encoding Collection value. The logic is like this:
 *
 * <pre>//from  www  .j av  a 2 s  . com
 * {@code
 *
 * encoder.writeInt(collection.size());
 * for (T element : collection) {
 *   encodeElement(element, encoder, elementSchema, seenRefs);
 * }
 * if (collection.size() > 0) {
 *   encoder.writeInt(0);
 * }
 * }
 * </pre>
 * @param mg
 * @param componentType
 * @param componentSchema
 * @param value
 * @param encoder
 */
private void encodeCollection(GeneratorAdapter mg, TypeToken<?> componentType, Schema componentSchema,
        int value, int encoder, int schemaLocal, int seenRefs) {
    // Encode and store the collection length locally
    mg.loadArg(value);
    mg.invokeInterface(Type.getType(Collection.class), getMethod(int.class, "size"));
    int length = mg.newLocal(Type.INT_TYPE);
    mg.storeLocal(length);

    mg.loadArg(encoder);
    mg.loadLocal(length);
    mg.invokeInterface(Type.getType(Encoder.class), getMethod(Encoder.class, "writeInt", int.class));
    mg.pop();

    // Store the component schema
    mg.loadArg(schemaLocal);
    mg.invokeVirtual(Type.getType(Schema.class), getMethod(Schema.class, "getComponentSchema"));
    int componentSchemaLocal = mg.newLocal(Type.getType(Schema.class));
    mg.storeLocal(componentSchemaLocal);

    // Store the iterator
    int iterator = mg.newLocal(Type.getType(Iterator.class));
    mg.loadArg(value);
    mg.invokeInterface(Type.getType(Collection.class), getMethod(Iterator.class, "iterator"));
    mg.storeLocal(iterator);

    // For loop with iterator. Encode each component
    Label beginFor = mg.mark();
    Label endFor = mg.newLabel();
    mg.loadLocal(iterator);
    mg.invokeInterface(Type.getType(Iterator.class), getMethod(boolean.class, "hasNext"));
    mg.ifZCmp(GeneratorAdapter.EQ, endFor);

    // Call the encode method for encoding the element.
    mg.loadThis();

    mg.loadLocal(iterator);
    mg.invokeInterface(Type.getType(Iterator.class), getMethod(Object.class, "next"));
    doCast(mg, componentType, componentSchema);
    mg.loadArg(encoder);
    mg.loadLocal(componentSchemaLocal);
    mg.loadArg(seenRefs);
    mg.invokeVirtual(classType, getEncodeMethod(componentType, componentSchema));
    mg.goTo(beginFor);

    mg.mark(endFor);

    // if length > 0, write out 0 at the end of array.
    Label zeroLength = mg.newLabel();
    mg.loadLocal(length);
    mg.ifZCmp(GeneratorAdapter.LE, zeroLength);
    encodeInt(mg, 0, encoder);
    mg.mark(zeroLength);
}

From source file:co.cask.cdap.internal.io.DatumWriterGenerator.java

License:Apache License

/**
 * Generates method body for encoding map value. The logic is like this:
 *
 * <pre>//from  ww  w  .  jav  a 2 s .  c o  m
 * {@code
 *
 * encoder.writeInt(map.size();
 *
 * for (Map.Entry<Key, Value> entry : map.entrySet()) {
 *   encodeKey(entry.getKey(), encoder, keySchema, seenRefs);
 *   encodeValue(entry.getValue(), encoder, valueSchema, seenRefs);
 * }
 *
 * if (map.size() > 0) {
 *   encoder.writeInt(0);
 * }
 * }
 * </pre>
 *
 * @param mg
 * @param keyType
 * @param valueType
 * @param keySchema
 * @param valueSchema
 * @param value
 * @param encoder
 * @param schemaLocal
 * @param seenRefs
 */
private void encodeMap(GeneratorAdapter mg, TypeToken<?> keyType, TypeToken<?> valueType, Schema keySchema,
        Schema valueSchema, int value, int encoder, int schemaLocal, int seenRefs) {
    // Encode and store the map length locally
    mg.loadArg(value);
    mg.invokeInterface(Type.getType(Map.class), getMethod(int.class, "size"));
    int length = mg.newLocal(Type.INT_TYPE);
    mg.storeLocal(length);

    mg.loadArg(encoder);
    mg.loadLocal(length);
    mg.invokeInterface(Type.getType(Encoder.class), getMethod(Encoder.class, "writeInt", int.class));
    mg.pop();

    // Stores the key and value schema
    mg.loadArg(schemaLocal);
    mg.invokeVirtual(Type.getType(Schema.class), getMethod(Map.Entry.class, "getMapSchema"));
    mg.dup();

    int keySchemaLocal = mg.newLocal(Type.getType(Schema.class));
    mg.invokeInterface(Type.getType(Map.Entry.class), getMethod(Object.class, "getKey"));
    mg.checkCast(Type.getType(Schema.class));
    mg.storeLocal(keySchemaLocal);

    int valueSchemaLocal = mg.newLocal(Type.getType(Schema.class));
    mg.invokeInterface(Type.getType(Map.Entry.class), getMethod(Object.class, "getValue"));
    mg.checkCast(Type.getType(Schema.class));
    mg.storeLocal(valueSchemaLocal);

    // Store the entry set iterator
    int iterator = mg.newLocal(Type.getType(Iterator.class));
    mg.loadArg(value);
    mg.invokeInterface(Type.getType(Map.class), getMethod(Set.class, "entrySet"));
    mg.invokeInterface(Type.getType(Set.class), getMethod(Iterator.class, "iterator"));
    mg.storeLocal(iterator);

    // For loop the entry set iterator, encode each key-value pairs
    Label beginFor = mg.mark();
    Label endFor = mg.newLabel();
    mg.loadLocal(iterator);
    mg.invokeInterface(Type.getType(Iterator.class), getMethod(boolean.class, "hasNext"));
    mg.ifZCmp(GeneratorAdapter.EQ, endFor);

    int entry = mg.newLocal(Type.getType(Map.Entry.class));
    mg.loadLocal(iterator);
    mg.invokeInterface(Type.getType(Iterator.class), getMethod(Object.class, "next"));
    mg.checkCast(Type.getType(Map.Entry.class));
    mg.storeLocal(entry);

    // encode key
    mg.loadThis();
    mg.loadLocal(entry);
    mg.invokeInterface(Type.getType(Map.Entry.class), getMethod(Object.class, "getKey"));
    doCast(mg, keyType, keySchema);
    mg.loadArg(encoder);
    mg.loadLocal(keySchemaLocal);
    mg.loadArg(seenRefs);
    mg.invokeVirtual(classType, getEncodeMethod(keyType, keySchema));

    // encode value
    mg.loadThis();
    mg.loadLocal(entry);
    mg.invokeInterface(Type.getType(Map.Entry.class), getMethod(Object.class, "getValue"));
    doCast(mg, valueType, valueSchema);
    mg.loadArg(encoder);
    mg.loadLocal(valueSchemaLocal);
    mg.loadArg(seenRefs);
    mg.invokeVirtual(classType, getEncodeMethod(valueType, valueSchema));

    mg.goTo(beginFor);
    mg.mark(endFor);

    // if length > 0, write out 0 at the end of map
    Label zeroLength = mg.newLabel();
    mg.loadLocal(length);
    mg.ifZCmp(GeneratorAdapter.LE, zeroLength);
    encodeInt(mg, 0, encoder);
    mg.mark(zeroLength);
}

From source file:com.xruby.compiler.codegen.MethodGenerator.java

License:BSD License

public void returnIfBlockReturned() {
    dup();/*from ww  w  .j a va2  s  .c  om*/
    invokeVirtual(Types.RUBY_VALUE_TYPE, Method.getMethod("boolean returnedInBlock()"));
    Label after_return = new Label();
    ifZCmp(GeneratorAdapter.EQ, after_return);
    returnValue();//TODO more error checking, may not in the method context
    mark(after_return);
    /*TODO if it is going to return any way, should not not check.
      Right now the code may look like:
      if(!rubyvalue5.returnedInBlock()) goto _L2; else goto _L1
      _L1:
              return;
      _L2:
              return;
      */
}

From source file:com.xruby.compiler.codegen.MethodGenerator.java

License:BSD License

public void checkBreakedOrReturned(boolean is_in_block) {
    int value = newLocal(Types.RUBY_VALUE_TYPE);
    storeLocal(value);/*from   w w w .j a  v a 2 s. c o  m*/

    invokeVirtual(Types.RUBY_BLOCK_TYPE, CgUtil.getMethod("breakedOrReturned", Type.BOOLEAN_TYPE));
    Label after_return = new Label();
    ifZCmp(GeneratorAdapter.EQ, after_return);
    if (is_in_block) {
        loadThis();
        push(true);
        putField(Types.RUBY_BLOCK_TYPE, "__break__", Type.BOOLEAN_TYPE);
    }
    loadLocal(value);
    returnValue();//TODO more error checking, may not in the method context
    mark(after_return);
    loadLocal(value);
}

From source file:com.xruby.compiler.codegen.RubyCompilerImpl.java

License:BSD License

public Object visitAfterIfCondition() {
    MethodGenerator mg = cg_.getMethodGenerator();
    mg.RubyValue_isTrue();/*from w  ww  .j a  v  a 2 s  .  c o  m*/
    Label label = new Label();
    mg.ifZCmp(GeneratorAdapter.EQ, label);
    return label;
}

From source file:com.xruby.compiler.codegen.RubyCompilerImpl.java

License:BSD License

public void visitWhileConditionEnd(boolean always_true, boolean is_until) {
    MethodGenerator mg = cg_.getMethodGenerator();
    if (always_true) {
        mg.push(true);/*  w w w.j a va 2 s. c  o  m*/
    } else {
        mg.RubyValue_isTrue();
    }

    if (is_until) {
        mg.ifZCmp(GeneratorAdapter.NE, mg.getLabelManager().getCurrentX());
    } else {
        mg.ifZCmp(GeneratorAdapter.EQ, mg.getLabelManager().getCurrentX());
    }

    mg.mark(mg.getLabelManager().getCurrentRedo());
}

From source file:com.xruby.compiler.codegen.RubyCompilerImpl.java

License:BSD License

public Object visitAfterWhenCondition(Object case_value, boolean mrhs) {
    int i = (Integer) case_value;
    MethodGenerator mg = cg_.getMethodGenerator();
    mg.loadLocal(i);/*from  w  ww.  j  av a2  s  .c  om*/
    if (!mrhs) {
        mg.RubyAPI_testCaseEqual();
    } else {
        mg.RubyAPI_testCaseEqual2();
    }
    Label label = new Label();
    mg.ifZCmp(GeneratorAdapter.EQ, label);
    return label;
}

From source file:com.xruby.compiler.codegen.RubyCompilerImpl.java

License:BSD License

public Object visitAfterWhenConditionNotNil(Object case_value) {
    int i = (Integer) case_value;
    MethodGenerator mg = cg_.getMethodGenerator();
    mg.loadLocal(i);/*  w  w  w  .jav a  2 s.  c om*/
    mg.RubyAPI_testCaseEqualNotNil();

    Label label = new Label();
    mg.ifZCmp(GeneratorAdapter.EQ, label);
    return label;
}

From source file:com.xruby.compiler.codegen.RubyCompilerImpl.java

License:BSD License

public Object visitRescueVariable(String name, int exception_variable) {
    MethodGenerator mg = cg_.getMethodGenerator();
    mg.loadLocal(exception_variable);/*from ww w.  j av  a 2s .co  m*/
    mg.RubyAPI_testExceptionType();
    Label label = new Label();
    mg.ifZCmp(GeneratorAdapter.EQ, label);

    if (null != name) {
        mg.loadLocal(exception_variable);
        mg.RubyAPI_convertRubyException2RubyValue();
        cg_.storeVariable(name);
    }

    return label;
}

From source file:com.xruby.compiler.codegen.RubyCompilerImpl.java

License:BSD License

public void visitPotentialProcCall() {
    MethodGenerator mg = cg_.getMethodGenerator();
    mg.dup();/*from   w  w  w  . j  a va2s  . c o  m*/
    mg.instanceOf(Types.RUBY_PROC_TYPE);

    Label label1 = new Label();
    mg.ifZCmp(GeneratorAdapter.EQ, label1);

    mg.dup();
    mg.checkCast(Types.RUBY_PROC_TYPE);

    //check if in the right context
    //TODO have not considered all the situations
    mg.dup();
    mg.RubyProc_isDefinedInAnotherBlock();
    Label label2 = new Label();
    mg.ifZCmp(GeneratorAdapter.NE, label2);

    cg_.addVariableToBinding();//TODO should we use updateBinding()?
    mg.mark(label2);
    mg.pop();

    mg.mark(label1);
}