break; case ReferenceType.FIELD: dexPool.fieldSection.intern((FieldReference) reference); break; case ReferenceType.METHOD:
@Override public int getFieldIndex(@Nonnull Field field) { return getItemIndex(field); } }
@Nonnull @Override public FieldPool getFieldSection() { return new FieldPool(DexPool.this); }
public <C extends ClassDef> void writeClassesTo( List<C> classList, DexDataStoreFactory store) throws IOException { int dexNum = 0; DexPool dexPool = new DexPool(opcodes); ClassPool clsPool = dexPool.classSection; classList.sort(Comparator.comparing(ClassDef::getType)); for (ClassDef classDef : classList) { int numMethodIds = dexPool.methodSection.getItemCount(); int numFieldIds = dexPool.fieldSection.getItemCount(); int constantPoolSize = classDef.getDirectMethodCount() + classDef.getVirtualMethodCount() + classDef.getStaticFieldCount() + classDef.getInstanceFieldCount(); int maxMethodIdsInDex = numMethodIds + constantPoolSize + MAX_METHOD_ADDED_DURING_DEX_CREATION; int maxFieldIdsInDex = numFieldIds + constantPoolSize + MAX_FIELD_ADDED_DURING_DEX_CREATION; if (maxMethodIdsInDex > mMaxNumberOfIdxPerDex || maxFieldIdsInDex > mMaxNumberOfIdxPerDex) { dexPool.writeTo(store.getDataStore(dexNum)); dexNum++; dexPool = new DexPool(opcodes); clsPool = dexPool.classSection; } clsPool.intern(classDef); } dexPool.writeTo(store.getDataStore(dexNum)); }
@Override public int getFieldIndex(@Nonnull Field field) { return getItemIndex(field); } }
@Nonnull @Override public FieldPool getFieldSection() { return new FieldPool(DexPool.this); }
poolClassDef.getType(), fieldDescriptor); dexPool.fieldSection.intern(field);
@Override public int getFieldIndex(@Nonnull Field field) { return getItemIndex(field); } }
public static DexPool makeDexPool(int api) { StringPool stringPool = new StringPool(); TypePool typePool = new TypePool(stringPool); FieldPool fieldPool = new FieldPool(stringPool, typePool); TypeListPool typeListPool = new TypeListPool(typePool); ProtoPool protoPool = new ProtoPool(stringPool, typePool, typeListPool); MethodPool methodPool = new MethodPool(stringPool, typePool, protoPool); AnnotationPool annotationPool = new AnnotationPool(stringPool, typePool, fieldPool, methodPool); AnnotationSetPool annotationSetPool = new AnnotationSetPool(annotationPool); ClassPool classPool = new ClassPool(stringPool, typePool, fieldPool, methodPool, annotationSetPool, typeListPool); return new DexPool(api, stringPool, typePool, protoPool, fieldPool, methodPool, classPool, typeListPool, annotationPool, annotationSetPool); }
public void intern(MethodHandleReference methodHandleReference) { Integer prev = internedItems.put(methodHandleReference, 0); if (prev == null) { switch (methodHandleReference.getMethodHandleType()) { case MethodHandleType.STATIC_PUT: case MethodHandleType.STATIC_GET: case MethodHandleType.INSTANCE_PUT: case MethodHandleType.INSTANCE_GET: dexPool.fieldSection.intern((FieldReference) methodHandleReference.getMemberReference()); break; case MethodHandleType.INVOKE_STATIC: case MethodHandleType.INVOKE_INSTANCE: case MethodHandleType.INVOKE_CONSTRUCTOR: case MethodHandleType.INVOKE_DIRECT: case MethodHandleType.INVOKE_INTERFACE: dexPool.methodSection.intern((MethodReference) methodHandleReference.getMemberReference()); break; default: throw new ExceptionWithContext( "Invalid method handle type: %d", methodHandleReference.getMethodHandleType()); } } }
public void intern(MethodHandleReference methodHandleReference) { Integer prev = internedItems.put(methodHandleReference, 0); if (prev == null) { switch (methodHandleReference.getMethodHandleType()) { case MethodHandleType.STATIC_PUT: case MethodHandleType.STATIC_GET: case MethodHandleType.INSTANCE_PUT: case MethodHandleType.INSTANCE_GET: dexPool.fieldSection.intern((FieldReference) methodHandleReference.getMemberReference()); break; case MethodHandleType.INVOKE_STATIC: case MethodHandleType.INVOKE_INSTANCE: case MethodHandleType.INVOKE_CONSTRUCTOR: case MethodHandleType.INVOKE_DIRECT: case MethodHandleType.INVOKE_INTERFACE: dexPool.methodSection.intern((MethodReference) methodHandleReference.getMemberReference()); break; default: throw new ExceptionWithContext( "Invalid method handle type: %d", methodHandleReference.getMethodHandleType()); } } }
break; case ReferenceType.FIELD: fieldPool.intern((FieldReference) reference); break; case ReferenceType.METHOD:
break; case ReferenceType.FIELD: dexPool.fieldSection.intern((FieldReference) reference); break; case ReferenceType.METHOD:
poolClassDef.getType(), fieldDescriptor); fieldPool.intern(field);
poolClassDef.getType(), fieldDescriptor); dexPool.fieldSection.intern(field);