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


Java GeneratorAdapter類代碼示例

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


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

示例1: loadMH

import org.objectweb.asm.commons.GeneratorAdapter; //導入依賴的package包/類
@Contract("null, null, _, _ -> fail")
private static void loadMH(GeneratorAdapter adapter, Type reflectorClass, int flags, int mhIndex) {
    if((flags & Magic.REFLECTOR_METHOD_USE_METHODHANDLE) == 0) return;

    /* Load MethodHandle field */
    adapter.loadThis();
    adapter.getField(notNull(reflectorClass, "Reflector class shouldn't be null!"), MHF, MH_ARRAY);

    /* Load index */
    if(mhIndex >= 0 && mhIndex <= 5)
        /* ICONST_x offset is 3, iow ICONST_0 = 3, ICONST_1 = 4 */
        adapter.visitInsn(ICONST_0 + mhIndex);
    else
        adapter.visitIntInsn(BIPUSH, mhIndex);

    /* Load MethodHandle from array */
    adapter.visitInsn(AALOAD);
}
 
開發者ID:mikroskeem,項目名稱:Shuriken,代碼行數:19,代碼來源:MethodGenerator.java

示例2: createClassArray

import org.objectweb.asm.commons.GeneratorAdapter; //導入依賴的package包/類
private static void createClassArray(GeneratorAdapter mv, List<Type> args) {
        // create an array of objects capable of containing all the parameters and optionally the "this"

        createLocals(mv, args);
        // we need to maintain the stack index when loading parameters from, as for long and double
        // values, it uses 2 stack elements, all others use only 1 stack element.
        int stackIndex = 0;
        for (int arrayIndex = 0; arrayIndex < args.size(); arrayIndex++) {
            Type arg = args.get(arrayIndex);
            // duplicate the array of objects reference, it will be used to store the value in.
            mv.dup();
            // index in the array of objects to store the boxed parameter.
            mv.push(arrayIndex);
            // Pushes the appropriate local variable on the stack
            redirectLocal(mv, arg);
//			 mv.visitLdcInsn(Type.getType(arg.getDescriptor()));
            // potentially box up intrinsic types.
//			 mv.box(arg);
            mv.arrayStore(Type.getType(Class.class));
            // stack index must progress according to the parameter type we just processed.
//			 stackIndex += arg.getSize();
        }
    }
 
開發者ID:Meituan-Dianping,項目名稱:Robust,代碼行數:24,代碼來源:RobustAsmUtils.java

示例3: visitEnd

import org.objectweb.asm.commons.GeneratorAdapter; //導入依賴的package包/類
public void visitEnd() {
	if (! doneAddField) {
		doneAddField = true;
		
		super.visitField(Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC, CLASS_FIELD, Type.getDescriptor(Agent.class), null, null);
	}
	
	if (! doneAddMethod) {
		doneAddMethod = true;

		GeneratorAdapter mg = new GeneratorAdapter(Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC, new Method(LOG_CLASS_METHOD, LOG_CLASS_SIGNATURE), LOG_CLASS_SIGNATURE, new Type[] {}, this);

		Label target = mg.newLabel();
		mg.getStatic(JAVA_LANG_SYSTEM_TYPE, CLASS_FIELD, JAVA_LANG_CLASS_TYPE);
		mg.ifNull(target);
		mg.push(LOG_INTERNAL_TYPE);
		mg.putStatic(JAVA_LANG_SYSTEM_TYPE, CLASS_FIELD, JAVA_LANG_CLASS_TYPE);
		mg.mark(target);
		mg.getStatic(JAVA_LANG_SYSTEM_TYPE, CLASS_FIELD, JAVA_LANG_CLASS_TYPE);
		mg.returnValue();
	}
	
	super.visitEnd();
}
 
開發者ID:RuiChen08,項目名稱:dacapobench,代碼行數:25,代碼來源:SystemInstrument.java

示例4: visitEnd

