Simulator.java中 visitXXX方法---流水记录

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());








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值