private void writeEncodedFields(@Nonnull DexDataWriter writer, @Nonnull Collection<? extends FieldKey> fields) throws IOException { int prevIndex = 0; for (FieldKey key: fields) { int index = fieldSection.getFieldIndex(key); writer.writeUleb128(index - prevIndex); writer.writeUleb128(classSection.getFieldAccessFlags(key)); prevIndex = index; } }
private void writeEncodedMethods(@Nonnull DexDataWriter writer, @Nonnull Collection<? extends MethodKey> methods) throws IOException { int prevIndex = 0; for (MethodKey key: methods) { int index = methodSection.getMethodIndex(key); writer.writeUleb128(index-prevIndex); writer.writeUleb128(classSection.getMethodAccessFlags(key)); writer.writeUleb128(classSection.getCodeItemOffset(key)); prevIndex = index; } }
private void writeStrings(@Nonnull DexDataWriter indexWriter, @Nonnull DexDataWriter offsetWriter) throws IOException { stringIndexSectionOffset = indexWriter.getPosition(); stringDataSectionOffset = offsetWriter.getPosition(); int index = 0; List<Entry<? extends StringKey, Integer>> stringEntries = Lists.newArrayList(stringSection.getItems()); Collections.sort(stringEntries, toStringKeyComparator); for (Map.Entry<? extends StringKey, Integer> entry: stringEntries) { entry.setValue(index++); indexWriter.writeInt(offsetWriter.getPosition()); String stringValue = entry.getKey().toString(); offsetWriter.writeUleb128(stringValue.length()); offsetWriter.writeString(stringValue); offsetWriter.write(0); } }
private void writeEncodedArrays(@Nonnull DexDataWriter writer) throws IOException { InternalEncodedValueWriter encodedValueWriter = new InternalEncodedValueWriter(writer); encodedArraySectionOffset = writer.getPosition(); for (Map.Entry<? extends EncodedArrayKey, Integer> entry: encodedArraySection.getItems()) { entry.setValue(writer.getPosition()); List<? extends EncodedValue> encodedArray = encodedArraySection.getEncodedValueList(entry.getKey()); writer.writeUleb128(encodedArray.size()); for (EncodedValue value: encodedArray) { writeEncodedValue(encodedValueWriter, value); } } }
writer.writeUleb128(startingLineNumber); writer.writeUleb128(parameterCount); if (parameterNames != null) { int index = 0; writer.writeUleb128(stringSection.getNullableItemIndex(parameterName) + 1);
private void writeAnnotations(@Nonnull DexDataWriter writer) throws IOException { InternalEncodedValueWriter encodedValueWriter = new InternalEncodedValueWriter(writer); annotationSectionOffset = writer.getPosition(); for (Map.Entry<? extends AnnotationKey, Integer> entry: annotationSection.getItems()) { entry.setValue(writer.getPosition()); AnnotationKey key = entry.getKey(); writer.writeUbyte(annotationSection.getVisibility(key)); writer.writeUleb128(typeSection.getItemIndex(annotationSection.getType(key))); Collection<? extends AnnotationElement> elements = Ordering.from(BaseAnnotationElement.BY_NAME) .immutableSortedCopy(annotationSection.getElements(key)); writer.writeUleb128(elements.size()); for (AnnotationElement element: elements) { writer.writeUleb128(stringSection.getItemIndex(annotationSection.getElementName(element))); writeEncodedValue(encodedValueWriter, annotationSection.getElementValue(element)); } } }
numClassDataItems++; offsetWriter.writeUleb128(staticFields.size()); offsetWriter.writeUleb128(instanceFields.size()); offsetWriter.writeUleb128(directMethods.size()); offsetWriter.writeUleb128(virtualMethods.size());
exceptionHandlerOffsetMap.put(tryBlock.getExceptionHandlers(), 0); DexDataWriter.writeUleb128(ehBuf, exceptionHandlerOffsetMap.size()); DexDataWriter.writeUleb128(ehBuf, typeSection.getItemIndex(exceptionTypeKey)); DexDataWriter.writeUleb128(ehBuf, codeAddress); } else { DexDataWriter.writeUleb128(ehBuf, codeAddress);
private void writeAdvancePC(int address) throws IOException { int addressDelta = address - currentAddress; if (addressDelta > 0) { writer.write(1); writer.writeUleb128(addressDelta); currentAddress = address; } /*else if (addressDelta < 0) { throw new ExceptionWithContext("debug info items must have non-decreasing code addresses"); }*/ }
private void writeEncodedFields(@Nonnull DexDataWriter writer, @Nonnull Collection<? extends FieldKey> fields) throws IOException { int prevIndex = 0; for (FieldKey key: fields) { int index = fieldSection.getFieldIndex(key); writer.writeUleb128(index - prevIndex); writer.writeUleb128(classSection.getFieldAccessFlags(key)); prevIndex = index; } }
private void writeEncodedMethods(@Nonnull DexDataWriter writer, @Nonnull Collection<? extends MethodKey> methods) throws IOException { int prevIndex = 0; for (MethodKey key: methods) { int index = methodSection.getMethodIndex(key); writer.writeUleb128(index-prevIndex); writer.writeUleb128(classSection.getMethodAccessFlags(key)); writer.writeUleb128(classSection.getCodeItemOffset(key)); prevIndex = index; } }
public void writeArray(Collection<? extends EncodedValue> elements) throws IOException { writer.writeEncodedValueHeader(ValueType.ARRAY, 0); writer.writeUleb128(elements.size()); for (EncodedValue element: elements) { writeEncodedValue(element); } }
public void writeRestartLocal(int codeAddress, int register) throws IOException { writeAdvancePC(codeAddress); writer.write(DebugItemType.RESTART_LOCAL); writer.writeUleb128(register); }
public void writeAnnotation(TypeKey annotationType, Collection<? extends AnnotationElement> elements) throws IOException { writer.writeEncodedValueHeader(ValueType.ANNOTATION, 0); writer.writeUleb128(typeSection.getItemIndex(annotationType)); writer.writeUleb128(elements.size()); Collection<? extends AnnotationElement> sortedElements = Ordering.from(BaseAnnotationElement.BY_NAME) .immutableSortedCopy(elements); for (AnnotationElement element: sortedElements) { writer.writeUleb128(stringSection.getItemIndex(annotationSection.getElementName(element))); writeEncodedValue(annotationSection.getElementValue(element)); } }
public void writeEndLocal(int codeAddress, int register) throws IOException { writeAdvancePC(codeAddress); writer.write(DebugItemType.END_LOCAL); writer.writeUleb128(register); }
public void writeEndLocal(int codeAddress, int register) throws IOException { writeAdvancePC(codeAddress); writer.write(DebugItemType.END_LOCAL); writer.writeUleb128(register); }
public void writeRestartLocal(int codeAddress, int register) throws IOException { writeAdvancePC(codeAddress); writer.write(DebugItemType.RESTART_LOCAL); writer.writeUleb128(register); }
public void writeSetSourceFile(int codeAddress, @Nullable StringKey sourceFile) throws IOException { writeAdvancePC(codeAddress); writer.write(DebugItemType.SET_SOURCE_FILE); writer.writeUleb128(stringSection.getNullableItemIndex(sourceFile) + 1); }
public void writeSetSourceFile(int codeAddress, @Nullable StringKey sourceFile) throws IOException { writeAdvancePC(codeAddress); writer.write(DebugItemType.SET_SOURCE_FILE); writer.writeUleb128(stringSection.getNullableItemIndex(sourceFile) + 1); }
private void performTest(int integerValue, byte[] encodedValue, int encodedLength) throws IOException { setup(); writer.writeUleb128(integerValue); writer.flush(); byte[] writtenData = output.getBuffer(); Assert.assertEquals(startPosition + encodedLength, writer.getPosition()); for (int i=0; i<encodedLength; i++) { Assert.assertEquals(String.format("Values not equal at index %d", i), encodedValue[i], writtenData[i]); } } }