import org.objectweb.asm.commons.GeneratorAdapter; //導入依賴的package包/類
@SuppressWarnings("unchecked")
public void visitEnd() {
	if (!done && found) {
		done = true;
		try {
			GeneratorAdapter mg = new GeneratorAdapter(Opcodes.ACC_PRIVATE | Opcodes.ACC_STATIC, new Method(LOG_INTERNAL_METHOD, LOG_METHOD_SIGNATURE), LOG_METHOD_SIGNATURE, new Type[] {}, this);

			Label start = mg.mark();
			mg.invokeStatic(LOG_INTERNAL_TYPE, Method.getMethod(LOG_INTERNAL_CLASS.getMethod(LOG_METHOD_NAME)));
			mg.returnValue();
			Label end   = mg.mark();
			mg.catchException(start, end, JAVA_LANG_THROWABLE_TYPE);
			mg.returnValue();
			
			mg.endMethod();
		} catch (NoSuchMethodException nsme) {
			System.err.println("Unable to find Agent.rlogCallChain method");
			System.err.println("M:"+nsme);
			nsme.printStackTrace();
		}
	}
	
	super.visitEnd();
}
 
開發者ID:RuiChen08,項目名稱:dacapobench,代碼行數:25,代碼來源:CallChainInstrument.java

示例5: visitEnd

import org.objectweb.asm.commons.GeneratorAdapter; //導入依賴的package包/類
@SuppressWarnings("unchecked")
public void visitEnd() {
	if (!foundClinit && instrument()) {
		// didn't find <clinit> so lets make one
		try {
			GeneratorAdapter mg = new GeneratorAdapter(Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC, new Method(CLINIT_NAME, CLINIT_SIGNATURE), CLINIT_SIGNATURE, new Type[] {}, this);
			
			Label start = mg.mark();
			mg.push(className);
			mg.invokeStatic(LOG_INTERNAL_TYPE, Method.getMethod(LOG_INTERNAL_CLASS.getMethod(LOG_METHOD_NAME, String.class)));
			Label end   = mg.mark();
			mg.returnValue();
			
			mg.catchException(start, end, JAVA_LANG_THROWABLE_TYPE);
			mg.returnValue();
			
			mg.endMethod();
		} catch (NoSuchMethodException nsme) {
			System.out.println("Unable to find Agent.reportClass method");
		}
	}
	
	super.visitEnd();
}
 
開發者ID:RuiChen08,項目名稱:dacapobench,代碼行數:25,代碼來源:ClinitInstrument.java

示例6: visitx

import org.objectweb.asm.commons.GeneratorAdapter; //導入依賴的package包/類
private void visitx(GeneratorAdapter mv, List<String> strings) {
    if (strings.size() == 1) {
        visitCase(strings.get(0));
        return;
    }
    for (String string : strings) {
        Label label = new Label();
        visitString();
        mv.visitLdcInsn(string);
        mv.invokeVirtual(STRING_TYPE, Method.getMethod("boolean equals(Object)"));
        mv.visitJumpInsn(Opcodes.IFEQ, label);
        visitCase(string);
        mv.visitLabel(label);
    }

    visitDefault();
}
 
開發者ID:meili,項目名稱:Aceso,代碼行數:18,代碼來源:IntSwitch.java

示例7: loadVariableArray

import org.objectweb.asm.commons.GeneratorAdapter; //導入依賴的package包/類
/**
 * Given an array on the stack, it loads it with the values of the given variables stating at
 * offset.
 */
static void loadVariableArray(
         GeneratorAdapter mv,
         List<LocalVariable> variables, int offset) {
    // we need to maintain the stack index when loading parameters from, as for long and double
    // values, it uses 2 stack elements, all others use only 1 stack element.
    for (int i = offset; i < variables.size(); i++) {
        LocalVariable variable = variables.get(i);
        // duplicate the array of objects reference, it will be used to store the value in.
        mv.dup();
        // index in the array of objects to store the boxed parameter.
        mv.push(i);
        // Pushes the appropriate local variable on the stack
        mv.visitVarInsn(variable.type.getOpcode(Opcodes.ILOAD), variable.var);
        // potentially box up intrinsic types.
        mv.box(variable.type);
        // store it in the array
        mv.arrayStore(Type.getType(Object.class));
    }
}
 
開發者ID:meili,項目名稱:Aceso,代碼行數:24,代碼來源:ByteCodeUtils.java

示例8: redirect

