public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) { className = name; this.superName = superName; classType = Type.getObjectType(className); classInitializerFound = false; super.visit(version, access, name, signature, superName, interfaces); }
private void pushLockedObject() { if (isStatic) { // push class object super.visitLdcInsn(Type.getObjectType(getParentClz())); } else { loadThis(); } }
private void callAction(int opcode, String desc) { if (opcode == Opcodes.CHECKCAST) { // TODO not really usefull // It would be better to check for the original and desired type Type castType = Type.getObjectType(desc); addExtraTypeInfo(om.getSelfParameter(), Type.getObjectType(className)); ValidationResult vr = validateArguments(om, isStatic(), actionArgTypes, new Type[]{castType}); if (vr.isValid()) { lvs.freeze(); try { int castTypeIndex = -1; if (!vr.isAny()) { dup(); castTypeIndex = lvs.newLocal(castType); } loadArguments( new LocalVarArgProvider(vr.getArgIdx(0), castType, castTypeIndex), new ConstantArgProvider(om.getClassNameParameter(), className.replace("/", ".")), new ConstantArgProvider(om.getMethodParameter(), getName(om.isMethodFqn())), new LocalVarArgProvider(om.getSelfParameter(), Type.getObjectType(className), 0)); invokeBTraceAction(this, om); } finally { lvs.unfreeze(); } } } }
private void callAction(int opcode, String desc) { if (opcode == Opcodes.INSTANCEOF) { // TODO not really usefull // It would be better to check for the original and desired type Type castType = Type.getObjectType(desc); addExtraTypeInfo(om.getSelfParameter(), Type.getObjectType(className)); ValidationResult vr = validateArguments(om, isStatic(), actionArgTypes, new Type[]{castType}); if (vr.isValid()) { int castTypeIndex = -1; lvs.freeze(); try { if (!vr.isAny()) { dup(); castTypeIndex = lvs.newLocal(castType); } loadArguments( new LocalVarArgProvider(vr.getArgIdx(0), castType, castTypeIndex), new ConstantArgProvider(om.getClassNameParameter(), className.replace("/", ".")), new ConstantArgProvider(om.getMethodParameter(), getName(om.isMethodFqn())), new LocalVarArgProvider(om.getSelfParameter(), Type.getObjectType(className), 0)); invokeBTraceAction(this, om); } finally { lvs.unfreeze(); } } } }
private void callOnLine(int line) { addExtraTypeInfo(om.getSelfParameter(), Type.getObjectType(className)); ValidationResult vr = validateArguments(om, isStatic(), actionArgTypes, new Type[]{Type.INT_TYPE}); if (vr.isValid()) { lvs.freeze(); try { loadArguments( new ConstantArgProvider(vr.getArgIdx(0), line), new ConstantArgProvider(om.getClassNameParameter(), className.replace("/", ".")), new ConstantArgProvider(om.getMethodParameter(), getName(om.isMethodFqn())), new LocalVarArgProvider(om.getSelfParameter(), Type.getObjectType(className), 0)); invokeBTraceAction(this, om); } finally { lvs.unfreeze(); } } }
private void callAction() { if (isStatic() && om.getSelfParameter() > -1) { return; // invalid combination; a static method can not provide *this* } Type[] calledMethodArgs = Type.getArgumentTypes(getDescriptor()); addExtraTypeInfo(om.getSelfParameter(), Type.getObjectType(className)); ValidationResult vr = validateArguments(om, isStatic(), actionArgTypes, calledMethodArgs); if (vr.isValid()) { injectBtrace(vr); } }
@Override protected void beforeObjectNew(String desc) { if (loc.getWhere() == Where.BEFORE) { String extName = desc.replace('/', '.'); if (matches(loc.getClazz(), extName)) { addExtraTypeInfo(om.getSelfParameter(), Type.getObjectType(className)); ValidationResult vr = validateArguments(om, isStatic(), actionArgTypes, new Type[]{TypeUtils.stringType}); if (vr.isValid()) { lvs.freeze(); try { loadArguments( new ConstantArgProvider(vr.getArgIdx(0), extName), new ConstantArgProvider(om.getClassNameParameter(), className.replace("/", ".")), new ConstantArgProvider(om.getMethodParameter(), getName(om.isMethodFqn())), new LocalVarArgProvider(om.getSelfParameter(), Type.getObjectType(className), 0)); invokeBTraceAction(this, om); } finally { lvs.unfreeze(); } } } } }
@Override protected void onCatch(String type) { Type exctype = Type.getObjectType(type); addExtraTypeInfo(om.getSelfParameter(), Type.getObjectType(className)); ValidationResult vr = validateArguments(om, isStatic(), actionArgTypes, new Type[]{exctype}); if (vr.isValid()) { int index = -1; lvs.freeze(); try { if (!vr.isAny()) { dup(); index = lvs.newLocal(exctype); } loadArguments( new LocalVarArgProvider(vr.getArgIdx(0), exctype, index), new ConstantArgProvider(om.getClassNameParameter(), className), new ConstantArgProvider(om.getMethodParameter(), getName(om.isMethodFqn())), new LocalVarArgProvider(om.getSelfParameter(), Type.getObjectType(className), 0)); invokeBTraceAction(this, om); } finally { lvs.unfreeze(); } } } };// </editor-fold>
String extName = desc.replace('/', '.'); if (matches(loc.getClazz(), extName)) { Type instType = Type.getObjectType(desc); addExtraTypeInfo(om.getSelfParameter(), Type.getObjectType(className)); addExtraTypeInfo(om.getReturnParameter(), instType); ValidationResult vr = validateArguments(om, isStatic(), actionArgTypes, new Type[]{TypeUtils.stringType}); new ConstantArgProvider(om.getClassNameParameter(), className.replace("/", ".")), new ConstantArgProvider(om.getMethodParameter(), getName(om.isMethodFqn())), new LocalVarArgProvider(om.getSelfParameter(), Type.getObjectType(className), 0));
@Override protected void onThrow() { addExtraTypeInfo(om.getSelfParameter(), Type.getObjectType(className)); ValidationResult vr = validateArguments(om, isStatic(), actionArgTypes, new Type[]{TypeUtils.throwableType}); if (vr.isValid()) { int throwableIndex = -1; lvs.freeze(); try { if (!vr.isAny()) { dup(); throwableIndex = lvs.newLocal(TypeUtils.throwableType); } loadArguments( new LocalVarArgProvider(vr.getArgIdx(0), TypeUtils.throwableType, throwableIndex), new ConstantArgProvider(om.getClassNameParameter(), className.replace("/", ".")), new ConstantArgProvider(om.getMethodParameter(),getName(om.isMethodFqn())), new LocalVarArgProvider(om.getSelfParameter(), Type.getObjectType(className), 0)); invokeBTraceAction(this, om); } finally { lvs.unfreeze(); } } } };// </editor-fold>
@Override protected void onAfterPutField(int opcode, String owner, String name, String desc) { if (om.getTargetInstanceParameter() != -1 && isStaticAccess) { return; } if (where == Where.AFTER && matches(targetClassName, owner.replace('/', '.')) && matches(targetFieldName, name)) { Type fieldType = Type.getType(desc); addExtraTypeInfo(om.getSelfParameter(), Type.getObjectType(className)); ValidationResult vr = validateArguments(om, isStatic(), actionArgTypes, new Type[]{fieldType}); if (vr.isValid()) { lvs.freeze(); try { loadArguments( new LocalVarArgProvider(vr.getArgIdx(0), fieldType, fldValueIndex), new LocalVarArgProvider(om.getTargetInstanceParameter(), TypeUtils.objectType, calledInstanceIndex), new ConstantArgProvider(om.getTargetMethodOrFieldParameter(), targetFieldName), new ConstantArgProvider(om.getClassNameParameter(), className.replace("/", ".")), new ConstantArgProvider(om.getMethodParameter(), getName(om.isMethodFqn())), new LocalVarArgProvider(om.getSelfParameter(), Type.getObjectType(className), 0)); invokeBTraceAction(this, om); } finally { lvs.unfreeze(); } } } } };// </editor-fold>
addExtraTypeInfo(om.getSelfParameter(), Type.getObjectType(className)); if (where == Where.AFTER) { addExtraTypeInfo(om.getReturnParameter(), fldType); new ConstantArgProvider(om.getClassNameParameter(), className.replace("/", ".")), new ConstantArgProvider(om.getMethodParameter(), getName(om.isMethodFqn())), new LocalVarArgProvider(om.getSelfParameter(), Type.getObjectType(className), 0));
@Override protected void onAfterArrayStore(int opcode) { if (where == Where.AFTER) { Type elementType = TypeUtils.getElementType(opcode); Type arrayType = TypeUtils.getArrayType(opcode); addExtraTypeInfo(om.getSelfParameter(), Type.getObjectType(className)); ValidationResult vr = validateArguments(om, isStatic(), actionArgTypes, new Type[]{arrayType, Type.INT_TYPE, elementType}); if (vr.isValid()) { lvs.freeze(); try { loadArguments( new LocalVarArgProvider(vr.getArgIdx(INSTANCE_PTR), arrayType, argsIndex[INSTANCE_PTR]), new LocalVarArgProvider(vr.getArgIdx(INDEX_PTR), Type.INT_TYPE, argsIndex[INDEX_PTR]), new LocalVarArgProvider(vr.getArgIdx(VALUE_PTR), elementType, argsIndex[VALUE_PTR]), new ConstantArgProvider(om.getClassNameParameter(), className.replace("/", ".")), new ConstantArgProvider(om.getMethodParameter(), getName(om.isMethodFqn())), new LocalVarArgProvider(om.getSelfParameter(), Type.getObjectType(className), 0)); invokeBTraceAction(this, om); } finally { lvs.unfreeze(); } } } } };// </editor-fold>
@Override protected void onBeforeArrayNew(String desc, int dims) { if (where == Where.BEFORE) { String extName = TypeUtils.getJavaType(desc); String type = TypeUtils.objectOrArrayType(loc.getClazz()); if (matches(type, desc)) { addExtraTypeInfo(om.getSelfParameter(), Type.getObjectType(className)); ValidationResult vr = validateArguments(om, isStatic(), actionArgTypes, new Type[]{TypeUtils.stringType, Type.INT_TYPE}); if (vr.isValid()) { lvs.freeze(); try { loadArguments( new ConstantArgProvider(vr.getArgIdx(0), extName), new ConstantArgProvider(vr.getArgIdx(1), dims), new ConstantArgProvider(om.getClassNameParameter(), className.replace("/", ".")), new ConstantArgProvider(om.getMethodParameter(), getName(om.isMethodFqn())), new LocalVarArgProvider(om.getSelfParameter(), Type.getObjectType(className), 0)); invokeBTraceAction(this, om); } finally { lvs.unfreeze(); } } } } }
private void callAction() { addExtraTypeInfo(om.getSelfParameter(), Type.getObjectType(className)); ValidationResult vr = validateArguments(om, isStatic(), actionArgTypes, new Type[]{TypeUtils.objectType}); if (vr.isValid()) { int index = -1; lvs.freeze(); try { if (!vr.isAny()) { dup(); index = lvs.newLocal(TypeUtils.objectType); } loadArguments( new LocalVarArgProvider(vr.getArgIdx(0), TypeUtils.objectType, index), new ConstantArgProvider(om.getClassNameParameter(), className), new ConstantArgProvider(om.getMethodParameter(), getName(om.isMethodFqn())), new LocalVarArgProvider(om.getSelfParameter(), Type.getObjectType(className), 0)); invokeBTraceAction(this, om); } finally { lvs.unfreeze(); } } }
private void callAction() { addExtraTypeInfo(om.getSelfParameter(), Type.getObjectType(className)); ValidationResult vr = validateArguments(om, isStatic(), actionArgTypes, new Type[]{TypeUtils.objectType}); if (vr.isValid()) { int index = -1; lvs.freeze(); try { if (!vr.isAny()) { dup(); index = lvs.newLocal(TypeUtils.objectType); } loadArguments( new LocalVarArgProvider(vr.getArgIdx(0), TypeUtils.objectType, index), new ConstantArgProvider(om.getClassNameParameter(), className), new ConstantArgProvider(om.getMethodParameter(), getName(om.isMethodFqn())), new LocalVarArgProvider(om.getSelfParameter(), Type.getObjectType(className), 0)); invokeBTraceAction(this, om); } finally { lvs.unfreeze(); } } }
private void injectBtrace(ValidationResult vr) { lvs.freeze(); try { ArgumentProvider[] actionArgs = new ArgumentProvider[actionArgTypes.length + 3]; int ptr = isStatic() ? 0 : 1; for(int i=0;i<vr.getArgCnt();i++) { int index = vr.getArgIdx(i); Type t = actionArgTypes[index]; if (TypeUtils.isAnyTypeArray(t)) { actionArgs[i] = new AnyTypeArgProvider(index, ptr); ptr++; } else { actionArgs[i] = new LocalVarArgProvider(index, t, ptr); ptr += actionArgTypes[index].getSize(); } } actionArgs[actionArgTypes.length] = new ConstantArgProvider(om.getMethodParameter(), getName(om.isMethodFqn())); actionArgs[actionArgTypes.length + 1] = new ConstantArgProvider(om.getClassNameParameter(), className.replace("/", ".")); actionArgs[actionArgTypes.length + 2] = new LocalVarArgProvider(om.getSelfParameter(), Type.getObjectType(className), 0); loadArguments(actionArgs); invokeBTraceAction(this, om); } finally { lvs.unfreeze(); } }
Type arrtype = TypeUtils.getArrayType(opcode); Type retType = TypeUtils.getElementType(opcode); addExtraTypeInfo(om.getSelfParameter(), Type.getObjectType(className)); if (where == Where.AFTER) { addExtraTypeInfo(om.getReturnParameter(), retType); new ConstantArgProvider(om.getClassNameParameter(), className.replace("/", ".")), new ConstantArgProvider(om.getMethodParameter(), getName(om.isMethodFqn())), new LocalVarArgProvider(om.getSelfParameter(), Type.getObjectType(className), 0));
Type arrayType = TypeUtils.getArrayType(opcode); addExtraTypeInfo(om.getSelfParameter(), Type.getObjectType(className)); ValidationResult vr = validateArguments(om, isStatic(), actionArgTypes, new Type[]{arrayType, Type.INT_TYPE, elementType}); if (vr.isValid()) { new ConstantArgProvider(om.getClassNameParameter(), className.replace("/", ".")), new ConstantArgProvider(om.getMethodParameter(), getName(om.isMethodFqn())), new LocalVarArgProvider(om.getSelfParameter(), Type.getObjectType(className), 0));
private void injectBtrace(ValidationResult vr, final String method, final Type[] callArgTypes, final Type returnType) { ArgumentProvider[] actionArgs = new ArgumentProvider[actionArgTypes.length + 6]; for(int i=0;i<vr.getArgCnt();i++) { int index = vr.getArgIdx(i); Type t = actionArgTypes[index]; if (TypeUtils.isAnyTypeArray(t)) { if (i < backupArgsIndexes.length - 1) { actionArgs[i] = new AnyTypeArgProvider(index, backupArgsIndexes[i+1], callArgTypes); } else { actionArgs[i] = new ArgumentProvider(index) { @Override protected void doProvide() { push(0); visitTypeInsn(ANEWARRAY, TypeUtils.objectType.getInternalName()); } }; } } else { actionArgs[i] = new LocalVarArgProvider(index, actionArgTypes[index], backupArgsIndexes[i+1]);; } } actionArgs[actionArgTypes.length] = new LocalVarArgProvider(om.getReturnParameter(), returnType, returnVarIndex); actionArgs[actionArgTypes.length + 1] = new LocalVarArgProvider(om.getTargetInstanceParameter(), TypeUtils.objectType, backupArgsIndexes[0]); actionArgs[actionArgTypes.length + 2] = new ConstantArgProvider(om.getTargetMethodOrFieldParameter(), method); actionArgs[actionArgTypes.length + 3] = new ConstantArgProvider(om.getClassNameParameter(), className); actionArgs[actionArgTypes.length + 4] = new ConstantArgProvider(om.getMethodParameter(), getName(om.isMethodFqn())); actionArgs[actionArgTypes.length + 5] = new LocalVarArgProvider(om.getSelfParameter(), Type.getObjectType(className), 0); loadArguments(actionArgs); invokeBTraceAction(this, om); }