當前位置: 首頁>>代碼示例>>Java>>正文


Java GeneratorAdapter.goTo方法代碼示例

本文整理匯總了Java中org.objectweb.asm.commons.GeneratorAdapter.goTo方法的典型用法代碼示例。如果您正苦於以下問題:Java GeneratorAdapter.goTo方法的具體用法?Java GeneratorAdapter.goTo怎麽用?Java GeneratorAdapter.goTo使用的例子?那麽, 這裏精選的方法代碼示例或許可以為您提供幫助。您也可以進一步了解該方法所在org.objectweb.asm.commons.GeneratorAdapter的用法示例。


在下文中一共展示了GeneratorAdapter.goTo方法的8個代碼示例,這些例子默認根據受歡迎程度排序。您可以為喜歡或者感覺有用的代碼點讚,您的評價將有助於係統推薦出更棒的Java代碼示例。

示例1: wrapCodeToMakeItSafe

import org.objectweb.asm.commons.GeneratorAdapter; //導入方法依賴的package包/類
/**
 * Wrap the generated code in safe try-catch block.
 *
 * It creates an equivalent bytecode:
 * <pre>
 * <code>
 * try {
 *     // Generated code will be here
 * } catch (Throwable t) {
 *     // Ignore
 * }
 * </code>
 * </pre>
 */
public static void wrapCodeToMakeItSafe(GeneratorAdapter mv, Runnable generatedCode) {
    if (true) {
        // TODO fix it
        generatedCode.run();
        return;
    }
   // Create labels and configure try-catch blocks
   Label tryLabel = mv.newLabel();
   Label catchLabel = mv.newLabel();
   Label endLabel = mv.newLabel();
   mv.visitTryCatchBlock(tryLabel, catchLabel, catchLabel, null);
   // Start try block
   mv.mark(tryLabel);
       // === GENERATED CODE ===
       generatedCode.run();
       // === GENERATED CODE ===
       // If code is executed successfully, go to the end
       mv.goTo(endLabel);
    // Start catch block
    mv.mark(catchLabel);
        // Just ignore this exception
        mv.pop();
    mv.mark(endLabel);
}
 
開發者ID:Devexperts,項目名稱:dlcheck,代碼行數:39,代碼來源:TrasformationUtils.java

示例2: doEmit

import org.objectweb.asm.commons.GeneratorAdapter; //導入方法依賴的package包/類
public void doEmit(C context, ObjExpr objx, GeneratorAdapter gen, boolean emitUnboxed){
	Label nullLabel = gen.newLabel();
	Label falseLabel = gen.newLabel();
	Label endLabel = gen.newLabel();

	gen.visitLineNumber(line, gen.mark());

	if(testExpr instanceof StaticMethodExpr && ((StaticMethodExpr)testExpr).canEmitIntrinsicPredicate())
		{
		((StaticMethodExpr) testExpr).emitIntrinsicPredicate(C.EXPRESSION, objx, gen, falseLabel);
		}
	else if(maybePrimitiveType(testExpr) == boolean.class)
		{
		((MaybePrimitiveExpr) testExpr).emitUnboxed(C.EXPRESSION, objx, gen);
		gen.ifZCmp(gen.EQ, falseLabel);
		}
	else
		{
		testExpr.emit(C.EXPRESSION, objx, gen);
		gen.dup();
		gen.ifNull(nullLabel);
		gen.getStatic(BOOLEAN_OBJECT_TYPE, "FALSE", BOOLEAN_OBJECT_TYPE);
		gen.visitJumpInsn(IF_ACMPEQ, falseLabel);
		}
	if(emitUnboxed)
		((MaybePrimitiveExpr)thenExpr).emitUnboxed(context, objx, gen);
	else
		thenExpr.emit(context, objx, gen);
	gen.goTo(endLabel);
	gen.mark(nullLabel);
	gen.pop();
	gen.mark(falseLabel);
	if(emitUnboxed)
		((MaybePrimitiveExpr)elseExpr).emitUnboxed(context, objx, gen);
	else
		elseExpr.emit(context, objx, gen);
	gen.mark(endLabel);
}
 
開發者ID:mrange,項目名稱:fsharpadvent2016,代碼行數:39,代碼來源:Compiler.java

示例3: emit

