List of usage examples for org.objectweb.asm.tree LdcInsnNode clone
@Override
public AbstractInsnNode clone(final Map<LabelNode, LabelNode> clonedLabels)
From source file:pxb.android.dex2jar.optimize.B.java
License:Apache License
/** * <pre>// w w w .j a v a 2s .com * BEFORE: * LDC Ljavax/servlet/GenericServlet;.class * ASTORE 1 * LDC "/javax/servlet/LocalStrings.properties" * ASTORE 2 * ALOAD 1 * ALOAD 2 * INVOKEVIRTUAL Ljava/lang/Class;.getResourceAsStream (Ljava/lang/String;)Ljava/io/InputStream; * ASTORE 1 * NEW Ljava/util/PropertyResourceBundle; * DUP * ALOAD 1 * INVOKESPECIAL Ljava/util/PropertyResourceBundle;.<init> (Ljava/io/InputStream;)V * ASTORE 0 * ALOAD 0 * PUTSTATIC Ljavax/servlet/GenericServlet;.lStrings : Ljava/util/ResourceBundle; * </pre> * * <pre> * AFTER: * LDC Ljavax/servlet/GenericServlet;.class * LDC "/javax/servlet/LocalStrings.properties" * INVOKEVIRTUAL Ljava/lang/Class;.getResourceAsStream (Ljava/lang/String;)Ljava/io/InputStream; * ASTORE 1 * NEW Ljava/util/PropertyResourceBundle; * DUP * ALOAD 1 * INVOKESPECIAL Ljava/util/PropertyResourceBundle;.<init> (Ljava/io/InputStream;)V * ASTORE 0 * ALOAD 0 * PUTSTATIC Ljavax/servlet/GenericServlet;.lStrings : Ljava/util/ResourceBundle; * </pre> * * @param block */ private void doLdc(Block block) { Map<Integer, LdcInsnNode> map = new HashMap<Integer, LdcInsnNode>(); AbstractInsnNode p = block.first.getNext(); while (p != null && p != block.last) { if (p.getOpcode() == Opcodes.LDC) { AbstractInsnNode q = p.getNext(); if (isWrite(q)) { Integer var = var(q); if (block.out.get(var) == null || block.out.get(var) != q) { map.put(var, (LdcInsnNode) p); insnList.remove(q); // remove store q = p.getPrevious(); insnList.remove(p); // remove ldc p = q; } } } else if (isRead(p)) { Integer var = var(p); if (block.out.get(var) == null || block.out.get(var) != p) { LdcInsnNode ldc = map.get(var); if (ldc != null) { AbstractInsnNode _ldc_copy = ldc.clone(null); insnList.insert(p, _ldc_copy); insnList.remove(p); p = _ldc_copy; } } } else if (isWrite(p)) { Integer var = var(p); map.remove(var); } p = p.getNext(); } }
From source file:pxb.android.dex2jar.optimize.B.java
License:Apache License
private boolean doOptmizeFirstBlockLdc(LdcInsnNode node, int r, Block block, Map<Block, Boolean> couldReplaceBlockIds, Set<Block> replacedBlockIds) { if (replacedBlockIds.contains(block)) { return true; }/* w ww .j a v a 2 s . c o m*/ replacedBlockIds.add(block); if (couldReplace(r, block, couldReplaceBlockIds)) { AbstractInsnNode p = block.first.getNext(); while (p != null && p != block.last) { if (isRead(p)) { int var = var(p); if (r == var) { LdcInsnNode nLdc = (LdcInsnNode) node.clone(null); AbstractInsnNode q = p.getNext(); insnList.remove(p); insnList.insertBefore(q, nLdc); p = q; continue; } } else if (isWrite(p)) { int var = var(p); if (r == var) { break; } } p = p.getNext(); } } else { return false; } boolean remove = true; if (!block.out.containsKey(r)) { for (Block subBlockId : block.tos) { boolean x = doOptmizeFirstBlockLdc(node, r, subBlockId, couldReplaceBlockIds, replacedBlockIds); if (!x) { remove = false; } } } return remove; }
From source file:pxb.android.dex2jar.optimize.B.java
License:Apache License
/** * @param block// www . j a v a2 s. com */ private void OptmizeFirstBlockLdc() { Block block = this.blocks.get(0); Map<Integer, LdcInsnNode> map = new HashMap<Integer, LdcInsnNode>(); AbstractInsnNode p = block.first.getNext(); while (p != null && p != block.last) { if (p.getOpcode() == Opcodes.LDC) { AbstractInsnNode q = p.getNext(); if (isWrite(q)) { int var = var(q); if (block.out.get(var) == q) { Map<Block, Boolean> couldReplace = new HashMap<Block, Boolean>(); Set<Block> replacedBlock = new HashSet<Block>(); replacedBlock.add(block); couldReplace.put(block, true); LdcInsnNode ldc = (LdcInsnNode) p; boolean remove = true; for (Block subBlock : block.tos) { boolean x = doOptmizeFirstBlockLdc(ldc, var, subBlock, couldReplace, replacedBlock); if (!x) { remove = false; } } if (remove) { insnList.remove(p); p = q.getNext(); insnList.remove(q); map.put(var, ldc); continue; } } } } else if (isRead(p)) { int var = var(p); LdcInsnNode ldc = map.get(var); if (ldc != null) { AbstractInsnNode q = p.getNext(); insnList.remove(p); insnList.insertBefore(q, ldc.clone(null)); p = q; continue; } } p = p.getNext(); } }