From: Mika R. <mc...@us...> - 2004-04-11 14:36:38
|
Update of /cvsroot/jiapi/jiapi/src/alt/jiapi/interceptor In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv21924/src/alt/jiapi/interceptor Modified Files: FieldInstrumentor.java FieldInterceptor.java InvocationInterceptor.java Log Message: Index: FieldInstrumentor.java =================================================================== RCS file: /cvsroot/jiapi/jiapi/src/alt/jiapi/interceptor/FieldInstrumentor.java,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** FieldInstrumentor.java 8 Apr 2004 10:20:26 -0000 1.2 --- FieldInstrumentor.java 11 Apr 2004 14:22:58 -0000 1.3 *************** *** 41,45 **** private JiapiMethod setMethod; ! FieldInstrumentor(FieldInterceptor ii, FieldHandler handler) { super(ii); this.handler = handler; --- 41,45 ---- private JiapiMethod setMethod; ! FieldInstrumentor(FieldInterceptor2 ii, FieldHandler handler) { super(ii); this.handler = handler; *************** *** 68,72 **** InstructionFactory factory = il.getInstructionFactory(); ! HotSpotLocator hsl = new HotSpotLocator(il, Opcodes.GETSTATIC); HotSpot[] hotSpots = hsl.getHotSpots(); --- 68,74 ---- InstructionFactory factory = il.getInstructionFactory(); ! HotSpotLocator hsl = ! new HotSpotLocator(il, ! new byte[]{Opcodes.GETSTATIC/*,Opcodes.PUTSTATIC*/}); HotSpot[] hotSpots = hsl.getHotSpots(); *************** *** 74,80 **** FieldAccess fa = (FieldAccess)hotSpots[i].getHotSpotInstruction(); ! // BUG: We cannot use reflection in this interceptor, since it ! // is allowed only for public fields. ! if (!isPublicField(fa)) { continue; } --- 76,80 ---- FieldAccess fa = (FieldAccess)hotSpots[i].getHotSpotInstruction(); ! if (fa.getName().startsWith("__jiapi")) { continue; } *************** *** 84,87 **** --- 84,93 ---- } + // BUG: We cannot use reflection in this interceptor, since it + // is allowed only for public fields. + if (!isPublicField(fa)) { + continue; + } + InstructionList hsList = hotSpots[i].getInstructionList(); InstructionList nList = il.createEmptyList(); *************** *** 90,94 **** // Class or objref; 1st parameter to interceptor ! if (fa.getOpcode() == Opcodes.GETSTATIC) { addClassForNameInstructions(fa.getClassName(), nList); } --- 96,101 ---- // Class or objref; 1st parameter to interceptor ! if ((fa.getOpcode() == Opcodes.GETSTATIC) || ! (fa.getOpcode() == Opcodes.PUTSTATIC)) { addClassForNameInstructions(fa.getClassName(), nList); } *************** *** 98,106 **** // Name of the field; 2nd parameter to interceptor ! nList.add(factory.pushConstant(fa.getFieldName())); // call Interceptor ! nList.add(factory.invoke(getMethod)); ! nList.add(factory.cast(fa.getTypeName())); hsList.replace(nList); --- 105,124 ---- // Name of the field; 2nd parameter to interceptor ! nList.add(factory.pushConstant(fa.getClassName() + "." + ! fa.getFieldName())); // call Interceptor ! if ((fa.getOpcode() == Opcodes.GETSTATIC) || ! (fa.getOpcode() == Opcodes.GETFIELD)) { ! nList.add(factory.invoke(getMethod)); ! } ! else { ! nList.add(il.get(1)); // value ??? ! nList.add(factory.invoke(setMethod)); ! } ! ! handleReturnValue(nList, fa.getTypeName()); ! ! //nList.add(factory.cast(fa.getTypeName())); hsList.replace(nList); *************** *** 146,148 **** --- 164,272 ---- return false; } + + + private void handleReturnValue(InstructionList il, String rType) { + // Convert return value if needed. + InstructionFactory factory = il.getInstructionFactory(); + + if ("int".equals(rType)) { + try { + JiapiClass jc = new Loader().loadClass("java.lang.Integer"); + JiapiMethod jm = + jc.getDeclaredMethod("intValue", new String[0]); + + il.add(factory.cast("java.lang.Integer")); + il.add(factory.invoke(jm)); + } + catch(Exception e) { + e.printStackTrace(); + } + } + else if ("long".equals(rType)) { + try { + JiapiClass jc = new Loader().loadClass("java.lang.Long"); + JiapiMethod jm = + jc.getDeclaredMethod("longValue", new String[0]); + + il.add(factory.cast("java.lang.Long")); + il.add(factory.invoke(jm)); + } + catch(Exception e) { + e.printStackTrace(); + } + } + else if ("char".equals(rType)) { + try { + JiapiClass jc = new Loader().loadClass("java.lang.Character"); + JiapiMethod jm = + jc.getDeclaredMethod("charValue", new String[0]); + + il.add(factory.cast("java.lang.Character")); + il.add(factory.invoke(jm)); + } + catch(Exception e) { + e.printStackTrace(); + } + } + else if ("boolean".equals(rType)) { + try { + JiapiClass jc = new Loader().loadClass("java.lang.Boolean"); + JiapiMethod jm = + jc.getDeclaredMethod("booleanValue", new String[0]); + + il.add(factory.cast("java.lang.Boolean")); + il.add(factory.invoke(jm)); + } + catch(Exception e) { + e.printStackTrace(); + } + } + else if ("byte".equals(rType)) { + try { + JiapiClass jc = new Loader().loadClass("java.lang.Byte"); + JiapiMethod jm = + jc.getDeclaredMethod("byteValue", new String[0]); + + il.add(factory.cast("java.lang.Byte")); + il.add(factory.invoke(jm)); + } + catch(Exception e) { + e.printStackTrace(); + } + } + else if ("float".equals(rType)) { + try { + JiapiClass jc = new Loader().loadClass("java.lang.Float"); + JiapiMethod jm = + jc.getDeclaredMethod("floatValue", new String[0]); + + il.add(factory.cast("java.lang.Float")); + il.add(factory.invoke(jm)); + } + catch(Exception e) { + e.printStackTrace(); + } + } + else if ("double".equals(rType)) { + try { + JiapiClass jc = new Loader().loadClass("java.lang.Double"); + JiapiMethod jm = + jc.getDeclaredMethod("doubleValue", new String[0]); + + il.add(factory.cast("java.lang.Double")); + il.add(factory.invoke(jm)); + } + catch(Exception e) { + e.printStackTrace(); + } + } + else if ("void".equals(rType)){ + // Pop out the return value(probably null) of + // the invocation handler if it was a 'void' method + il.add(new Instruction(new byte[]{Opcodes.POP})); + } + else { // Cast to correct Object + il.add(factory.cast(rType)); + } + } } Index: FieldInterceptor.java =================================================================== RCS file: /cvsroot/jiapi/jiapi/src/alt/jiapi/interceptor/FieldInterceptor.java,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** FieldInterceptor.java 4 Apr 2004 10:03:17 -0000 1.1 --- FieldInterceptor.java 11 Apr 2004 14:22:58 -0000 1.2 *************** *** 37,41 **** * delegates invocations to InvokeHandler.<p> * Following code snippet is an example, how to initialize ! * InvocationInterceptor: * * <pre> --- 37,41 ---- * delegates invocations to InvokeHandler.<p> * Following code snippet is an example, how to initialize ! * FieldInterceptor: * * <pre> *************** *** 45,58 **** * ctx.addInstrumentationDescriptor(id); * ! * InvocationInterceptor ii = new InvocationInterceptor(id, "java*",this); * </pre> * * FieldInterceptor intercepts only accessess to public fields. * * @author Mika Riekkinen * @version $Revision$ $Date$ */ public class FieldInterceptor extends EventProducer { ! private FieldHandler handler; /** --- 45,60 ---- * ctx.addInstrumentationDescriptor(id); * ! * FieldInterceptor fi = new FieldInterceptor(id, "samples*", this); * </pre> * * FieldInterceptor intercepts only accessess to public fields. * + * NOTE: ONLY FIELD GETS ARE SUPPORTED AT THE MOMENT + * * @author Mika Riekkinen * @version $Revision$ $Date$ */ public class FieldInterceptor extends EventProducer { ! private AccessAdvisor advisor; /** *************** *** 63,68 **** * @param handler InvocationHandler */ ! public FieldInterceptor(InstrumentationDescriptor id,FieldHandler handler){ ! this(id, "*", handler); } --- 65,71 ---- * @param handler InvocationHandler */ ! public FieldInterceptor(InstrumentationDescriptor id, ! AccessAdvisor advisor){ ! this(id, "*", advisor); } *************** *** 79,84 **** */ public FieldInterceptor(InstrumentationDescriptor id, ! String resolution, FieldHandler handler){ ! this(id, new String[] { resolution }, handler); } --- 82,87 ---- */ public FieldInterceptor(InstrumentationDescriptor id, ! String resolution, AccessAdvisor advisor){ ! this(id, new String[] { resolution }, advisor); } *************** *** 95,103 **** public FieldInterceptor(InstrumentationDescriptor id, String[] resolutions, ! FieldHandler handler) { super(resolutions); ! this.handler = handler; ! id.addInstrumentor(new FieldInstrumentor(this, handler)); } --- 98,106 ---- public FieldInterceptor(InstrumentationDescriptor id, String[] resolutions, ! AccessAdvisor advisor) { super(resolutions); ! this.advisor = advisor; ! id.addInstrumentor(new FieldAdvisorInstrumentor(this, advisor)); } *************** *** 106,178 **** /** * Called by Jiapi runtime. ! * @param o if invocation is being made to an static method, ! * this parameter holds a Class of the called method, ! * otherwise this is the instance, that invocation should be * acted on. ! * @param name of the method to call ! * @param args Arguments of the method */ ! public void setField(Object o, String name, Object value) throws Throwable { try { ! Field f = null;; ! Class c = null; ! ! if (o instanceof Class) { // invokestatic ! c = (Class)o; ! } ! else { // invokevirtual ! c = o.getClass(); ! } ! ! f = getReflectionField(c, name); ! ! handler.setField(o, f, value); } catch(Throwable t) { t.printStackTrace(); - throw t; } } ! public Object getField(Object o, String name) throws Throwable { try { ! Field f = null; ! Class c = null; ! ! if (o instanceof Class) { // invokestatic ! c = (Class)o; ! } ! else { // invokevirtual ! c = o.getClass(); ! } ! ! f = getReflectionField(c, name); ! ! Object r = handler.getField(o, f); ! return r; } catch(Throwable t) { t.printStackTrace(); - throw t; - } - } - - - private Field getReflectionField(Class c, String name) { - Field f = null; - - try { - Field[] fields = c.getFields(); - for (int i = 0; i < fields.length; i++) { - System.out.println(fields[i].getName()); - } - - f = c.getDeclaredField(name); - } - catch(Exception e) { - e.printStackTrace(); } ! return f; } } --- 109,141 ---- /** * Called by Jiapi runtime. ! * ! * @param o if field-access is being made to an static field, ! * this parameter holds a Class of that field, ! * otherwise this is the instance, that field-access is being * acted on. ! * @param name of the field ! * @param value value to set ! * @return The value that is set on the field */ ! public Object setField(Object o, String name, Object value) { try { ! return advisor.set(o, name, value); } catch(Throwable t) { t.printStackTrace(); } + + return value; } ! public Object getField(Object o, String name, Object value) { try { ! return advisor.get(o, name, value); } catch(Throwable t) { t.printStackTrace(); } ! return value; } } Index: InvocationInterceptor.java =================================================================== RCS file: /cvsroot/jiapi/jiapi/src/alt/jiapi/interceptor/InvocationInterceptor.java,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** InvocationInterceptor.java 5 Apr 2004 06:07:29 -0000 1.8 --- InvocationInterceptor.java 11 Apr 2004 14:22:58 -0000 1.9 *************** *** 146,157 **** - private static final Class[] emptyClassArray = new Class[0]; private Method getReflectionMethod(Class c, String name, Object[] args, String signature) { Method m = null; ! // StringBuffer sb = new StringBuffer(c.toString()); ! // sb.append(name); ! // sb.append(signature); m = (Method)rmCache.get(signature); if (m != null) { --- 146,155 ---- private Method getReflectionMethod(Class c, String name, Object[] args, String signature) { Method m = null; ! // NOTE: cache should be configurable. It can potentially ! // consume a lot of memory m = (Method)rmCache.get(signature); if (m != null) { |