import org.objectweb.asm.commons.GeneratorAdapter; //導入方法依賴的package包/類
public void emit(C context, ObjExpr objx, GeneratorAdapter gen){
    Label endLabel = gen.newLabel();
    Label faultLabel = gen.newLabel();

    gen.visitLineNumber(line, gen.mark());
    gen.getStatic(objx.objtype, objx.thunkNameStatic(siteIndex),ObjExpr.ILOOKUP_THUNK_TYPE);
    gen.dup();  //thunk, thunk
    target.emit(C.EXPRESSION, objx, gen); //thunk,thunk,target
    gen.visitLineNumber(line, gen.mark());
    gen.dupX2();                          //target,thunk,thunk,target
    gen.invokeInterface(ObjExpr.ILOOKUP_THUNK_TYPE, Method.getMethod("Object get(Object)")); //target,thunk,result
    gen.dupX2();                          //result,target,thunk,result
    gen.visitJumpInsn(IF_ACMPEQ, faultLabel); //result,target
    gen.pop();                                //result
    gen.goTo(endLabel);

    gen.mark(faultLabel);    //result,target
    gen.swap();              //target,result
    gen.pop();               //target
 gen.dup();               //target,target
    gen.getStatic(objx.objtype, objx.siteNameStatic(siteIndex),ObjExpr.KEYWORD_LOOKUPSITE_TYPE);  //target,target,site
    gen.swap();              //target,site,target
    gen.invokeInterface(ObjExpr.ILOOKUP_SITE_TYPE,
                        Method.getMethod("clojure.lang.ILookupThunk fault(Object)"));    //target,new-thunk
 gen.dup();   //target,new-thunk,new-thunk
 gen.putStatic(objx.objtype, objx.thunkNameStatic(siteIndex),ObjExpr.ILOOKUP_THUNK_TYPE);  //target,new-thunk
 gen.swap();              //new-thunk,target
 gen.invokeInterface(ObjExpr.ILOOKUP_THUNK_TYPE, Method.getMethod("Object get(Object)")); //result

    gen.mark(endLabel);
    if(context == C.STATEMENT)
        gen.pop();
}
 
開發者ID:mrange,項目名稱:fsharpadvent2016,代碼行數:34,代碼來源:Compiler.java

示例4: emitExprForInts

import org.objectweb.asm.commons.GeneratorAdapter; //導入方法依賴的package包/類
private void emitExprForInts(ObjExpr objx, GeneratorAdapter gen, Type exprType, Label defaultLabel){
    if (exprType == null)
        {
        if(RT.booleanCast(RT.WARN_ON_REFLECTION.deref()))
            {
            RT.errPrintWriter()
              .format("Performance warning, %s:%d:%d - case has int tests, but tested expression is not primitive.\n",
                      SOURCE_PATH.deref(), line, column);
            }
        expr.emit(C.EXPRESSION, objx, gen);
        gen.instanceOf(NUMBER_TYPE);
        gen.ifZCmp(GeneratorAdapter.EQ, defaultLabel);
        expr.emit(C.EXPRESSION, objx, gen);
        gen.checkCast(NUMBER_TYPE);
        gen.invokeVirtual(NUMBER_TYPE, intValueMethod);
        emitShiftMask(gen);
        }
    else if (exprType == Type.LONG_TYPE
            || exprType == Type.INT_TYPE
            || exprType == Type.SHORT_TYPE
            || exprType == Type.BYTE_TYPE)
        {
        expr.emitUnboxed(C.EXPRESSION, objx, gen);
        gen.cast(exprType, Type.INT_TYPE);
        emitShiftMask(gen);
        }
    else
        {
        gen.goTo(defaultLabel);
        }
}
 
開發者ID:mrange,項目名稱:fsharpadvent2016,代碼行數:32,代碼來源:Compiler.java

示例5: emitThenForInts

