Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  package cn.wensiqun.visitor.invoker;
  
  import java.util.List;
  import java.util.Map;
  
  
 import  org.objectweb.asm.Type;
 
 
 	
 	
     private static final Log LOG = LogFactory.getLog(MethodInvokeGrepVisitor.class);
 
 
 	private String[] calledFunNames;
 	
 	private String[] calledFunDescs;
 	
 	private Class<?>[] calledFunOwners;
 	
 	private Type     callingFunOwner;
 	
 	private FunctionInfo   callingFun;
 	
 	
 	
 			int callingFunModifier
 			String callingFunName,
 			String callingFunDesc
 			Type callingFunOwner
 			List<LocalVariableSignaturecallingFunLocVarSigns
 			List<FunctionInfocalledFuns
 			Map<FunctionInfoList<InvokeInfo>> invokeInfoMap,
 			ClassLoader classLoader) {
 		
 		super(callingFunDesccallingFunModifiercallingFunOwnercallingFunLocVarSigns);
 		
 		this. = calledFuns;
 		this. = classLoader;
 		
 		this. = new String[calledFuns.size()];//calledFun.getName();
 		this. = new String[calledFuns.size()];//Type.getMethodDescriptor(calledFun);
 		this. = new Class<?>[calledFuns.size()];//calledFun.getDeclaringClass();
 		
 		for(int i=0, len=calledFuns.size(); i<leni++){
 			FunctionInfo calledFun = calledFuns.get(i);
 			this.[i] = calledFun.getName();
 			this.[i] = calledFun.getDescription();
 			this.[i] = calledFun.getDeclaringClass();
 		}
 		
 		
 		this. = callingFunOwner;
 		this. = invokeInfoMap;
 		
 		//reflect to get calling function
 		try {
 			
 			try {
 				if (callingFunName.equals("<init>")) {
 					
 					 = InvokeInfo.buildConstructorFunctionInfo(CommonUtils.reflect2Constructor(callingFunOwner.getDescriptor()
 							, callingFunDescclassLoader));
 				
 				}else if(callingFunName.equals("<clinit>")){
 					Class<?> callingFunOwnerCls = CommonUtils.forName(callingFunOwner.getDescriptor(), trueclassLoader);
 					 = InvokeInfo.buildStaticFunctionInfo(callingFunOwnerCls);
 				
 				}else{
 					
 					 = InvokeInfo.buildCommonFunctionInfo(CommonUtils.reflect2Method(callingFunOwner.getDescriptor(),
 							callingFunNamecallingFunDescclassLoader));
 				
 				}
 			} catch (Exception e) {
 				.error("cannot get method : " + callingFunName + " cause by : " + e.getMessage());
 			}
 			
 		} catch (Exception e) {
 			.error("cannot load class : " + callingFunOwner + " cause by : " + e.getMessage());
 		}
 		
 	}
 
	public void visitMethodInsn(int opcodeString ownerString nameString desc) {
		for(int idx=0, len=.size(); idx<lenidx++){
			String calledFunDesc = [idx];
			String calledFunName = [idx];
			Class<?> calledFunOwner = [idx];
			FunctionInfo calledFun = .get(idx);
			if(desc.equals(calledFunDesc) && name.equals(calledFunName)){
				try{
					AClass ownerClass = AClassFactory.getProductClass( CommonUtils.forName(owner.replace("/""."), true));
					AClass byInvokedMethodOwnerAClass = AClassFactory.getProductClass(calledFunOwner);
					if(ownerClass.isChildOrEqual(byInvokedMethodOwnerAClass)){
						int argumentsSize = calledFun.getParameterTypes().length;
						List<Type> allTypeInStack = new ArrayList<Type>();
						for(int i=0; i<argumentsSize;i++){
							allTypeInStack.add(.get(.size() - 1 - i));
						}
						Class<?>[] argumentActuallyTypes = new Class<?>[argumentsSize];
						for(int i=argumentsSizei>0;i--){
							Type typeInStack = allTypeInStack.get(i-1);
							Class<?> argCls = null
							int sort = typeInStack.getSort();
							switch(sort){
							case 1 :
						        argCls = boolean.class;
						        break;
							case 2 :
								argCls = char.class;
						        break;
							case 3 :
								argCls = byte.class;
						        break;
							case 4 :
								argCls = short.class;
						        break;
							case 5 :
								argCls = int.class;
						        break;
							case 6 :
								argCls = float.class;
						        break;
							case 7 :
								argCls = long.class;
						        break;
							case 8 :
								argCls = double.class;
						        break;
							case 9 :
								argCls = CommonUtils.forName(typeInStack.getDescriptor(), true);
						        break;
							default :
							    argCls = CommonUtils.forName(typeInStack.getClassName(), true);
						        break;
							}
							argumentActuallyTypes[argumentsSize-i] = argCls;
						}
						InvokeInfo invokeInfo = new InvokeInfo(CommonUtils.forName(.getClassName(), true),
								calledFunargumentActuallyTypes);
						.get(calledFun).add(invokeInfo);
					}
catch (Throwable e) {
					.warn("error when extart method invoke information : " + calledFun + " cause by : " + e.getMessage(), e);
			    }
			}
		}
		super.visitMethodInsn(opcodeownernamedesc);
	}
New to GrepCode? Check out our FAQ X