java - How to get the values on operand stack which the JVM instruction operates on with Javassist? -


javassist provides codeiterator editing code attribute, can used transverse instructions in method.

for jvm instruction, follows specification: mnemonic operand1 operand2 ... different binary assembly, stack-based jvm instructions takes value on operand stack. take ifge example. instruction has following format if<cond> branchbyte1 branchbyte2 ifge succeeds if , if value on stack ≥ 0, branchbyte1 , branchbyte2 targets of jump.

my question is, can value on operand stack using javassist?

the answer javassist.bytecode.analysis module. according jvm specification, frame used store data , partial results. each frame has own array of local variables, own operand stack, , reference run-time const pool.

in javassist.bytecode.analysis.frameprinter, funciton print shows how print each frame @ each instruction.

/**  * prints instructions , frame states of given method.  */ public void print(ctmethod method) {     stream.println("\n" + getmethodstring(method));     methodinfo info = method.getmethodinfo2();     constpool pool = info.getconstpool();     codeattribute code = info.getcodeattribute();     if (code == null)         return;      frame[] frames;     try {         frames = (new analyzer()).analyze(method.getdeclaringclass(), info);     } catch (badbytecode e) {         throw new runtimeexception(e);     }      int spacing = string.valueof(code.getcodelength()).length();      codeiterator iterator = code.iterator();     while (iterator.hasnext()) {         int pos;         try {             pos = iterator.next();         } catch (badbytecode e) {             throw new runtimeexception(e);         }          stream.println(pos + ": " + instructionprinter.instructionstring(iterator, pos, pool));          addspacing(spacing + 3);         frame frame = frames[pos];         if (frame == null) {             stream.println("--dead code--");             continue;         }         printstack(frame);          addspacing(spacing + 3);         printlocals(frame);     }  } 

from code, can see:

the frames can acquired frames = (new analyzer()).analyze(method.getdeclaringclass(), info);

as values each instruction uses, should treat differently according specification of instruction.


Comments

Popular posts from this blog

ios - MKAnnotationView layer is not of expected type: MKLayer -

ZeroMQ on Windows, with Qt Creator -

unity3d - Unity SceneManager.LoadScene quits application -