import org.objectweb.asm.commons.GeneratorAdapter; //導入方法依賴的package包/類
private void emitThenForInts(ObjExpr objx, GeneratorAdapter gen, Type exprType, Expr test, Expr then, Label defaultLabel, boolean emitUnboxed){
    if (exprType == null)
        {
        expr.emit(C.EXPRESSION, objx, gen);
        test.emit(C.EXPRESSION, objx, gen);
        gen.invokeStatic(UTIL_TYPE, equivMethod);
        gen.ifZCmp(GeneratorAdapter.EQ, defaultLabel);
        emitExpr(objx, gen, then, emitUnboxed);
        }
    else if (exprType == Type.LONG_TYPE)
        {
        ((NumberExpr)test).emitUnboxed(C.EXPRESSION, objx, gen);
        expr.emitUnboxed(C.EXPRESSION, objx, gen);
        gen.ifCmp(Type.LONG_TYPE, GeneratorAdapter.NE, defaultLabel);
        emitExpr(objx, gen, then, emitUnboxed);
        }
    else if (exprType == Type.INT_TYPE
            || exprType == Type.SHORT_TYPE
            || exprType == Type.BYTE_TYPE)
        {
        if (isShiftMasked())
            {
            ((NumberExpr)test).emitUnboxed(C.EXPRESSION, objx, gen);
            expr.emitUnboxed(C.EXPRESSION, objx, gen);
            gen.cast(exprType, Type.LONG_TYPE);
            gen.ifCmp(Type.LONG_TYPE, GeneratorAdapter.NE, defaultLabel);
            }
        // else direct match
        emitExpr(objx, gen, then, emitUnboxed);
        }
    else
        {
        gen.goTo(defaultLabel);
        }
}
 
開發者ID:mrange,項目名稱:fsharpadvent2016,代碼行數:36,代碼來源:Compiler.java

示例6: restore

import org.objectweb.asm.commons.GeneratorAdapter; //導入方法依賴的package包/類
@Override
protected void restore(GeneratorAdapter mv, List<Type> args) {
    // At this point, init$args has been called and the result Object is on the stack.
    // The value of that Object is Object[] with exactly n + 1 elements.
    // The first element is a string with the qualified name of the constructor to call.
    // The remaining elements are the constructtor arguments.

    // Create a new local that holds the result of init$args call.
    mv.visitTypeInsn(Opcodes.CHECKCAST, "[Ljava/lang/Object;");
    int constructorArgs = mv.newLocal(Type.getType("[Ljava/lang/Object;"));
    mv.storeLocal(constructorArgs);

    // Reinstate local values
    mv.loadLocal(locals);
    int stackIndex = 0;
    for (int arrayIndex = 0; arrayIndex < args.size(); arrayIndex++) {
        Type arg = args.get(arrayIndex);
        // Do not restore "this"
        if (arrayIndex > 0) {
            // duplicates the array
            mv.dup();
            // index in the array of objects to restore the boxed parameter.
            mv.push(arrayIndex);
            // get it from the array
            mv.arrayLoad(Type.getType(Object.class));
            // unbox the argument
            ByteCodeUtils.unbox(mv, arg);
            // restore the argument
            mv.visitVarInsn(arg.getOpcode(Opcodes.ISTORE), stackIndex);
        }
        // stack index must progress according to the parameter type we just processed.
        stackIndex += arg.getSize();
    }
    // pops the array
    mv.pop();

    // Push a null for the marker parameter.
    mv.loadLocal(constructorArgs);
    mv.visitInsn(Opcodes.ACONST_NULL);

    // Invoke the constructor
    mv.visitMethodInsn(Opcodes.INVOKESPECIAL, thisClassName, "<init>", DISPATCHING_THIS_SIGNATURE, false);

    mv.goTo(end.getLabel());
}
 
開發者ID:dodola,項目名稱:AnoleFix,代碼行數:46,代碼來源:ConstructorArgsRedirection.java

示例7: emitBoxReturn

