1 21 package proguard.classfile.editor; 22 23 import proguard.classfile.*; 24 import proguard.classfile.constant.*; 25 26 31 public class ConstantPoolEditor 32 { 33 private static final boolean DEBUG = false; 34 35 36 41 public int addIntegerConstant(ProgramClass programClass, 42 int value) 43 { 44 int constantPoolCount = programClass.u2constantPoolCount; 45 Constant[] constantPool = programClass.constantPool; 46 47 for (int index = 1; index < constantPoolCount; index++) 49 { 50 Constant constant = constantPool[index]; 51 52 if (constant != null && 53 constant.getTag() == ClassConstants.CONSTANT_Integer) 54 { 55 IntegerConstant integerConstant = (IntegerConstant)constant; 56 if (integerConstant.getValue() == value) 57 { 58 return index; 59 } 60 } 61 } 62 63 return addConstant(programClass, new IntegerConstant(value)); 64 } 65 66 67 72 public int addLongConstant(ProgramClass programClass, 73 long value) 74 { 75 int constantPoolCount = programClass.u2constantPoolCount; 76 Constant[] constantPool = programClass.constantPool; 77 78 for (int index = 1; index < constantPoolCount; index++) 80 { 81 Constant constant = constantPool[index]; 82 83 if (constant != null && 84 constant.getTag() == ClassConstants.CONSTANT_Long) 85 { 86 LongConstant longConstant = (LongConstant)constant; 87 if (longConstant.getValue() == value) 88 { 89 return index; 90 } 91 } 92 } 93 94 return addConstant(programClass, new LongConstant(value)); 95 } 96 97 98 103 public int addFloatConstant(ProgramClass programClass, 104 float value) 105 { 106 int constantPoolCount = programClass.u2constantPoolCount; 107 Constant[] constantPool = programClass.constantPool; 108 109 for (int index = 1; index < constantPoolCount; index++) 111 { 112 Constant constant = constantPool[index]; 113 114 if (constant != null && 115 constant.getTag() == ClassConstants.CONSTANT_Float) 116 { 117 FloatConstant floatConstant = (FloatConstant)constant; 118 if (floatConstant.getValue() == value) 119 { 120 return index; 121 } 122 } 123 } 124 125 return addConstant(programClass, new FloatConstant(value)); 126 } 127 128 129 134 public int addDoubleConstant(ProgramClass programClass, 135 double value) 136 { 137 int constantPoolCount = programClass.u2constantPoolCount; 138 Constant[] constantPool = programClass.constantPool; 139 140 for (int index = 1; index < constantPoolCount; index++) 142 { 143 Constant constant = constantPool[index]; 144 145 if (constant != null && 146 constant.getTag() == ClassConstants.CONSTANT_Double) 147 { 148 DoubleConstant doubleConstant = (DoubleConstant)constant; 149 if (doubleConstant.getValue() == value) 150 { 151 return index; 152 } 153 } 154 } 155 156 return addConstant(programClass, new DoubleConstant(value)); 157 } 158 159 160 165 public int addStringConstant(ProgramClass programClass, 166 String string, 167 Clazz referencedClass, 168 Member referencedMember) 169 { 170 int constantPoolCount = programClass.u2constantPoolCount; 171 Constant[] constantPool = programClass.constantPool; 172 173 for (int index = 1; index < constantPoolCount; index++) 175 { 176 Constant constant = constantPool[index]; 177 178 if (constant != null && 179 constant.getTag() == ClassConstants.CONSTANT_String) 180 { 181 StringConstant classConstant = (StringConstant)constant; 182 if (classConstant.getString(programClass).equals(string)) 183 { 184 return index; 185 } 186 } 187 } 188 189 int nameIndex = addUtf8Constant(programClass, string); 190 191 return addConstant(programClass, 192 new StringConstant(nameIndex, 193 referencedClass, 194 referencedMember)); 195 } 196 197 198 203 public int addFieldrefConstant(ProgramClass programClass, 204 Clazz referencedClass, 205 Member referencedMember) 206 { 207 return addFieldrefConstant(programClass, 208 referencedClass.getName(), 209 referencedMember.getName(referencedClass), 210 referencedMember.getDescriptor(referencedClass), 211 referencedClass, 212 referencedMember); 213 } 214 215 216 221 public int addFieldrefConstant(ProgramClass programClass, 222 String className, 223 String name, 224 String descriptor, 225 Clazz referencedClass, 226 Member referencedMember) 227 { 228 return addFieldrefConstant(programClass, 229 className, 230 addNameAndTypeConstant(programClass, 231 name, 232 descriptor), 233 referencedClass, 234 referencedMember); 235 } 236 237 238 243 public int addFieldrefConstant(ProgramClass programClass, 244 String className, 245 int nameAndTypeIndex, 246 Clazz referencedClass, 247 Member referencedMember) 248 { 249 return addFieldrefConstant(programClass, 250 addClassConstant(programClass, 251 className, 252 referencedClass), 253 nameAndTypeIndex, 254 referencedClass, 255 referencedMember); 256 } 257 258 259 265 public int addFieldrefConstant(ProgramClass programClass, 266 int classIndex, 267 String name, 268 String descriptor, 269 Clazz referencedClass, 270 Member referencedMember) 271 { 272 return addFieldrefConstant(programClass, 273 classIndex, 274 addNameAndTypeConstant(programClass, 275 name, 276 descriptor), 277 referencedClass, 278 referencedMember); 279 } 280 281 282 288 public int addFieldrefConstant(ProgramClass programClass, 289 int classIndex, 290 int nameAndTypeIndex, 291 Clazz referencedClass, 292 Member referencedMember) 293 { 294 int constantPoolCount = programClass.u2constantPoolCount; 295 Constant[] constantPool = programClass.constantPool; 296 297 for (int index = 1; index < constantPoolCount; index++) 299 { 300 Constant constant = constantPool[index]; 301 302 if (constant != null && 303 constant.getTag() == ClassConstants.CONSTANT_Fieldref) 304 { 305 FieldrefConstant fieldrefConstant = (FieldrefConstant)constant; 306 if (fieldrefConstant.u2classIndex == classIndex && 307 fieldrefConstant.u2nameAndTypeIndex == nameAndTypeIndex) 308 { 309 return index; 310 } 311 } 312 } 313 314 return addConstant(programClass, 315 new FieldrefConstant(classIndex, 316 nameAndTypeIndex, 317 referencedClass, 318 referencedMember)); 319 } 320 321 322 327 public int addInterfaceMethodrefConstant(ProgramClass programClass, 328 String className, 329 String name, 330 String descriptor, 331 Clazz referencedClass, 332 Member referencedMember) 333 { 334 return addInterfaceMethodrefConstant(programClass, 335 className, 336 addNameAndTypeConstant(programClass, 337 name, 338 descriptor), 339 referencedClass, 340 referencedMember); 341 } 342 343 344 349 public int addInterfaceMethodrefConstant(ProgramClass programClass, 350 String className, 351 int nameAndTypeIndex, 352 Clazz referencedClass, 353 Member referencedMember) 354 { 355 return addInterfaceMethodrefConstant(programClass, 356 addClassConstant(programClass, 357 className, 358 referencedClass), 359 nameAndTypeIndex, 360 referencedClass, 361 referencedMember); 362 } 363 364 365 370 public int addInterfaceMethodrefConstant(ProgramClass programClass, 371 Clazz referencedClass, 372 Member referencedMember) 373 { 374 return addInterfaceMethodrefConstant(programClass, 375 referencedClass.getName(), 376 referencedMember.getName(referencedClass), 377 referencedMember.getDescriptor(referencedClass), 378 referencedClass, 379 referencedMember); 380 } 381 382 383 389 public int addInterfaceMethodrefConstant(ProgramClass programClass, 390 int classIndex, 391 String name, 392 String descriptor, 393 Clazz referencedClass, 394 Member referencedMember) 395 { 396 return addInterfaceMethodrefConstant(programClass, 397 classIndex, 398 addNameAndTypeConstant(programClass, 399 name, 400 descriptor), 401 referencedClass, 402 referencedMember); 403 } 404 405 406 412 public int addInterfaceMethodrefConstant(ProgramClass programClass, 413 int classIndex, 414 int nameAndTypeIndex, 415 Clazz referencedClass, 416 Member referencedMember) 417 { 418 int constantPoolCount = programClass.u2constantPoolCount; 419 Constant[] constantPool = programClass.constantPool; 420 421 for (int index = 1; index < constantPoolCount; index++) 423 { 424 Constant constant = constantPool[index]; 425 426 if (constant != null && 427 constant.getTag() == ClassConstants.CONSTANT_InterfaceMethodref) 428 { 429 InterfaceMethodrefConstant methodrefConstant = (InterfaceMethodrefConstant)constant; 430 if (methodrefConstant.u2classIndex == classIndex && 431 methodrefConstant.u2nameAndTypeIndex == nameAndTypeIndex) 432 { 433 return index; 434 } 435 } 436 } 437 438 return addConstant(programClass, 439 new InterfaceMethodrefConstant(classIndex, 440 nameAndTypeIndex, 441 referencedClass, 442 referencedMember)); 443 } 444 445 446 451 public int addMethodrefConstant(ProgramClass programClass, 452 Clazz referencedClass, 453 Member referencedMember) 454 { 455 return addMethodrefConstant(programClass, 456 referencedClass.getName(), 457 referencedMember.getName(referencedClass), 458 referencedMember.getDescriptor(referencedClass), 459 referencedClass, 460 referencedMember); 461 } 462 463 464 469 public int addMethodrefConstant(ProgramClass programClass, 470 String className, 471 String name, 472 String descriptor, 473 Clazz referencedClass, 474 Member referencedMember) 475 { 476 return addMethodrefConstant(programClass, 477 className, 478 addNameAndTypeConstant(programClass, 479 name, 480 descriptor), 481 referencedClass, 482 referencedMember); 483 } 484 485 486 491 public int addMethodrefConstant(ProgramClass programClass, 492 String className, 493 int nameAndTypeIndex, 494 Clazz referencedClass, 495 Member referencedMember) 496 { 497 return addMethodrefConstant(programClass, 498 addClassConstant(programClass, 499 className, 500 referencedClass), 501 nameAndTypeIndex, 502 referencedClass, 503 referencedMember); 504 } 505 506 507 513 public int addMethodrefConstant(ProgramClass programClass, 514 int classIndex, 515 String name, 516 String descriptor, 517 Clazz referencedClass, 518 Member referencedMember) 519 { 520 return addMethodrefConstant(programClass, 521 classIndex, 522 addNameAndTypeConstant(programClass, 523 name, 524 descriptor), 525 referencedClass, 526 referencedMember); 527 } 528 529 530 536 public int addMethodrefConstant(ProgramClass programClass, 537 int classIndex, 538 int nameAndTypeIndex, 539 Clazz referencedClass, 540 Member referencedMember) 541 { 542 int constantPoolCount = programClass.u2constantPoolCount; 543 Constant[] constantPool = programClass.constantPool; 544 545 for (int index = 1; index < constantPoolCount; index++) 547 { 548 Constant constant = constantPool[index]; 549 550 if (constant != null && 551 constant.getTag() == ClassConstants.CONSTANT_Methodref) 552 { 553 MethodrefConstant methodrefConstant = (MethodrefConstant)constant; 554 if (methodrefConstant.u2classIndex == classIndex && 555 methodrefConstant.u2nameAndTypeIndex == nameAndTypeIndex) 556 { 557 return index; 558 } 559 } 560 } 561 562 return addConstant(programClass, 563 new MethodrefConstant(classIndex, 564 nameAndTypeIndex, 565 referencedClass, 566 referencedMember)); 567 } 568 569 570 575 public int addClassConstant(ProgramClass programClass, 576 Clazz referencedClass) 577 { 578 return addClassConstant(programClass, 579 referencedClass.getName(), 580 referencedClass); 581 } 582 583 584 589 public int addClassConstant(ProgramClass programClass, 590 String name, 591 Clazz referencedClass) 592 { 593 int constantPoolCount = programClass.u2constantPoolCount; 594 Constant[] constantPool = programClass.constantPool; 595 596 for (int index = 1; index < constantPoolCount; index++) 598 { 599 Constant constant = constantPool[index]; 600 601 if (constant != null && 602 constant.getTag() == ClassConstants.CONSTANT_Class) 603 { 604 ClassConstant classConstant = (ClassConstant)constant; 605 if (classConstant.getName(programClass).equals(name)) 606 { 607 return index; 608 } 609 } 610 } 611 612 int nameIndex = addUtf8Constant(programClass, name); 613 614 return addConstant(programClass, 615 new ClassConstant(nameIndex, 616 referencedClass)); 617 } 618 619 620 625 public int addNameAndTypeConstant(ProgramClass programClass, 626 String name, 627 String type) 628 { 629 int constantPoolCount = programClass.u2constantPoolCount; 630 Constant[] constantPool = programClass.constantPool; 631 632 for (int index = 1; index < constantPoolCount; index++) 634 { 635 Constant constant = constantPool[index]; 636 637 if (constant != null && 638 constant.getTag() == ClassConstants.CONSTANT_NameAndType) 639 { 640 NameAndTypeConstant nameAndTypeConstant = (NameAndTypeConstant)constant; 641 if (nameAndTypeConstant.getName(programClass).equals(name) && 642 nameAndTypeConstant.getType(programClass).equals(type)) 643 { 644 return index; 645 } 646 } 647 } 648 649 int nameIndex = addUtf8Constant(programClass, name); 650 int descriptorIndex = addUtf8Constant(programClass, type); 651 652 return addConstant(programClass, 653 new NameAndTypeConstant(nameIndex, 654 descriptorIndex)); 655 } 656 657 658 663 public int addUtf8Constant(ProgramClass programClass, 664 String string) 665 { 666 int constantPoolCount = programClass.u2constantPoolCount; 667 Constant[] constantPool = programClass.constantPool; 668 669 for (int index = 1; index < constantPoolCount; index++) 671 { 672 Constant constant = constantPool[index]; 673 674 if (constant != null && 675 constant.getTag() == ClassConstants.CONSTANT_Utf8) 676 { 677 Utf8Constant utf8Constant = (Utf8Constant)constant; 678 if (utf8Constant.getString().equals(string)) 679 { 680 return index; 681 } 682 } 683 } 684 685 return addConstant(programClass, new Utf8Constant(string)); 686 } 687 688 689 694 public int addConstant(ProgramClass programClass, 695 Constant constant) 696 { 697 int constantPoolCount = programClass.u2constantPoolCount; 698 Constant[] constantPool = programClass.constantPool; 699 700 if (constantPool.length < constantPoolCount+2) 702 { 703 programClass.constantPool = new Constant[constantPoolCount+2]; 704 System.arraycopy(constantPool, 0, 705 programClass.constantPool, 0, 706 constantPoolCount); 707 constantPool = programClass.constantPool; 708 } 709 710 if (DEBUG) 711 { 712 System.out.println(programClass.getName()+": adding ["+constant.getClass().getName()+"] at index "+programClass.u2constantPoolCount); 713 } 714 715 constantPool[programClass.u2constantPoolCount++] = constant; 717 718 int tag = constant.getTag(); 721 if (tag == ClassConstants.CONSTANT_Long || 722 tag == ClassConstants.CONSTANT_Double) 723 { 724 constantPool[programClass.u2constantPoolCount++] = null; 725 } 726 727 return constantPoolCount; 728 } 729 } 730 | Popular Tags |