2010-03-01 mcr70 <mcr70@linux-6hdv> * RuntimeVisibleAnnotation & RuntimeInvisibleAnnotation read-only support in alt.jiapi.file package 2010-03-01 mcr70 <mcr70@linux-6hdv> * Moved attributes to own package: alt.jiapi.file.attribute 2010-02-19 mcr70 <mcr70@linux-6hdv> * Checked for Java6 compatibility. StackMapFrame, LocalVariableTableAttribute and LocalVariableTypeTableAttribute in class file version 50.0. * Removed alt.jiapi.instrumentor package as it was obsolete and confusing. 2005-06-13 mcr70 <mcr70@haaratie.net> * Fix this again. * Bug fix. Copying of instructions from another list caused a bug, if branch-instruction was copied, but not its target. Fixed so, that if target is not found, branch offset is left as is. This works for the most cases. 2005-06-03 mcr70 <mcr70@haaratie.net> * Fixed a bug. If hotspot was a target of branch instruction, before advice was inserted into dead code segment. This caused verify error to occur, because stack became inconsistent. 2005-05-24 mcr70 <mcr70@haaratie.net> * Added Initial hooks for jdk1.5 agents/transformers NOTE: you must use jdk1.5 compiler. If do not need jdk1.5 agents, remove alt/jiapi/agent/* from compilation 2004-08-11 Mika Riekkinen <mcr70@dungeon> * Added support for having local variables used in HotSpotAdvice.advice() method * Added missing local variables factory methods to InstructionFactory 2004-08-10 Mika Riekkinen <mcr70@dungeon> * Added resolutions to HotSpot related classes * Removed call to newInstance() in Bootstrapper * Added getHotSpotName() to HotSpotAdvice 2004-08-08 Mika Riekkinen <mcr70@dungeon> * Added HotSpotAdvisor and HotSpotAdvice * Bug-fix. InstructionList.insert(...) did not handle correctly Instruction(List)s from other methods, with different Constantpool. 2004-08-04 Mika Riekkinen <mcr70@dungeon> * Bug-Fix. If invocationInterceptor instrumented for a method that had long or double in its arguments, instrumentation failed on 'expecting double/long on stack'. 2004-04-11 Mika Riekkinen <mcr70@snowhite.dungeon> * Added stack-consumption to the output of Javap. * Added Instruction.stackConsumption(), which is used by HotSpotLocator 2004-04-10 Mika Riekkinen <mcr70@snowhite.dungeon> * Added AccessAdvisor; A different strategy for FieldInterceptor. This provides roughly 100 times faster response time compared to reflection. * Fixed long/double handling when calculating max-stack for the Code attribute of the method 2004-04-08 Mika Riekkinen <mcr70@snowhite.dungeon> * Added jazzpect, an implementation of aopalliance-1.0 interfaces. 2004-04-04 Mika Riekkinen <mcr70@snowhite.dungeon> * Made some visibility changes on APIs * Lot's of other bug fixes * Added alt.jiapi.util.HotSpotLocator * Fixed a bug in IINC creation * Fixed a bug finding negative offsets. 2004-03-31 Mika Riekkinen <mcr70@snowhite.dungeon> * Added FieldInterceptor 2004-03-29 Mika Riekkinen <mcr70@snowhite.dungeon> * Fixed indexing bug in InvocationInterceptor. This caused some of the methods to be skipped instrumentation. * Added junit test cases back. * Fixed Signature handling 2004-03-28 Mika Riekkinen <mcr70@snowhite.dungeon> * Fixed parsing of long_Info and double_Info. They take up 2 entries in constant pool. * Added workaround for bug in ZipFileInputStream. We do not rely on InputStream.available(). Instead, read bytes into byte buffer, and use ByteArrayInputStream. 2004-03-26 Mika Riekkinen <mcr70@snowhite.dungeon> * Removed reflection field generation for instrumented classes in InvocationInterceptor. This fixed a ClassLoader bug. Now reflection Method is created in the interceptor, when they are needed. NOTE: this could benefit from caching. * Fixed stack scanning in InvocationInterceptor. Instructions were scanned backwards, and resulted in Instructions being in wrong order in instrumented bytecode. * Fixed primitive support in InvocationInterceptor. Now it doesn't make any false assumptions. 2004-03-25 Mika Riekkinen <mcr70@snowhite.dungeon> * Added support for primitive types in InvocationInterceptor. Code makes a false assumption, that each java.lang.Integer etc. allways represents a primitive type * Fixed ClassLoader bugs in InvocationInterceptor * Support for virtual calls in InvocationInterceptor. 2004-03-22 Mika Riekkinen <mcr70@snowhite.dungeon> * Added support for unwrapping of primitive types from method return values * Support for multiple arguments in invocation handlers. 2004-03-21 Mika Riekkinen <mcr70@snowhite.dungeon> * Introduced Jiapi interceptors 2004-03-15 Mika Riekkinen <mcr70@snowhite.dungeon> * Refactored instrumentation framework. Now all the chain stuff resides in alt.jiapi.instrumentor package. alt.jiapi package binds together ctx, descriptor, classloader ant Instrumentor interface. This interface has one method: public void instrument(JiapiClass clazz); After this refactoring, we are not forced into using one model for higher level instrumentation. alt.jiapi.instrumentor is from now on just one possible instrumentation framework. In future, we miht create something totally different. Or someone else might create his/her own framework, which suits better for particular needs. * Release 0.1.1 * Added code to keep exception table in sync, when instrumenting code. 2004-03-14 Mika Riekkinen <mcr70@snowhite.dungeon> * Added code to keep line-number table in sync, when instrumenting code. Stack traces are now printed correctly, even if there is some instrumentation screwing ln-table offsets. * Release 0.1 2004-03-13 Mika Riekkinen <mcr70@snowhite.dungeon> * Added verbose mode to Javap. Fine tuned output of Javap * JiapiClass.getClassFile() --> JiapiClass.getConstantPool() Changed this, because exposing ClassFile in public APIs could break the whole reflection package. 2004-03-10 Mika Riekkinen <mcr70@snowhite.dungeon> * jiapi-events.sh * BranchInstruction, Invocation, CPInstruction, SwitchInstruction 2004-02-22 Mika Riekkinen <mcr70@snowhite.dungeon> * Using alt.jiapi.file package instead of BCEL * Moved Instruction(Factory/List) to alt.jiapi.reflect package. * new package: alt.jiapi.file 2004-02-10 Mika Riekkinen <mcr70@snowhite.dungeon> * Started Jiapi2 project. First thing to do, is to get rid of dependent libraries. 2002-06-18 Mika Riekkinen <mcr70@linux.local> * Fixed constant pool index bugs in get/setField in InstructionFactory 2002-06-05 Joni Suominen <inhuman@iki.fi> * ProviderFactory: Removed provider factory concept. * JiapiClass: getMethod and getField methods are now renamed as getDeclaredMethod and getDeclaredField respectively. This is more in par with Java Reflection API. New getMethod and getField methods are implemented. They examine the superclasses too. 2002-06-04 Mika Riekkinen <mcr70@linux.local> * Removed JikesBT code * Moved alt.bcel.jiapi.BCEL* classes to alt.jiapi.reflect package. 2002-06-02 Joni Suominen <inhuman@moeob063> * InstructionFactory: Instructions are now generated at alt.jiapi.reflect.instruction.InstructionFactory instead of utilizing provider (e.g. BCEL). The reason for this was difficulties to map our InstructionList concept properly with BCEL provider. As a consequence the whole SPI concept will be removed. BCEL will be still used to parse the bytecode, to manipulate constant pool and to marshall the bytecode. 2002-05-31 Joni Suominen <inhuman@iki.fi> * Switch: Added a new inner class for Branch. This inner class is used to implement TABLESWITCH and LOOKUPSWITCH instructions. 2002-05-30 Mika Riekkinen <mcr70@linux.local> * Changed InstructionFactory from being an interface to an abstract class. Moved most of the methods from BCELInstructionFactory to InstructionFactory 2002-05-29 Mika Riekkinen <mcr70@linux.local> * Added jiapi.sh for bootstrapping Jiapi from command line. * Changed ExceptionTable handling. It's now done internally while mofifying classes. 2002-05-09 Mika Riekkinen <mcr70@linux.local> * Changed some of the return types in InstructionFactory from InstructionList to AbstractInstruction. 2002-05-05 Joni Suominen <inhuman@moeob063> * InstrumentorChain: Changed the way the chain is dispatched. The old way was to loop over all methods in a class and call chain for each method. This block of code is now moved to MethodDispatcherInstrumentor and the chain is started just by setting the currentClass, the InstructionList passed will be null. 2002-05-03 Joni Suominen <inhuman@moeob063> * instruction-refactoring: Merged instruction-refactoring branch to main branch. There's a new subpackage alt.jiapi.reflect.instruction which includes abstractions for instructions. * InstructionFactory: Renamed most of the methods. They now follow a more consistent naming convention. Removed also some of the methods which accepted java.lang.reflect types. 2002-05-03 Mika Riekkinen <mcr70@linux.local> * Added new instrumentor: ChangeReferenceInstrumentor. Added set methods for FieldAccess & Invocation. 2002-04-19 Joni Suominen <inhuman@moeob063> * InstructionList: Changed API to use AbstractInstruction instead of Instruction. The biggest change is that 'addAll' is replaced by a more generic 'add' method. 2002-04-19 Mika Riekkinen <mcr70@linux.local> * Moved opcodes from class Instruction to new interface Opcodes. interface OpcodeGroups contains groupings of opcodes. * Added AbstractInstruction. Changed extend/implement stuff accordingly. * Converted short to byte, when it comes to opcodes. * Added Constant instruction. 2002-04-16 Mika Riekkinen <mcr70@linux.local> * Added FieldAcces instruction. * Moved alt.jiapi.reflect.Instruction* to alt.jiapi.reflect.instruction package. Removed concept of Operand. Introduced first higher level instruction: Invocation. Instruction and its derivatives are now interfaces, thus giving provider all the freedom to choose an implementation model it sees fit. 2002-04-09 Joni Suominen <inhuman@moeob063> * Bootstrapping: Made a utility which can be used to bootstrap an application written on top of Jiapi framework. This utility can be found from alt.jiapi.util.Bootstrapper. As a consequence InstrumentingClassLoader was also moved to util package and alt.jiapi.util.Launcher was removed. 2002-04-05 Mika Riekkinen <mcr70@linux.local> * Support for changing modifiers of the JiapiField * JiapiFields cannot be instantiated directly. They behave like JiapiMethods. That is, through JiapiClass. 2002-04-05 Joni Suominen <inhuman@iki.fi> * Loader.loadClass: Changed code to use Loader.loadClass instead of ProviderFactory.createClass. ProviderFactory.createClass methods should be removed later. 2002-04-04 Mika Riekkinen <mcr70@linux.local> * Loader moved to package alt.jiapi.reflect * Added addMethod(int, String, String, String[]), which uses simple form of parameters. I.e. no signatures. * Finished with getMethod(String,String[]). Moved alt.jiapi.Loader to alt.jiapi.reflect.Loader. Context now has instrument() method. 2002-04-03 Joni Suominen <inhuman@moeob063> * LocalVariable: Added a support to add local variables. 2002-04-02 Mika Riekkinen <mcr70@linux.local> * added JiapiClass.getSuperclass(); JiapiField.getDeclaringClass(); JiapiMethod.getDeclaringClass(); 2002-03-28 Mika Riekkinen <mcr70@linux.local> * Changed Instruction.getOperand() from abstract to non- abstract. * Removed getReturnTypeSize() from JiapiMethod * -Ddump=... specifies now a directory, instead of a file. 2002-03-26 Mika Riekkinen <mcr70@linux.local> * Added protection mechanism for event loops. 2002-03-21 Mika Riekkinen <mcr70@linux.local> * MethodCallInstrumentor added field assignment to the end of <clinit>. If there were a try-catch block at the end before field assignment, Exception table was not updated to reflect new instructions. Fixed this so, that field assignment is done before any instructions in <clinit>. Bug #????? closed :-) * pre/post instrumentation was is done only once / JiapiClass. * Fixed a bug in JiapiEvent.toString(). This bug caused a recursion. When converting to String, we used sourceObject.toString(), which was at some cases instrumented, which caused an event, toString(), event, toString().... * Changed how Rule replaces characters. That fixed anonymous/inner class bug, which had crawled back to haunt us. 2002-03-19 Joni Suominen <inhuman@iki.fi> * alt.jiapi.reflect: Renamed alt.jiapi.spi package as alt.jiapi.reflect. 2002-03-12 Joni Suominen <inhuman@moeob063> * new-framework Merged new-framework branch to main branch. It contains too numerous changes to mention here. Summary: In previous framework instrumentation components were assembled from an 'instrumentor' and 'patch'. These were 'binded' together as a pair. In a new framework all components are 'instrumentors' and they are 'chained' together as a pipe. A good analogy is Unix command line were simple applications can be piped together. 2002-02-27 Joni Suominen <inhuman@moeob063> * InstructionFactory: Moved instruction factory methods from InstructionList to a new class. 2002-02-22 Mika Riekkinen <mcr70@linux.local> * Added Field events to event model. Minor changes in event model. 2002-02-18 Mika Riekkinen <mcr70@linux.local> * Changed event model slightly. 'this' gets passed to JiapiEvent from method being called. On static methods 'nameOfTheClass' is passed instead of 'this'. 2002-02-11 Mika Riekkinen <mcr70@linux.local> * Added FieldGet/SetInstrumentors * BCELJiapiClass Fixed default method addition. Max locals was not set. 2002-02-11 Joni Suominen <inhuman@moeob063> * BCEL provider: Upgraded from BCEL 4.4.0 to 5.0. * InstructionList: Removed getInstructions method. * JiapiClass: Removed 'doInit' and 'doPostDefine' lifecycle methods. * Rule: Renamed 'significance' as 'precedence'. 2002-02-10 Joni Suominen <inhuman@moeob063> * InstructionList: Added an inner class which provides a view on an InstructionList. Unlike Java Collection API's subList, this implementation allows structural changes for the list regardless of where the modification is made from (original list or one of its views). Some issues still remain: - the current iterators do not fail fast like in Collection API - the instruction factory methods must be removed somewhere or they have to implemented other way around - there's one extremely dangerous method: getInstructions which exposes the internal data structure to the client, this must be removed since the InstructionList will get screwed up if modifications are done through the exposed List - needs more testing, there's only some basic Junit tests 2002-02-06 Mika Riekkinen <mcr70@linux.local> * Added initial versions of CatchInstrumentor and TryBlockInstrumentor. 2002-02-04 Joni Suominen <inhuman@moeob063> * InstrumentationContext: Renamed createLoader as getLoader and changed it so that it no longer creates a new instance every time. 2002-02-04 Mika Riekkinen <mcr70@linux.local> * Bug number 482028 closed. Due to change of design in field initialization, this bug is no longer valid. * Added MethodCallInstrumentor. 2002-02-03 Joni Suominen <inhuman@moeob063> * CopyPatch: A new patch which can be used to copy instructions from one class to another. * JiapiClass: Renamed createMethod-methods as addMethod. Implemented addition of empty body as a default and added a new method getMethod(String, Class[]) to get a specific method from a class. 2002-02-01 Mika Riekkinen <mcr70@linux.local> * Added naive implementation of method resolution. At the moment, methods are compared only by their names, like 'getName matches get*' 2002-01-28 Joni Suominen <inhuman@moeob063> * Loader: Splitted the loading of a class and instrumenting a class. They are now accomplished with separate methods. It is still unclear where the instrumentation part should go. A potential candidate is InstrumentationContext. * Loader, ProviderFactory: loadClass methods throw a ClassNotFoundException if the class can't be located. 2002-01-23 Mika Riekkinen <mcr70@linux.local> * Added log4j. Jiapi won't compile wothout it anymore. 2002-01-16 Joni Suominen <inhuman@moeob063> * MethodCallPatch: Reimplemented dynamic calls using static initializer. The implementation takes advantage of various new instrumentors and patches (CreateMethodInstrumentor, CreateFieldInstrumentor, FieldInitializerPatch) + Runtime class. The new implementation adds these helper instrumentations in its init method to the InstrumentationDescriptor. 2002-01-14 Mika Riekkinen <mcr70@linux.local> * Support for adding methods. Code regarding to this is ugly, lot's of bugs and hardcodings. But it works. 2002-01-13 Joni Suominen <inhuman@moeob063> * Instrumentation: Added a new abstraction which replaces previous "binding" concept. The role of Instrumentation is to group an Instrumentor and Patch as a component to be used in instrumentation. It also helps in implementing a new important concept where Instrumentors and Patches can create and add other Instrumentations to an InstrumentationDescriptor. * UML: Created a class diagram for core Jiapi framework. 2002-01-11 Mika Riekkinen <mcr70@linux.local> * Added MethodInstrumentor; It is a base class for all the Instrumentors, that deal with methods. Idea is to have a ClassInstrumentor also, that deals with class level things like adding fields/methods. 2002-01-09 Joni Suominen <inhuman@moeob063> * InstructionList: The provider implementation is now more loosly coupled with service provider interface. alt.jiapi.InstructionList has much more freedom to manipulate its instructions. It is a responsibility of service provider implementation to synchronize the modified InstructionList with the original InstructionList in JiapiClass#doPreDefine method. 2002-01-06 Joni Suominen <inhuman@moeob063> * InstrumentingClassLoader: The previous version of InstrumentingClassLoader completely by passed the Java security framework. The new version fixes this. As a consequence it is now subclassed from URLClassLoader and it has to be created using a factory method: InstrumentingClassLoader.createClassLoader. 2002-01-03 Joni Suominen <inhuman@moeob063> * spi-polish-branch: Merged to main branch. 2002-01-02 Joni Suominen <inhuman@moeob063> * JUnit: Started to use JUnit 3.7 for unit testing. The root level test suite can be found from src/test/alt/jiapi/AllTests. The test packages match with the package of tested class. Arranging it this way it is possible to also test package protected classes and methods. * InstrumentationDescriptor: Added regexps to inclusion and exclusion rules. There's a new internal class called alt.jiapi.Rule which does most of the work. The class alt.jiapi.RuleMap is not needed anymore and is removed now. 2001-12-30 Mika Riekkinen <mcr70@linux.local> * InstructionList : Added method 'List instructions()' which return the List of instructions stored. Iterator might throw ConcurrentModificationException, if iterating and modifying the InstructionList at the same time. * MethodExitInstrumentor.instrument(...) : Code wrongly assumed, that return instruction ath the end of method is the only return instruction in a method. Now it loops through each instruction and checks for the return variants. * BCELInstructionList.addAll(...) : BCEL InstructionList.insert(...) consumes its parameter list. I.e. it becomes empty. Fixed so, that it will take a deep-copy of the parameter list before inserting.