import org.objectweb.asm.commons.GeneratorAdapter; //導入方法依賴的package包/類
public static void emitBoxReturn(ObjExpr objx, GeneratorAdapter gen, Class returnType){
		if(returnType.isPrimitive())
			{
			if(returnType == boolean.class)
				{
				Label falseLabel = gen.newLabel();
				Label endLabel = gen.newLabel();
				gen.ifZCmp(GeneratorAdapter.EQ, falseLabel);
				gen.getStatic(BOOLEAN_OBJECT_TYPE, "TRUE", BOOLEAN_OBJECT_TYPE);
				gen.goTo(endLabel);
				gen.mark(falseLabel);
				gen.getStatic(BOOLEAN_OBJECT_TYPE, "FALSE", BOOLEAN_OBJECT_TYPE);
//				NIL_EXPR.emit(C.EXPRESSION, fn, gen);
				gen.mark(endLabel);
				}
			else if(returnType == void.class)
				{
				NIL_EXPR.emit(C.EXPRESSION, objx, gen);
				}
			else if(returnType == char.class)
					{
					gen.invokeStatic(CHAR_TYPE, charValueOfMethod);
					}
				else
					{
					if(returnType == int.class)
						{
						gen.invokeStatic(INTEGER_TYPE, intValueOfMethod);
//						gen.visitInsn(I2L);
//						gen.invokeStatic(NUMBERS_TYPE, Method.getMethod("Number num(long)"));
						}
					else if(returnType == float.class)
						{
						gen.invokeStatic(FLOAT_TYPE, floatValueOfMethod);

//						gen.visitInsn(F2D);
//						gen.invokeStatic(DOUBLE_TYPE, doubleValueOfMethod);
						}
					else if(returnType == double.class)
							gen.invokeStatic(DOUBLE_TYPE, doubleValueOfMethod);
					else if(returnType == long.class)
							gen.invokeStatic(NUMBERS_TYPE, Method.getMethod("Number num(long)"));
					else if(returnType == byte.class)
							gen.invokeStatic(BYTE_TYPE, byteValueOfMethod);
					else if(returnType == short.class)
							gen.invokeStatic(SHORT_TYPE, shortValueOfMethod);
					}
			}
	}
 
開發者ID:mrange,項目名稱:fsharpadvent2016,代碼行數:50,代碼來源:Compiler.java

示例8: emitProto

import org.objectweb.asm.commons.GeneratorAdapter; //導入方法依賴的package包/類
public void emitProto(C context, ObjExpr objx, GeneratorAdapter gen){
	Label onLabel = gen.newLabel();
	Label callLabel = gen.newLabel();
	Label endLabel = gen.newLabel();

	Var v = ((VarExpr)fexpr).var;

	Expr e = (Expr) args.nth(0);
	e.emit(C.EXPRESSION, objx, gen);
	gen.dup(); //target, target
	gen.invokeStatic(UTIL_TYPE,Method.getMethod("Class classOf(Object)")); //target,class
	gen.getStatic(objx.objtype, objx.cachedClassName(siteIndex),CLASS_TYPE); //target,class,cached-class
	gen.visitJumpInsn(IF_ACMPEQ, callLabel); //target
	if(protocolOn != null)
		{
		gen.dup(); //target, target			
		gen.instanceOf(Type.getType(protocolOn));
		gen.ifZCmp(GeneratorAdapter.NE, onLabel);
		}

	gen.dup(); //target, target
	gen.invokeStatic(UTIL_TYPE,Method.getMethod("Class classOf(Object)")); //target,class
	gen.putStatic(objx.objtype, objx.cachedClassName(siteIndex),CLASS_TYPE); //target

	gen.mark(callLabel); //target
	objx.emitVar(gen, v);
	gen.invokeVirtual(VAR_TYPE, Method.getMethod("Object getRawRoot()")); //target, proto-fn
	gen.swap();
	emitArgsAndCall(1, context,objx,gen);
	gen.goTo(endLabel);

	gen.mark(onLabel); //target
	if(protocolOn != null)
		{
		MethodExpr.emitTypedArgs(objx, gen, onMethod.getParameterTypes(), RT.subvec(args,1,args.count()));
		if(context == C.RETURN)
			{
			ObjMethod method = (ObjMethod) METHOD.deref();
			method.emitClearLocals(gen);
			}
		Method m = new Method(onMethod.getName(), Type.getReturnType(onMethod), Type.getArgumentTypes(onMethod));
		gen.invokeInterface(Type.getType(protocolOn), m);
		HostExpr.emitBoxReturn(objx, gen, onMethod.getReturnType());
		}
	gen.mark(endLabel);
}
 
開發者ID:mrange,項目名稱:fsharpadvent2016,代碼行數:47,代碼來源:Compiler.java


注:本文中的org.objectweb.asm.commons.GeneratorAdapter.goTo方法示例由純淨天空整理自Github/MSDocs等開源代碼及文檔管理平台,相關代碼片段篩選自各路編程大神貢獻的開源項目,源碼版權歸原作者所有,傳播和使用請參考對應項目的License;未經允許,請勿轉載。