import org.objectweb.asm.commons.GeneratorAdapter; //導入依賴的package包/類
/**
 * Adds the instructions to do a generic redirection.
 */
protected void redirect(GeneratorAdapter mv, int change) {
    // code to check if a new implementation of the current class is available.
    Label l0 = new Label();
    mv.loadLocal(change);
    mv.visitJumpInsn(Opcodes.IFNULL, l0);
    doRedirect(mv, change);

    // Return
    if (type == Type.VOID_TYPE) {
        mv.pop();
    } else {
        ByteCodeUtils.unbox(mv, type);
    }
    mv.returnValue();

    // jump label for classes without any new implementation, just invoke the original
    // method implementation.
    mv.visitLabel(l0);
}
 
開發者ID:meili,項目名稱:Aceso,代碼行數:23,代碼來源:Redirection.java

示例9: emitConstants

import org.objectweb.asm.commons.GeneratorAdapter; //導入依賴的package包/類
void emitConstants(GeneratorAdapter clinitgen){
	try
		{
		Var.pushThreadBindings(RT.map(RT.PRINT_DUP, RT.T));

		for(int i = 0; i < constants.count(); i++)
			{
               if(usedConstants.contains(i))
                   {
                   emitValue(constants.nth(i), clinitgen);
                   clinitgen.checkCast(constantType(i));
                   clinitgen.putStatic(objtype, constantName(i), constantType(i));
                   }
			}
		}
	finally
		{
		Var.popThreadBindings();
		}
}
 
開發者ID:skejserjensen,項目名稱:eclojure,代碼行數:21,代碼來源:Compiler.java

示例10: emitAssignLocal

import org.objectweb.asm.commons.GeneratorAdapter; //導入依賴的package包/類
public void emitAssignLocal(GeneratorAdapter gen, LocalBinding lb,Expr val){
	if(!isMutable(lb))
		throw new IllegalArgumentException("Cannot assign to non-mutable: " + lb.name);
	Class primc = lb.getPrimitiveType();
	gen.loadThis();
	if(primc != null)
		{
		if(!(val instanceof MaybePrimitiveExpr && ((MaybePrimitiveExpr) val).canEmitPrimitive()))
			throw new IllegalArgumentException("Must assign primitive to primitive mutable: " + lb.name);
		MaybePrimitiveExpr me = (MaybePrimitiveExpr) val;
		me.emitUnboxed(C.EXPRESSION, this, gen);
		gen.putField(objtype, lb.name, Type.getType(primc));
		}
	else
		{
		val.emit(C.EXPRESSION, this, gen);
		gen.putField(objtype, lb.name, OBJECT_TYPE);
		}
}
 
開發者ID:skejserjensen,項目名稱:eclojure,代碼行數:20,代碼來源:Compiler.java

示例11: emit

import org.objectweb.asm.commons.GeneratorAdapter; //導入依賴的package包/類
public void emit(C context, ObjExpr objx, GeneratorAdapter gen){
	boolean allKeysConstant = true;
	boolean allConstantKeysUnique = true;
	IPersistentSet constantKeys = PersistentHashSet.EMPTY;
	for(int i = 0; i < keyvals.count(); i+=2)
		{
		Expr k = (Expr) keyvals.nth(i);
		if(k instanceof LiteralExpr)
			{
			Object kval = k.eval();
			if (constantKeys.contains(kval))
				allConstantKeysUnique = false;
			else
				constantKeys = (IPersistentSet)constantKeys.cons(kval);
			}
		else
			allKeysConstant = false;
		}
	MethodExpr.emitArgsAsArray(keyvals, objx, gen);
	if((allKeysConstant && allConstantKeysUnique) || (keyvals.count() <= 2))
		gen.invokeStatic(RT_TYPE, mapUniqueKeysMethod);
	else
		gen.invokeStatic(RT_TYPE, mapMethod);
	if(context == C.STATEMENT)
		gen.pop();
}
 
開發者ID:skejserjensen,項目名稱:eclojure,代碼行數:27,代碼來源:Compiler.java

示例12: emitLetFnInits

