1 package com.sun.org.apache.bcel.internal.verifier.structurals; 2 3 56 57 import com.sun.org.apache.bcel.internal.Constants; 58 import com.sun.org.apache.bcel.internal.Repository; 59 import com.sun.org.apache.bcel.internal.generic.*; 60 import com.sun.org.apache.bcel.internal.classfile.JavaClass; 61 import com.sun.org.apache.bcel.internal.classfile.Constant; 62 import com.sun.org.apache.bcel.internal.classfile.ConstantDouble; 63 import com.sun.org.apache.bcel.internal.classfile.ConstantFloat; 64 import com.sun.org.apache.bcel.internal.classfile.ConstantInteger; 65 import com.sun.org.apache.bcel.internal.classfile.ConstantLong; 66 import com.sun.org.apache.bcel.internal.classfile.ConstantString; 67 import com.sun.org.apache.bcel.internal.verifier.Verifier; 68 import com.sun.org.apache.bcel.internal.verifier.exc.*; 69 import java.util.ArrayList ; 70 import java.util.Hashtable ; 71 72 100 public class ExecutionVisitor extends EmptyVisitor implements Visitor{ 101 102 105 private Frame frame = null; 106 107 111 private ConstantPoolGen cpg = null; 112 113 116 public ExecutionVisitor(){} 117 118 122 private OperandStack stack(){ 123 return frame.getStack(); 124 } 125 126 130 private LocalVariables locals(){ 131 return frame.getLocals(); 132 } 133 134 137 public void setConstantPoolGen(ConstantPoolGen cpg){ 138 this.cpg = cpg; 139 } 140 141 147 public void setFrame(Frame f){ 148 this.frame = f; 149 } 150 151 161 162 public void visitAALOAD(AALOAD o){ 163 stack().pop(); Type t = stack().pop(); if (t == Type.NULL){ 167 stack().push(Type.NULL); 168 } else{ 170 ArrayType at = (ArrayType) t; 171 stack().push(at.getElementType()); 172 } 173 } 174 175 public void visitAASTORE(AASTORE o){ 176 stack().pop(); 177 stack().pop(); 178 stack().pop(); 179 } 180 181 public void visitACONST_NULL(ACONST_NULL o){ 182 stack().push(Type.NULL); 183 } 184 185 public void visitALOAD(ALOAD o){ 186 stack().push(locals().get(o.getIndex())); 187 } 188 189 public void visitANEWARRAY(ANEWARRAY o){ 190 stack().pop(); stack().push( new ArrayType(o.getType(cpg), 1) ); 192 } 193 194 public void visitARETURN(ARETURN o){ 195 stack().pop(); 196 } 197 198 public void visitARRAYLENGTH(ARRAYLENGTH o){ 199 stack().pop(); 200 stack().push(Type.INT); 201 } 202 203 204 public void visitASTORE(ASTORE o){ 205 locals().set(o.getIndex(), stack().pop()); 206 } 208 209 210 public void visitATHROW(ATHROW o){ 211 Type t = stack().pop(); 212 stack().clear(); 213 if (t.equals(Type.NULL)) 214 stack().push(Type.getType("Ljava/lang/NullPointerException;")); 215 else 216 stack().push(t); 217 } 218 219 220 public void visitBALOAD(BALOAD o){ 221 stack().pop(); 222 stack().pop(); 223 stack().push(Type.INT); 224 } 225 226 227 public void visitBASTORE(BASTORE o){ 228 stack().pop(); 229 stack().pop(); 230 stack().pop(); 231 } 232 233 234 public void visitBIPUSH(BIPUSH o){ 235 stack().push(Type.INT); 236 } 237 238 239 public void visitCALOAD(CALOAD o){ 240 stack().pop(); 241 stack().pop(); 242 stack().push(Type.INT); 243 } 244 245 public void visitCASTORE(CASTORE o){ 246 stack().pop(); 247 stack().pop(); 248 stack().pop(); 249 } 250 251 public void visitCHECKCAST(CHECKCAST o){ 252 stack().pop(); 258 stack().push(o.getType(cpg)); 259 } 260 261 262 public void visitD2F(D2F o){ 263 stack().pop(); 264 stack().push(Type.FLOAT); 265 } 266 267 public void visitD2I(D2I o){ 268 stack().pop(); 269 stack().push(Type.INT); 270 } 271 272 public void visitD2L(D2L o){ 273 stack().pop(); 274 stack().push(Type.LONG); 275 } 276 277 public void visitDADD(DADD o){ 278 stack().pop(); 279 stack().pop(); 280 stack().push(Type.DOUBLE); 281 } 282 283 public void visitDALOAD(DALOAD o){ 284 stack().pop(); 285 stack().pop(); 286 stack().push(Type.DOUBLE); 287 } 288 289 public void visitDASTORE(DASTORE o){ 290 stack().pop(); 291 stack().pop(); 292 stack().pop(); 293 } 294 295 public void visitDCMPG(DCMPG o){ 296 stack().pop(); 297 stack().pop(); 298 stack().push(Type.INT); 299 } 300 301 public void visitDCMPL(DCMPL o){ 302 stack().pop(); 303 stack().pop(); 304 stack().push(Type.INT); 305 } 306 307 public void visitDCONST(DCONST o){ 308 stack().push(Type.DOUBLE); 309 } 310 311 public void visitDDIV(DDIV o){ 312 stack().pop(); 313 stack().pop(); 314 stack().push(Type.DOUBLE); 315 } 316 317 public void visitDLOAD(DLOAD o){ 318 stack().push(Type.DOUBLE); 319 } 320 321 public void visitDMUL(DMUL o){ 322 stack().pop(); 323 stack().pop(); 324 stack().push(Type.DOUBLE); 325 } 326 327 public void visitDNEG(DNEG o){ 328 stack().pop(); 329 stack().push(Type.DOUBLE); 330 } 331 332 public void visitDREM(DREM o){ 333 stack().pop(); 334 stack().pop(); 335 stack().push(Type.DOUBLE); 336 } 337 338 public void visitDRETURN(DRETURN o){ 339 stack().pop(); 340 } 341 342 public void visitDSTORE(DSTORE o){ 343 locals().set(o.getIndex(), stack().pop()); 344 locals().set(o.getIndex()+1, Type.UNKNOWN); 345 } 346 347 public void visitDSUB(DSUB o){ 348 stack().pop(); 349 stack().pop(); 350 stack().push(Type.DOUBLE); 351 } 352 353 public void visitDUP(DUP o){ 354 Type t = stack().pop(); 355 stack().push(t); 356 stack().push(t); 357 } 358 359 public void visitDUP_X1(DUP_X1 o){ 360 Type w1 = stack().pop(); 361 Type w2 = stack().pop(); 362 stack().push(w1); 363 stack().push(w2); 364 stack().push(w1); 365 } 366 367 public void visitDUP_X2(DUP_X2 o){ 368 Type w1 = stack().pop(); 369 Type w2 = stack().pop(); 370 if (w2.getSize() == 2){ 371 stack().push(w1); 372 stack().push(w2); 373 stack().push(w1); 374 } 375 else{ 376 Type w3 = stack().pop(); 377 stack().push(w1); 378 stack().push(w3); 379 stack().push(w2); 380 stack().push(w1); 381 } 382 } 383 384 public void visitDUP2(DUP2 o){ 385 Type t = stack().pop(); 386 if (t.getSize() == 2){ 387 stack().push(t); 388 stack().push(t); 389 } 390 else{ Type u = stack().pop(); 392 stack().push(u); 393 stack().push(t); 394 stack().push(u); 395 stack().push(t); 396 } 397 } 398 399 public void visitDUP2_X1(DUP2_X1 o){ 400 Type t = stack().pop(); 401 if (t.getSize() == 2){ 402 Type u = stack().pop(); 403 stack().push(t); 404 stack().push(u); 405 stack().push(t); 406 } 407 else{ Type u = stack().pop(); 409 Type v = stack().pop(); 410 stack().push(u); 411 stack().push(t); 412 stack().push(v); 413 stack().push(u); 414 stack().push(t); 415 } 416 } 417 418 public void visitDUP2_X2(DUP2_X2 o){ 419 Type t = stack().pop(); 420 if (t.getSize() == 2){ 421 Type u = stack().pop(); 422 if (u.getSize() == 2){ 423 stack().push(t); 424 stack().push(u); 425 stack().push(t); 426 }else{ 427 Type v = stack().pop(); 428 stack().push(t); 429 stack().push(v); 430 stack().push(u); 431 stack().push(t); 432 } 433 } 434 else{ Type u = stack().pop(); 436 Type v = stack().pop(); 437 if (v.getSize() == 2){ 438 stack().push(u); 439 stack().push(t); 440 stack().push(v); 441 stack().push(u); 442 stack().push(t); 443 }else{ 444 Type w = stack().pop(); 445 stack().push(u); 446 stack().push(t); 447 stack().push(w); 448 stack().push(v); 449 stack().push(u); 450 stack().push(t); 451 } 452 } 453 } 454 455 public void visitF2D(F2D o){ 456 stack().pop(); 457 stack().push(Type.DOUBLE); 458 } 459 460 public void visitF2I(F2I o){ 461 stack().pop(); 462 stack().push(Type.INT); 463 } 464 465 public void visitF2L(F2L o){ 466 stack().pop(); 467 stack().push(Type.LONG); 468 } 469 470 public void visitFADD(FADD o){ 471 stack().pop(); 472 stack().pop(); 473 stack().push(Type.FLOAT); 474 } 475 476 public void visitFALOAD(FALOAD o){ 477 stack().pop(); 478 stack().pop(); 479 stack().push(Type.FLOAT); 480 } 481 482 public void visitFASTORE(FASTORE o){ 483 stack().pop(); 484 stack().pop(); 485 stack().pop(); 486 } 487 488 public void visitFCMPG(FCMPG o){ 489 stack().pop(); 490 stack().pop(); 491 stack().push(Type.INT); 492 } 493 494 public void visitFCMPL(FCMPL o){ 495 stack().pop(); 496 stack().pop(); 497 stack().push(Type.INT); 498 } 499 500 public void visitFCONST(FCONST o){ 501 stack().push(Type.FLOAT); 502 } 503 504 public void visitFDIV(FDIV o){ 505 stack().pop(); 506 stack().pop(); 507 stack().push(Type.FLOAT); 508 } 509 510 public void visitFLOAD(FLOAD o){ 511 stack().push(Type.FLOAT); 512 } 513 514 public void visitFMUL(FMUL o){ 515 stack().pop(); 516 stack().pop(); 517 stack().push(Type.FLOAT); 518 } 519 520 public void visitFNEG(FNEG o){ 521 stack().pop(); 522 stack().push(Type.FLOAT); 523 } 524 525 public void visitFREM(FREM o){ 526 stack().pop(); 527 stack().pop(); 528 stack().push(Type.FLOAT); 529 } 530 531 public void visitFRETURN(FRETURN o){ 532 stack().pop(); 533 } 534 535 public void visitFSTORE(FSTORE o){ 536 locals().set(o.getIndex(), stack().pop()); 537 } 538 539 public void visitFSUB(FSUB o){ 540 stack().pop(); 541 stack().pop(); 542 stack().push(Type.FLOAT); 543 } 544 545 public void visitGETFIELD(GETFIELD o){ 546 stack().pop(); 547 Type t = o.getFieldType(cpg); 548 if ( t.equals(Type.BOOLEAN) || 549 t.equals(Type.CHAR) || 550 t.equals(Type.BYTE) || 551 t.equals(Type.SHORT) ) 552 t = Type.INT; 553 stack().push(t); 554 } 555 556 public void visitGETSTATIC(GETSTATIC o){ 557 Type t = o.getFieldType(cpg); 558 if ( t.equals(Type.BOOLEAN) || 559 t.equals(Type.CHAR) || 560 t.equals(Type.BYTE) || 561 t.equals(Type.SHORT) ) 562 t = Type.INT; 563 stack().push(t); 564 } 565 566 public void visitGOTO(GOTO o){ 567 } 569 570 public void visitGOTO_W(GOTO_W o){ 571 } 573 574 public void visitI2B(I2B o){ 575 stack().pop(); 576 stack().push(Type.INT); 577 } 578 579 public void visitI2C(I2C o){ 580 stack().pop(); 581 stack().push(Type.INT); 582 } 583 584 public void visitI2D(I2D o){ 585 stack().pop(); 586 stack().push(Type.DOUBLE); 587 } 588 589 public void visitI2F(I2F o){ 590 stack().pop(); 591 stack().push(Type.FLOAT); 592 } 593 594 public void visitI2L(I2L o){ 595 stack().pop(); 596 stack().push(Type.LONG); 597 } 598 599 public void visitI2S(I2S o){ 600 stack().pop(); 601 stack().push(Type.INT); 602 } 603 604 public void visitIADD(IADD o){ 605 stack().pop(); 606 stack().pop(); 607 stack().push(Type.INT); 608 } 609 610 public void visitIALOAD(IALOAD o){ 611 stack().pop(); 612 stack().pop(); 613 stack().push(Type.INT); 614 } 615 616 public void visitIAND(IAND o){ 617 stack().pop(); 618 stack().pop(); 619 stack().push(Type.INT); 620 } 621 622 public void visitIASTORE(IASTORE o){ 623 stack().pop(); 624 stack().pop(); 625 stack().pop(); 626 } 627 628 public void visitICONST(ICONST o){ 629 stack().push(Type.INT); 630 } 631 632 public void visitIDIV(IDIV o){ 633 stack().pop(); 634 stack().pop(); 635 stack().push(Type.INT); 636 } 637 638 public void visitIF_ACMPEQ(IF_ACMPEQ o){ 639 stack().pop(); 640 stack().pop(); 641 } 642 643 public void visitIF_ACMPNE(IF_ACMPNE o){ 644 stack().pop(); 645 stack().pop(); 646 } 647 648 public void visitIF_ICMPEQ(IF_ICMPEQ o){ 649 stack().pop(); 650 stack().pop(); 651 } 652 653 public void visitIF_ICMPGE(IF_ICMPGE o){ 654 stack().pop(); 655 stack().pop(); 656 } 657 658 public void visitIF_ICMPGT(IF_ICMPGT o){ 659 stack().pop(); 660 stack().pop(); 661 } 662 663 public void visitIF_ICMPLE(IF_ICMPLE o){ 664 stack().pop(); 665 stack().pop(); 666 } 667 668 public void visitIF_ICMPLT(IF_ICMPLT o){ 669 stack().pop(); 670 stack().pop(); 671 } 672 673 public void visitIF_ICMPNE(IF_ICMPNE o){ 674 stack().pop(); 675 stack().pop(); 676 } 677 678 public void visitIFEQ(IFEQ o){ 679 stack().pop(); 680 } 681 682 public void visitIFGE(IFGE o){ 683 stack().pop(); 684 } 685 686 public void visitIFGT(IFGT o){ 687 stack().pop(); 688 } 689 690 public void visitIFLE(IFLE o){ 691 stack().pop(); 692 } 693 694 public void visitIFLT(IFLT o){ 695 stack().pop(); 696 } 697 698 public void visitIFNE(IFNE o){ 699 stack().pop(); 700 } 701 702 public void visitIFNONNULL(IFNONNULL o){ 703 stack().pop(); 704 } 705 706 public void visitIFNULL(IFNULL o){ 707 stack().pop(); 708 } 709 710 public void visitIINC(IINC o){ 711 } 713 714 public void visitILOAD(ILOAD o){ 715 stack().push(Type.INT); 716 } 717 718 public void visitIMUL(IMUL o){ 719 stack().pop(); 720 stack().pop(); 721 stack().push(Type.INT); 722 } 723 724 public void visitINEG(INEG o){ 725 stack().pop(); 726 stack().push(Type.INT); 727 } 728 729 public void visitINSTANCEOF(INSTANCEOF o){ 730 stack().pop(); 731 stack().push(Type.INT); 732 } 733 734 public void visitINVOKEINTERFACE(INVOKEINTERFACE o){ 735 stack().pop(); for (int i=0; i<o.getArgumentTypes(cpg).length; i++){ 737 stack().pop(); 738 } 739 if (o.getReturnType(cpg) != Type.VOID){ 744 Type t = o.getReturnType(cpg); 745 if ( t.equals(Type.BOOLEAN) || 746 t.equals(Type.CHAR) || 747 t.equals(Type.BYTE) || 748 t.equals(Type.SHORT) ) 749 t = Type.INT; 750 stack().push(t); 751 } 752 } 753 754 public void visitINVOKESPECIAL(INVOKESPECIAL o){ 755 if (o.getMethodName(cpg).equals(Constants.CONSTRUCTOR_NAME)){ 756 UninitializedObjectType t = (UninitializedObjectType) stack().peek(o.getArgumentTypes(cpg).length); 757 if (t == frame._this){ 758 frame._this = null; 759 } 760 stack().initializeObject(t); 761 locals().initializeObject(t); 762 } 763 stack().pop(); for (int i=0; i<o.getArgumentTypes(cpg).length; i++){ 765 stack().pop(); 766 } 767 if (o.getReturnType(cpg) != Type.VOID){ 772 Type t = o.getReturnType(cpg); 773 if ( t.equals(Type.BOOLEAN) || 774 t.equals(Type.CHAR) || 775 t.equals(Type.BYTE) || 776 t.equals(Type.SHORT) ) 777 t = Type.INT; 778 stack().push(t); 779 } 780 } 781 782 public void visitINVOKESTATIC(INVOKESTATIC o){ 783 for (int i=0; i<o.getArgumentTypes(cpg).length; i++){ 784 stack().pop(); 785 } 786 if (o.getReturnType(cpg) != Type.VOID){ 791 Type t = o.getReturnType(cpg); 792 if ( t.equals(Type.BOOLEAN) || 793 t.equals(Type.CHAR) || 794 t.equals(Type.BYTE) || 795 t.equals(Type.SHORT) ) 796 t = Type.INT; 797 stack().push(t); 798 } 799 } 800 801 public void visitINVOKEVIRTUAL(INVOKEVIRTUAL o){ 802 stack().pop(); for (int i=0; i<o.getArgumentTypes(cpg).length; i++){ 804 stack().pop(); 805 } 806 if (o.getReturnType(cpg) != Type.VOID){ 811 Type t = o.getReturnType(cpg); 812 if ( t.equals(Type.BOOLEAN) || 813 t.equals(Type.CHAR) || 814 t.equals(Type.BYTE) || 815 t.equals(Type.SHORT) ) 816 t = Type.INT; 817 stack().push(t); 818 } 819 } 820 821 public void visitIOR(IOR o){ 822 stack().pop(); 823 stack().pop(); 824 stack().push(Type.INT); 825 } 826 827 public void visitIREM(IREM o){ 828 stack().pop(); 829 stack().pop(); 830 stack().push(Type.INT); 831 } 832 833 public void visitIRETURN(IRETURN o){ 834 stack().pop(); 835 } 836 837 public void visitISHL(ISHL o){ 838 stack().pop(); 839 stack().pop(); 840 stack().push(Type.INT); 841 } 842 843 public void visitISHR(ISHR o){ 844 stack().pop(); 845 stack().pop(); 846 stack().push(Type.INT); 847 } 848 849 public void visitISTORE(ISTORE o){ 850 locals().set(o.getIndex(), stack().pop()); 851 } 852 853 public void visitISUB(ISUB o){ 854 stack().pop(); 855 stack().pop(); 856 stack().push(Type.INT); 857 } 858 859 public void visitIUSHR(IUSHR o){ 860 stack().pop(); 861 stack().pop(); 862 stack().push(Type.INT); 863 } 864 865 public void visitIXOR(IXOR o){ 866 stack().pop(); 867 stack().pop(); 868 stack().push(Type.INT); 869 } 870 871 872 public void visitJSR(JSR o){ 873 stack().push(new ReturnaddressType(o.physicalSuccessor())); 874 } 876 877 878 public void visitJSR_W(JSR_W o){ 879 stack().push(new ReturnaddressType(o.physicalSuccessor())); 880 } 881 882 883 public void visitL2D(L2D o){ 884 stack().pop(); 885 stack().push(Type.DOUBLE); 886 } 887 888 public void visitL2F(L2F o){ 889 stack().pop(); 890 stack().push(Type.FLOAT); 891 } 892 893 public void visitL2I(L2I o){ 894 stack().pop(); 895 stack().push(Type.INT); 896 } 897 898 public void visitLADD(LADD o){ 899 stack().pop(); 900 stack().pop(); 901 stack().push(Type.LONG); 902 } 903 904 public void visitLALOAD(LALOAD o){ 905 stack().pop(); 906 stack().pop(); 907 stack().push(Type.LONG); 908 } 909 910 public void visitLAND(LAND o){ 911 stack().pop(); 912 stack().pop(); 913 stack().push(Type.LONG); 914 } 915 916 public void visitLASTORE(LASTORE o){ 917 stack().pop(); 918 stack().pop(); 919 stack().pop(); 920 } 921 922 public void visitLCMP(LCMP o){ 923 stack().pop(); 924 stack().pop(); 925 stack().push(Type.INT); 926 } 927 928 public void visitLCONST(LCONST o){ 929 stack().push(Type.LONG); 930 } 931 932 public void visitLDC(LDC o){ 933 Constant c = cpg.getConstant(o.getIndex()); 934 if (c instanceof ConstantInteger){ 935 stack().push(Type.INT); 936 } 937 if (c instanceof ConstantFloat){ 938 stack().push(Type.FLOAT); 939 } 940 if (c instanceof ConstantString){ 941 stack().push(Type.STRING); 942 } 943 } 944 945 public void visitLDC_W(LDC_W o){ 946 Constant c = cpg.getConstant(o.getIndex()); 947 if (c instanceof ConstantInteger){ 948 stack().push(Type.INT); 949 } 950 if (c instanceof ConstantFloat){ 951 stack().push(Type.FLOAT); 952 } 953 if (c instanceof ConstantString){ 954 stack().push(Type.STRING); 955 } 956 } 957 958 public void visitLDC2_W(LDC2_W o){ 959 Constant c = cpg.getConstant(o.getIndex()); 960 if (c instanceof ConstantLong){ 961 stack().push(Type.LONG); 962 } 963 if (c instanceof ConstantDouble){ 964 stack().push(Type.DOUBLE); 965 } 966 } 967 968 public void visitLDIV(LDIV o){ 969 stack().pop(); 970 stack().pop(); 971 stack().push(Type.LONG); 972 } 973 974 public void visitLLOAD(LLOAD o){ 975 stack().push(locals().get(o.getIndex())); 976 } 977 978 public void visitLMUL(LMUL o){ 979 stack().pop(); 980 stack().pop(); 981 stack().push(Type.LONG); 982 } 983 984 public void visitLNEG(LNEG o){ 985 stack().pop(); 986 stack().push(Type.LONG); 987 } 988 989 public void visitLOOKUPSWITCH(LOOKUPSWITCH o){ 990 stack().pop(); } 992 993 public void visitLOR(LOR o){ 994 stack().pop(); 995 stack().pop(); 996 stack().push(Type.LONG); 997 } 998 999 public void visitLREM(LREM o){ 1000 stack().pop(); 1001 stack().pop(); 1002 stack().push(Type.LONG); 1003 } 1004 1005 public void visitLRETURN(LRETURN o){ 1006 stack().pop(); 1007 } 1008 1009 public void visitLSHL(LSHL o){ 1010 stack().pop(); 1011 stack().pop(); 1012 stack().push(Type.LONG); 1013 } 1014 1015 public void visitLSHR(LSHR o){ 1016 stack().pop(); 1017 stack().pop(); 1018 stack().push(Type.LONG); 1019 } 1020 1021 public void visitLSTORE(LSTORE o){ 1022 locals().set(o.getIndex(), stack().pop()); 1023 locals().set(o.getIndex()+1, Type.UNKNOWN); 1024 } 1025 1026 public void visitLSUB(LSUB o){ 1027 stack().pop(); 1028 stack().pop(); 1029 stack().push(Type.LONG); 1030 } 1031 1032 public void visitLUSHR(LUSHR o){ 1033 stack().pop(); 1034 stack().pop(); 1035 stack().push(Type.LONG); 1036 } 1037 1038 public void visitLXOR(LXOR o){ 1039 stack().pop(); 1040 stack().pop(); 1041 stack().push(Type.LONG); 1042 } 1043 1044 public void visitMONITORENTER(MONITORENTER o){ 1045 stack().pop(); 1046 } 1047 1048 public void visitMONITOREXIT(MONITOREXIT o){ 1049 stack().pop(); 1050 } 1051 1052 public void visitMULTIANEWARRAY(MULTIANEWARRAY o){ 1053 for (int i=0; i<o.getDimensions(); i++){ 1054 stack().pop(); 1055 } 1056 stack().push(o.getType(cpg)); 1057 } 1058 1059 public void visitNEW(NEW o){ 1060 stack().push(new UninitializedObjectType((ObjectType) (o.getType(cpg)))); 1061 } 1062 1063 public void visitNEWARRAY(NEWARRAY o){ 1064 stack().pop(); 1065 stack().push(o.getType()); 1066 } 1067 1068 public void visitNOP(NOP o){ 1069 } 1070 1071 public void visitPOP(POP o){ 1072 stack().pop(); 1073 } 1074 1075 public void visitPOP2(POP2 o){ 1076 Type t = stack().pop(); 1077 if (t.getSize() == 1){ 1078 stack().pop(); 1079 } 1080 } 1081 1082 public void visitPUTFIELD(PUTFIELD o){ 1083 stack().pop(); 1084 stack().pop(); 1085 } 1086 1087 public void visitPUTSTATIC(PUTSTATIC o){ 1088 stack().pop(); 1089 } 1090 1091 public void visitRET(RET o){ 1092 } 1095 1096 public void visitRETURN(RETURN o){ 1097 } 1099 1100 public void visitSALOAD(SALOAD o){ 1101 stack().pop(); 1102 stack().pop(); 1103 stack().push(Type.INT); 1104 } 1105 1106 public void visitSASTORE(SASTORE o){ 1107 stack().pop(); 1108 stack().pop(); 1109 stack().pop(); 1110 } 1111 1112 public void visitSIPUSH(SIPUSH o){ 1113 stack().push(Type.INT); 1114 } 1115 1116 public void visitSWAP(SWAP o){ 1117 Type t = stack().pop(); 1118 Type u = stack().pop(); 1119 stack().push(t); 1120 stack().push(u); 1121 } 1122 1123 public void visitTABLESWITCH(TABLESWITCH o){ 1124 stack().pop(); 1125 } 1126} 1127 | Popular Tags |