List of usage examples for org.objectweb.asm.commons GeneratorAdapter EQ
int EQ
To view the source code for org.objectweb.asm.commons GeneratorAdapter EQ.
Click Source Link
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); }