import org.objectweb.asm.commons.GeneratorAdapter; //導入依賴的package包/類
public void emitLetFnInits(GeneratorAdapter gen, ObjExpr objx, IPersistentSet letFnLocals){
	//objx arg is enclosing objx, not this
	gen.checkCast(objtype);

	for(ISeq s = RT.keys(closes); s != null; s = s.next())
		{
		LocalBinding lb = (LocalBinding) s.first();
		if(letFnLocals.contains(lb))
			{
			Class primc = lb.getPrimitiveType();
			gen.dup();
			if(primc != null)
				{
				objx.emitUnboxedLocal(gen, lb);
				gen.putField(objtype, lb.name, Type.getType(primc));
				}
			else
				{
				objx.emitLocal(gen, lb, false);
				gen.putField(objtype, lb.name, OBJECT_TYPE);
				}
			}
		}
	gen.pop();

}
 
開發者ID:skejserjensen,項目名稱:eclojure,代碼行數:27,代碼來源:Compiler.java

示例13: emitAssign

import org.objectweb.asm.commons.GeneratorAdapter; //導入依賴的package包/類
public void emitAssign(C context, ObjExpr objx, GeneratorAdapter gen,
                       Expr val){
	if(targetClass != null && field != null)
		{
		target.emit(C.EXPRESSION, objx, gen);
		gen.checkCast(getType(targetClass));
		val.emit(C.EXPRESSION, objx, gen);
		gen.visitLineNumber(line, gen.mark());
		gen.dupX1();
		HostExpr.emitUnboxArg(objx, gen, field.getType());
		gen.putField(getType(targetClass), fieldName, Type.getType(field.getType()));
		}
	else
		{
		target.emit(C.EXPRESSION, objx, gen);
		gen.push(fieldName);
		val.emit(C.EXPRESSION, objx, gen);
		gen.visitLineNumber(line, gen.mark());
		gen.invokeStatic(REFLECTOR_TYPE, setInstanceFieldMethod);
		}
	if(context == C.STATEMENT)
		gen.pop();
}
 
開發者ID:mrange,項目名稱:fsharpadvent2016,代碼行數:24,代碼來源:Compiler.java

示例14: emitMethods

import org.objectweb.asm.commons.GeneratorAdapter; //導入依賴的package包/類
protected void emitMethods(ClassVisitor cv){
	//override of invoke/doInvoke for each method
	for(ISeq s = RT.seq(methods); s != null; s = s.next())
		{
		ObjMethod method = (ObjMethod) s.first();
		method.emit(this, cv);
		}

	if(isVariadic())
		{
		GeneratorAdapter gen = new GeneratorAdapter(ACC_PUBLIC,
		                                            Method.getMethod("int getRequiredArity()"),
		                                            null,
		                                            null,
		                                            cv);
		gen.visitCode();
		gen.push(variadicMethod.reqParms.count());
		gen.returnValue();
		gen.endMethod();
		}
}
 
開發者ID:skejserjensen,項目名稱:eclojure,代碼行數:22,代碼來源:Compiler.java

示例15: emitClearLocals

import org.objectweb.asm.commons.GeneratorAdapter; //導入依賴的package包/類
void emitClearLocals(GeneratorAdapter gen){
//		for(int i = 1; i < numParams() + 1; i++)
//			{
//			if(!localsUsedInCatchFinally.contains(i))
//				{
//				gen.visitInsn(Opcodes.ACONST_NULL);
//				gen.visitVarInsn(OBJECT_TYPE.getOpcode(Opcodes.ISTORE), i);
//				}
//			}
//		for(int i = numParams() + 1; i < maxLocal + 1; i++)
//			{
//			if(!localsUsedInCatchFinally.contains(i))
//				{
//				LocalBinding b = (LocalBinding) RT.get(indexlocals, i);
//				if(b == null || maybePrimitiveType(b.init) == null)
//					{
//					gen.visitInsn(Opcodes.ACONST_NULL);
//					gen.visitVarInsn(OBJECT_TYPE.getOpcode(Opcodes.ISTORE), i);
//					}
//				}
//			}
//		if(((FnExpr)objx).onceOnly)
//			{
//			objx.emitClearCloses(gen);
//			}
	}
 
開發者ID:skejserjensen,項目名稱:eclojure,代碼行數:27,代碼來源:Compiler.java


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