📄 typeframemodelingvisitor.java
字号:
} @Override public void visitFCMPG(FCMPG obj) { consumeStack(obj); pushValue(Type.INT); } @Override public void visitDCMPL(DCMPL obj) { consumeStack(obj); pushValue(Type.INT); } @Override public void visitDCMPG(DCMPG obj) { consumeStack(obj); pushValue(Type.INT); } @Override public void visitLCMP(LCMP obj) { consumeStack(obj); pushValue(Type.INT); } @Override public void visitD2F(D2F obj) { consumeStack(obj); pushValue(Type.FLOAT); } @Override public void visitD2I(D2I obj) { consumeStack(obj); pushValue(Type.INT); } @Override public void visitD2L(D2L obj) { consumeStack(obj); pushValue(Type.LONG); } @Override public void visitF2D(F2D obj) { consumeStack(obj); pushValue(Type.DOUBLE); } @Override public void visitF2I(F2I obj) { consumeStack(obj); pushValue(Type.INT); } @Override public void visitF2L(F2L obj) { consumeStack(obj); pushValue(Type.LONG); } @Override public void visitI2B(I2B obj) { consumeStack(obj); pushValue(Type.BYTE); } @Override public void visitI2C(I2C obj) { consumeStack(obj); pushValue(Type.CHAR); } @Override public void visitI2D(I2D obj) { consumeStack(obj); pushValue(Type.DOUBLE); } @Override public void visitI2F(I2F obj) { consumeStack(obj); pushValue(Type.FLOAT); } @Override public void visitI2L(I2L obj) { consumeStack(obj); pushValue(Type.LONG); } @Override public void visitI2S(I2S obj) { } // no change @Override public void visitL2D(L2D obj) { consumeStack(obj); pushValue(Type.DOUBLE); } @Override public void visitL2F(L2F obj) { consumeStack(obj); pushValue(Type.FLOAT); } @Override public void visitL2I(L2I obj) { consumeStack(obj); pushValue(Type.INT); } @Override public void visitIAND(IAND obj) { consumeStack(obj); pushValue(Type.INT); } @Override public void visitLAND(LAND obj) { consumeStack(obj); pushValue(Type.LONG); } @Override public void visitIOR(IOR obj) { consumeStack(obj); pushValue(Type.INT); } @Override public void visitLOR(LOR obj) { consumeStack(obj); pushValue(Type.LONG); } @Override public void visitIXOR(IXOR obj) { consumeStack(obj); pushValue(Type.INT); } @Override public void visitLXOR(LXOR obj) { consumeStack(obj); pushValue(Type.LONG); } @Override public void visitISHR(ISHR obj) { consumeStack(obj); pushValue(Type.INT); } @Override public void visitIUSHR(IUSHR obj) { consumeStack(obj); pushValue(Type.INT); } @Override public void visitLSHR(LSHR obj) { consumeStack(obj); pushValue(Type.LONG); } @Override public void visitLUSHR(LUSHR obj) { consumeStack(obj); pushValue(Type.LONG); } @Override public void visitISHL(ISHL obj) { consumeStack(obj); pushValue(Type.INT); } @Override public void visitLSHL(LSHL obj) { consumeStack(obj); pushValue(Type.LONG); } @Override public void visitDADD(DADD obj) { consumeStack(obj); pushValue(Type.DOUBLE); } @Override public void visitFADD(FADD obj) { consumeStack(obj); pushValue(Type.FLOAT); } @Override public void visitIADD(IADD obj) { consumeStack(obj); pushValue(Type.INT); } @Override public void visitLADD(LADD obj) { consumeStack(obj); pushValue(Type.LONG); } @Override public void visitDSUB(DSUB obj) { consumeStack(obj); pushValue(Type.DOUBLE); } @Override public void visitFSUB(FSUB obj) { consumeStack(obj); pushValue(Type.FLOAT); } @Override public void visitISUB(ISUB obj) { consumeStack(obj); pushValue(Type.INT); } @Override public void visitLSUB(LSUB obj) { consumeStack(obj); pushValue(Type.LONG); } @Override public void visitDMUL(DMUL obj) { consumeStack(obj); pushValue(Type.DOUBLE); } @Override public void visitFMUL(FMUL obj) { consumeStack(obj); pushValue(Type.FLOAT); } @Override public void visitIMUL(IMUL obj) { consumeStack(obj); pushValue(Type.INT); } @Override public void visitLMUL(LMUL obj) { consumeStack(obj); pushValue(Type.LONG); } @Override public void visitDDIV(DDIV obj) { consumeStack(obj); pushValue(Type.DOUBLE); } @Override public void visitFDIV(FDIV obj) { consumeStack(obj); pushValue(Type.FLOAT); } @Override public void visitIDIV(IDIV obj) { consumeStack(obj); pushValue(Type.INT); } @Override public void visitLDIV(LDIV obj) { consumeStack(obj); pushValue(Type.LONG); } @Override public void visitDREM(DREM obj) { consumeStack(obj); pushValue(Type.DOUBLE); } @Override public void visitFREM(FREM obj) { consumeStack(obj); pushValue(Type.FLOAT); } @Override public void visitIREM(IREM obj) { consumeStack(obj); pushValue(Type.INT); } @Override public void visitLREM(LREM obj) { consumeStack(obj); pushValue(Type.LONG); } @Override public void visitIINC(IINC obj) { } // no change to types of stack or locals @Override public void visitDNEG(DNEG obj) { } // no change @Override public void visitFNEG(FNEG obj) { } // no change @Override public void visitINEG(INEG obj) { consumeStack(obj); pushValue(Type.INT); } @Override public void visitLNEG(LNEG obj) { } // no change @Override public void visitARRAYLENGTH(ARRAYLENGTH obj) { consumeStack(obj); pushValue(Type.INT); } @Override public void visitAALOAD(AALOAD obj) { // To determine the type pushed on the stack, // we look at the type of the array reference which was // popped off of the stack. TypeFrame frame = getFrame(); try { frame.popValue(); // index Type arrayType = frame.popValue(); // arrayref if (arrayType instanceof ArrayType) { ArrayType arr = (ArrayType) arrayType; pushValue(arr.getElementType()); } else { pushValue(TypeFrame.getBottomType()); } } catch (DataflowAnalysisException e) { throw new InvalidBytecodeException("Stack underflow: " + e.getMessage()); } } @Override public void visitBALOAD(BALOAD obj) { consumeStack(obj); pushValue(Type.BYTE); } @Override public void visitCALOAD(CALOAD obj) { consumeStack(obj); pushValue(Type.CHAR); } @Override public void visitDALOAD(DALOAD obj) { consumeStack(obj); pushValue(Type.DOUBLE); } @Override public void visitFALOAD(FALOAD obj) { consumeStack(obj); pushValue(Type.FLOAT); } @Override public void visitIALOAD(IALOAD obj) { consumeStack(obj); pushValue(Type.INT); } @Override public void visitLALOAD(LALOAD obj) { consumeStack(obj); pushValue(Type.LONG); } @Override public void visitSALOAD(SALOAD obj) { consumeStack(obj); pushValue(Type.SHORT); } // The various xASTORE instructions only consume stack. @Override public void visitNEW(NEW obj) { // FIXME: type is technically "uninitialized" // However, we don't model that yet. pushValue(obj.getType(getCPG())); // We now have an exact type for this value. setTopOfStackIsExact(); } @Override public void visitNEWARRAY(NEWARRAY obj) { consumeStack(obj); Type elementType = obj.getType(); pushValue(elementType); // We now have an exact type for this value. setTopOfStackIsExact(); } @Override public void visitANEWARRAY(ANEWARRAY obj) { consumeStack(obj); Type elementType = obj.getType(getCPG()); pushValue(new ArrayType(elementType, 1)); // We now have an exact type for this value. setTopOfStackIsExact(); } @Override public void visitMULTIANEWARRAY(MULTIANEWARRAY obj) { consumeStack(obj); Type elementType = obj.getType(getCPG()); pushValue(elementType); // We now have an exact type for this value. setTopOfStackIsExact(); } private void setTopOfStackIsExact() { TypeFrame frame = getFrame(); frame.setExact(frame.getNumSlots() - 1, true); } @Override public void visitJSR(JSR obj) { pushValue(ReturnaddressType.NO_TARGET); } @Override public void visitJSR_W(JSR_W obj) { pushValue(ReturnaddressType.NO_TARGET); } @Override public void visitRET(RET obj) { } // no change @Override public void visitIFEQ(IFEQ obj) { if (lastOpcode == Constants.INSTANCEOF) instanceOfFollowedByBranch = true; super.visitIFEQ(obj); } @Override public void visitIFGT(IFGT obj) { if (lastOpcode == Constants.INSTANCEOF) instanceOfFollowedByBranch = true; super.visitIFGT(obj); } @Override public void visitIFLE(IFLE obj) { if (lastOpcode == Constants.INSTANCEOF) instanceOfFollowedByBranch = true; super.visitIFLE(obj); } @Override public void visitIFNE(IFNE obj) { if (lastOpcode == Constants.INSTANCEOF) instanceOfFollowedByBranch = true; super.visitIFNE(obj); }}// vim:ts=4
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -