// The instruction at which this local variable has been created
Integer pc = localVariableAttribute.startPc(i);
// Move to the next instruction (insertionPc)
CodeIterator iterator = codeAttribute.iterator();
iterator.move(pc);
Integer insertionPc = iterator.next();
Javac jv = new Javac(ctClass);
// Compile the code snippet
jv.recordLocalVariables(codeAttribute, insertionPc);
jv.recordParams(method.getParameterTypes(), Modifier.isStatic(method.getModifiers()));
jv.setMaxLocals(codeAttribute.getMaxLocals());
jv.compileStmnt("play.classloading.enhancers.LocalvariablesNamesEnhancer.LocalVariablesNamesTracer.addVariable(\"" + aliasedName + "\", " + name + ");");
Bytecode b = jv.getBytecode();
int locals = b.getMaxLocals();
int stack = b.getMaxStack();
codeAttribute.setMaxLocals(locals);
if (stack > codeAttribute.getMaxStack()) {
codeAttribute.setMaxStack(stack);
}
iterator.insert(insertionPc, b.get());
iterator.insert(b.getExceptionTable(), insertionPc);
// Then we need to trace each affectation to the variable
CodeIterator codeIterator = codeAttribute.iterator();
// Bon chaque instruction de cette méthode
while (codeIterator.hasNext()) {
int index = codeIterator.next();
int op = codeIterator.byteAt(index);
// DEBUG
// printOp(op);
int varNumber = -1;
// The variable changes
if (storeByCode.containsKey(op)) {
varNumber = storeByCode.get(op);
if (varNumber == -2) {
varNumber = codeIterator.byteAt(index + 1);
}
}
// Si c'est un store de la variable en cours d'examination
// et que c'est dans la frame d'utilisation de cette variable on trace l'affectation.
// (en fait la frame commence à localVariableAttribute.startPc(i)-1 qui est la première affectation
// mais aussi l'initialisation de la variable qui est deja tracé plus haut, donc on commence à localVariableAttribute.startPc(i))
if (varNumber == localVariableAttribute.index(i) && index >= localVariableAttribute.startPc(i) && index < localVariableAttribute.startPc(i) + localVariableAttribute.codeLength(i)) {
jv.compileStmnt("play.classloading.enhancers.LocalvariablesNamesEnhancer.LocalVariablesNamesTracer.addVariable(\"" + aliasedName + "\", " + name + ");");
b = jv.getBytecode();
locals = b.getMaxLocals();
stack = b.getMaxStack();
codeAttribute.setMaxLocals(locals);
if (stack > codeAttribute.getMaxStack()) {
codeAttribute.setMaxStack(stack);
}
codeIterator.insert(b.get());
}
}