On Feb 16, 2012, at 8:43 PM, Mark Roos wrote:
> The key code is below and it shows the power of methodHandles is ways one may
> not expect. And it
> added almost nothing to the run time ( maybe a few %). It inserts itself
> into each callsite target and
> collect entry and exit data.
Nice!
As a bonus, your profile points are given a chance to modify the arguments and
return value.
If you don't want to pass the arguments and return value, you can use a
void-returning combiner with foldArguments (instead of filterArguments). The
combiner will "see" the arguments and then "return nothing", allowing the
invoker to continue as before.
A different use of foldArguments would also let you pass both the original
arguments and the return value to the profileExit routine, so it could see the
whole call. Something like this:
invoker = {spreader which takes standard RtObject[] array};
profileExit = {method of type (RtCallSite, RtObject, RtObject[]) =>
RtObject};
profileExit = insertArguments(profileExit, 0, thisCallSite); // (RtObject,
RtObject[]) => RtObject
invoker = foldArguments(profileExit, invoker); // note that invoker serves
as *combiner*
// add entry profiling last, so that profileExit will see (possibly)
transformed arguments:
profileEntry = {method of type (RtCallSite, RtObject[]) => RtObject[]};
profileEntry = insertArguments(0, thisCallSite); // (RtObject[]) =>
RtObject[]
invoker = filterArguments(invoker, profileEntry);
You could also interpose on abnormal termination (exceptions), using
guardWithCatch.
A relatively simple way to do take full control of traced calls is to delegate
the actual calling to the profile routine, but this might (presently) hurt
performance, since it will make all calls go through one hot point,
profileWrapper:
invoker = {spreader which takes standard RtObject[] array};
profileWrapper = {method of type (RTCallSite, MethodHandle, RtObject[]) =>
RtObject};
// wrapped call will execute this: profileWrapper(thisCallSite,
unwrappedInvoker, arg...)
invoker = insertArguments(profileWrapper, 0, thisCallSite, invoker);
I'm glad you are enjoying the toolkit!
-- John
_______________________________________________
mlvm-dev mailing list
[email protected]
http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev