public EncodedValue readEncodedArray() { int start = data.position(); new EncodedValueReader(this, EncodedValueReader.ENCODED_ARRAY).skipValue(); return new EncodedValue(start, getBytesFrom(start)); }
private boolean isSameAnnotationByReader( Dex oldDex, Dex newDex, EncodedValueReader oldAnnoReader, EncodedValueReader newAnnoReader ) { int oldFieldCount = oldAnnoReader.readAnnotation(); int newFieldCount = newAnnoReader.readAnnotation(); if (oldFieldCount != newFieldCount) { return false; } int oldAnnoType = oldAnnoReader.getAnnotationType(); int newAnnoType = newAnnoReader.getAnnotationType(); if (!isSameClassDesc(oldDex, newDex, oldAnnoType, newAnnoType)) { return false; } for (int i = 0; i < oldFieldCount; ++i) { int oldAnnoNameIdx = oldAnnoReader.readAnnotationName(); int newAnnoNameIdx = newAnnoReader.readAnnotationName(); if (!isSameName(oldDex, newDex, oldAnnoNameIdx, newAnnoNameIdx)) { return false; } if (!isSameEncodedValue(oldDex, newDex, oldAnnoReader, newAnnoReader)) { return false; } } return true; }
switch (peek()) { case ENCODED_BYTE: readByte(); break; case ENCODED_SHORT: readShort(); break; case ENCODED_CHAR: readChar(); break; case ENCODED_INT: readInt(); break; case ENCODED_LONG: readLong(); break; case ENCODED_FLOAT: readFloat(); break; case ENCODED_DOUBLE: readDouble(); break; case ENCODED_STRING: readString(); break; case ENCODED_TYPE: readType(); break; case ENCODED_FIELD:
public int getTypeIndex() { EncodedValueReader reader = getReader(); reader.readAnnotation(); return reader.getAnnotationType(); }
public EncodedValueReader getReader() { return new EncodedValueReader(encodedAnnotation, ENCODED_ANNOTATION); }
private void transformArray(EncodedValueReader reader) { int size = reader.readArray(); Leb128.writeUnsignedLeb128(out, size); for (int i = 0; i < size; i++) { transform(reader); } }
public int getTypeIndex() { EncodedValueReader reader = getReader(); reader.readAnnotation(); return reader.getAnnotationType(); }
public EncodedValue adjust(EncodedValue encodedArray) { final ByteArrayOutputStream baos = new ByteArrayOutputStream(encodedArray.data.length); new EncodedValueTransformer( new ByteOutput() { @Override public void writeByte(int i) { baos.write(i); } } ).transformArray( new EncodedValueReader(encodedArray, EncodedValueReader.ENCODED_ARRAY) ); return new EncodedValue(encodedArray.off, baos.toByteArray()); }
private void transformArray(EncodedValueReader reader) { int size = reader.readArray(); Leb128.writeUnsignedLeb128(out, size); for (int i = 0; i < size; i++) { transform(reader); } }
EncodedValueReader newAnnoReader ) { int oldAnnoItemType = oldAnnoReader.peek(); int newAnnoItemType = newAnnoReader.peek(); byte oldByte = oldAnnoReader.readByte(); byte newByte = newAnnoReader.readByte(); return oldByte == newByte; short oldShort = oldAnnoReader.readShort(); short newShort = newAnnoReader.readShort(); return oldShort == newShort; int oldInt = oldAnnoReader.readInt(); int newInt = newAnnoReader.readInt(); return oldInt == newInt; long oldLong = oldAnnoReader.readLong(); long newLong = newAnnoReader.readLong(); return oldLong == newLong; char oldChar = oldAnnoReader.readChar(); char newChar = newAnnoReader.readChar(); return oldChar == newChar; float oldFloat = oldAnnoReader.readFloat(); float newFloat = newAnnoReader.readFloat(); return Float.compare(oldFloat, newFloat) == 0;
private void transformAnnotation(EncodedValueReader reader) { int fieldCount = reader.readAnnotation(); Leb128.writeUnsignedLeb128(out, adjustTypeIdIndex(reader.getAnnotationType())); Leb128.writeUnsignedLeb128(out, fieldCount); for (int i = 0; i < fieldCount; i++) { Leb128.writeUnsignedLeb128(out, adjustStringIndex(reader.readAnnotationName())); transform(reader); } }
public Annotation readAnnotation() { int off = data.position(); byte visibility = readByte(); int start = data.position(); new EncodedValueReader(this, EncodedValueReader.ENCODED_ANNOTATION).skipValue(); return new Annotation(off, visibility, new EncodedValue(start, getBytesFrom(start))); }
private boolean isSameStaticValue( Dex oldDex, Dex newDex, int oldStaticValueOffset, int newStaticValueOffset ) { if (oldStaticValueOffset == 0 && newStaticValueOffset == 0) { return true; } if (oldStaticValueOffset == 0 || newStaticValueOffset == 0) { return false; } EncodedValue oldStaticValue = oldDex.openSection(oldStaticValueOffset).readEncodedArray(); EncodedValue newStaticValue = newDex.openSection(newStaticValueOffset).readEncodedArray(); EncodedValueReader oldReader = new EncodedValueReader(oldStaticValue, EncodedValueReader.ENCODED_ARRAY); EncodedValueReader newReader = new EncodedValueReader(newStaticValue, EncodedValueReader.ENCODED_ARRAY); return isSameEncodedValue(oldDex, newDex, oldReader, newReader); }
private void transformArray(EncodedValueReader reader) { int size = reader.readArray(); Leb128.writeUnsignedLeb128(out, size); for (int i = 0; i < size; i++) { transform(reader); } }
public void transform(EncodedValueReader reader) { switch (reader.peek()) { case EncodedValueReader.ENCODED_BYTE: EncodedValueCodec.writeSignedIntegralValue(out, EncodedValueReader.ENCODED_BYTE, reader.readByte()); break; case EncodedValueReader.ENCODED_SHORT: EncodedValueCodec.writeSignedIntegralValue(out, EncodedValueReader.ENCODED_SHORT, reader.readShort()); break; case EncodedValueReader.ENCODED_INT: EncodedValueCodec.writeSignedIntegralValue(out, EncodedValueReader.ENCODED_INT, reader.readInt()); break; case EncodedValueReader.ENCODED_LONG: EncodedValueCodec.writeSignedIntegralValue(out, EncodedValueReader.ENCODED_LONG, reader.readLong()); break; case EncodedValueReader.ENCODED_CHAR: EncodedValueCodec.writeUnsignedIntegralValue(out, EncodedValueReader.ENCODED_CHAR, reader.readChar()); break; case EncodedValueReader.ENCODED_FLOAT: long longBits = ((long) Float.floatToIntBits(reader.readFloat())) << 32; EncodedValueCodec.writeRightZeroExtendedValue(out, EncodedValueReader.ENCODED_FLOAT, longBits); break; case EncodedValueReader.ENCODED_DOUBLE: EncodedValueCodec.writeRightZeroExtendedValue( out, EncodedValueReader.ENCODED_DOUBLE, Double.doubleToLongBits(reader.readDouble())); break; case EncodedValueReader.ENCODED_STRING: EncodedValueCodec.writeUnsignedIntegralValue( out, EncodedValueReader.ENCODED_STRING, adjustStringIndex(reader.readString())); break;
private boolean isSameAnnotationByReader( Dex oldDex, Dex newDex, EncodedValueReader oldAnnoReader, EncodedValueReader newAnnoReader ) { int oldFieldCount = oldAnnoReader.readAnnotation(); int newFieldCount = newAnnoReader.readAnnotation(); if (oldFieldCount != newFieldCount) { return false; } int oldAnnoType = oldAnnoReader.getAnnotationType(); int newAnnoType = newAnnoReader.getAnnotationType(); if (!isSameClassDesc(oldDex, newDex, oldAnnoType, newAnnoType)) { return false; } for (int i = 0; i < oldFieldCount; ++i) { int oldAnnoNameIdx = oldAnnoReader.readAnnotationName(); int newAnnoNameIdx = newAnnoReader.readAnnotationName(); if (!isSameName(oldDex, newDex, oldAnnoNameIdx, newAnnoNameIdx)) { return false; } if (!isSameEncodedValue(oldDex, newDex, oldAnnoReader, newAnnoReader)) { return false; } } return true; }
public EncodedValue readEncodedArray() { int start = data.position(); new EncodedValueReader(this, EncodedValueReader.ENCODED_ARRAY).skipValue(); return new EncodedValue(start, getBytesFrom(start)); }
public EncodedValueReader getReader() { return new EncodedValueReader(encodedAnnotation, ENCODED_ANNOTATION); }