1.visitConstant
其中,machine.popArgs
@BaseMachine.java
public final void popArgs(Frame frame, int count) {
ExecutionStack stack = frame.getStack();
clearArgs();
if (count > args.length) {
// Grow args, and add a little extra room to grow even more.
args = new TypeBearer[count + 10];
}
for (int i = count - 1; i >= 0; i--) {
args[i] = stack.pop();
}
argCount = count;
}
machine.clearArgs
public final void clearArgs() {
argCount = 0;
auxType = null;
auxInt = 0;
auxCst = null;
auxTarget = 0;
auxCases = null;
auxInitValues = null;
localIndex = -1;
localTarget = null;
resultCount = -1;
}
2.simulator 定义在 Ropper的构造里
this.machine = new RopperMachine(this, method, advice);
this.sim = new Simulator(machine, method);
machine是RopperMachine类型的
3.processMethod 中
RopMethod rmeth = Ropper.convert(concrete, advice);
其中
Ropper r = new Ropper(method, advice); //以上2. 中 有提到
r.doit();
return r.getRopMethod();
4. r.doit();
其中,processBlock@Ropper.java
再其中, sim.simulate(block, frame);
5.frame
Ropper构造中
this.startFrames = new Frame[maxLabel];
。。。。。。
startFrames[0] = new Frame(maxLocals, method.getMaxStack());
Frame构造
public Frame(int maxLocals, int maxStack) {
this(new OneLocalsArray(maxLocals), new ExecutionStack(maxStack));
}
所以,Frame中的locals的方法在OneLocalsArray中;stack的方法在ExecutionStack中实现
6.回到正题:vistiXXX等。。。。。。
visitConstant中:
machine.auxIntArg(value);
machine.auxCstArg(cst);
machine.run(frame, offset, opcode);
其中 machine.run比较长
6-1,其中 int stackPointer = maxLocals + frame.getStack().size();
(1)maxLocals
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
maxLocals:
追本溯源, Ropper构造中 machine
this.machine = new RopperMachine(this, method, advice); --> this.maxLocals = method.getMaxLocals();---> return attCode.getMaxLocals();
---> return maxLocals; @AttCode.java
maxLocals在何处赋值:
processMethods中的ConcreteMethod构造 内
AttributeList attribs = method.getAttributes();
this.attCode = (AttCode) attribs.findFirst(AttCode.ATTRIBUTE_NAME);
AttributeList codeAttribs = attCode.getAttributes();
>>>>>>>>>>>>>>>>>>>>>>>>>>>在 private AttCode code(。。。)@ StdAttributeFactory.java 有 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
往前找啊找,发现translate0@CfTranslator.java中
DirectClassFile cf =
new DirectClassFile(bytes, filePath, args.strictNameCheck);
cf.setAttributeFactory(StdAttributeFactory.THE_ONE);
cf.getMagic();
cf中 attributeFactory为StdAttributeFactory ,从cf.getMagic--->parseToInterfacesIfNecessary--->parse--->parse0@DirectClassFile.java (即cf) ,其中
MethodListParser mlParser =
new MethodListParser(this, thisClass, at, attributeFactory);
mlParser.setObserver(observer);
methods = mlParser.getList();
at = mlParser.getEndOffset();
此处的attributeFactory为StdAttributeFactoty
mlParser.getList ---> parseIfNecessary ---> parse @MethodListParser.java
AttributeListParser parser =
new AttributeListParser(cf, attributeContext, at,
attributeFactory);
parser.setObserver(observer);
at = parser.getEndOffset();
StdAttributeList attributes = parser.getList();
其中 parser.getList -->parseIfNecessary--->parse @ AttributeListParser.java
Attribute attrib =
attributeFactory.parse(cf, context, at, observer);
由于public class StdAttributeFactory extends AttributeFactory , parse@Attribute.java --->parse0 @ StdAttributeFactory 其中有调到 code方法
maxLocal 找到了
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
回到machine.run @ RopperMachine.java
(2) stack 以上 5中有提到,此处略重复
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Ropper构造中有
this.startFrames = new Frame[maxLabel];
。。。。。。
startFrames[0] = new Frame(maxLocals, method.getMaxStack());
Frame构造
public Frame(int maxLocals, int maxStack) {
this(new OneLocalsArray(maxLocals), new ExecutionStack(maxStack));
}
所以,Frame中的locals的方法在OneLocalsArray中;stack的方法在ExecutionStack中实现
r.doit中 setFirstFrame() 其中 startFrames[0].initializeWithParameters(desc.getParameterTypes());