VRL icon indicating copy to clipboard operation
VRL copied to clipboard

Model based instrumentation

Open miho opened this issue 10 years ago • 5 comments

Instead of a Groovy based transform we need a model based instrumentation in the future to ensure that instrumentation also works for other (potential) language bindings. Instead of a special utility method the idea is to directly insert pre/post events into the source.

Example 1:

int a;
a=2;

will be transformed to something like:

preEvent("declare a");
int a;
postEvent("declare a");
preEvent("assign a");
a=2;
postEvent("assign a");

For chained invocations and operators we need to introduce additional tmp-variables:

Example 2:

if(a < b) {
  //
}

will be transformed to something like:

preEvent("LESS Operator");
boolean __vrl__tmpVar_1 = a < b;
postEvent("LESS Operator");
preEvent("if");
if(__vrl__tmpVar_1) {
  //
}
postEvent("if");

We will also need to introduce a mapping between events and visual nodes to use the instrumentation from the ui.

Loops:

Loops need special treatment:

while(a<b){
  //
}

will be transformed to:

boolean __vrl_tmpVar_1 = true;
while(true) {
  preEvent("LESS Operator");
  __vrl_tmpVar_1 = a < b;
  postEvent("LESS Operator");
  if(!__vrl_tmpVar_1) break;
  //
}

For complex condition arguments we need to extract the whole invocation chain and move it into the while loop.

miho avatar Aug 04 '15 08:08 miho

The current implementation only inserts one invocation into the loop. Chained or nested invocations are left outside of the loop.

miho avatar Aug 04 '15 18:08 miho

To improve the current instrumentation implementation we should introduce a clean event api that can publish events to registered observers without changing the instrumented code. Therefore, we should add an API like the previously, Groovy specific VRLInstrumentationUtilclass and

static void VRLInstrumentationUtil.__preEvent(...)
static void VRLInstrumentationUtil.__postEvent(...)

and ideally invocation generators that generate the static method calls in the corresponding model:

static void VRLInstrumentationUtil.generatePreEvent(...)
static void VRLInstrumentationUtil.generatePostEvent(...)

miho avatar Aug 07 '15 15:08 miho

Basic CSG instrumentation works!

vrl-0 5-first-working-version-with-3d-02

miho avatar Aug 10 '15 17:08 miho

another example:

screenshot 2015-08-10 20 01 43

miho avatar Aug 10 '15 18:08 miho

Event generation for return statements has a bug (no event can be fired after returning from a method).

Example:

        __vrl_reserved_intermediate_var_6);
        VRLInstrumentationUtil.__preEvent("14", "return", 
        __vrl_reserved_intermediate_var_6);
        return __vrl_reserved_intermediate_var_6;
        VRLInstrumentationUtil.__postEvent("14", "return");
    }

Therefore, we need to swap the return statement invocation and its post-event invocation:

        __vrl_reserved_intermediate_var_6);
        VRLInstrumentationUtil.__preEvent("14", "return", 
        __vrl_reserved_intermediate_var_6);
        VRLInstrumentationUtil.__postEvent("14", "return");
        return __vrl_reserved_intermediate_var_6;
    }

The same applies to continue and break.

miho avatar Aug 20 '15 18:08 miho