def name_and_type(name_index, descriptor_index): return u1(id_NameAndType) \ + u2(name_index) \ + u2(descriptor_index)
def string(utf8str): return u1(id_String) \ + u2(utf8str)
def field_ref(class_index, name_and_type_index): return u1(id_Fieldref) \ + u2(class_index) \ + u2(name_and_type_index)
def utf8(text): return u1(id_Utf8) \ + u2(len(text)) \ + str_to_byte(text)
def class_ref(name_index): return u1(id_Class) \ + u2(name_index)
def method_ref(class_index, name_and_type_index): return u1(id_Methodref) \ + u2(class_index) \ + u2(name_and_type_index)
def invokestatic(ref): return u1(0xB8) + u2(ref)
def _write(self, stream): # Java java_class file header (constant bytes + versions). stream.write(u4(Exporter.JAVA_FILE_HEADER)) stream.write(u2(self.output_class.version[1])) stream.write(u2(self.output_class.version[0])) # Pool table stream.write(u2(len(self.output_class.pool) + 1)) for entry in self.output_class.pool: stream.write(entry) # Access modifiers stream.write(u2(reduce(operator.xor, self.output_class.access_modifiers))) # "This" and "Super" classes stream.write(u2(self.output_class.pool.this_index)) stream.write(u2(self.output_class.pool.super_index)) # Interface table (not implemented) stream.write(u2(0)) # Field table stream.write(u2(len(self.output_class.fields))) for field in self.output_class.fields: stream.write(u2(field.access_flags)) stream.write(u2(field.name_index)) stream.write(u2(field.descriptor_index)) stream.write(u2(0)) # Writing fields with attributes has not been implemented. # Methods table stream.write(u2(len(self.output_class.methods))) for name_index, descriptor_index, access_flags, attributes in self.output_class.methods: stream.write(u2(access_flags)) stream.write(u2(name_index)) stream.write(u2(descriptor_index)) stream.write(u2(len(attributes))) # Attributes table within method table (e.g. contains "Code" attribute) for attribute in attributes: stream.write(u2(attribute["code_attribute_index"])) stream.write(u4(12 + attribute["code_length"])) stream.write(u2(attribute["max_stack"])) stream.write(u2(attribute["max_locals"])) stream.write(u4(attribute["code_length"])) for instruction in attribute["instructions"]: stream.write(instruction) stream.write(u2(0)) # Exception table not implemented stream.write(u2(0)) # Attributes of attributes not implemented # Attributes table (not implemented) stream.write(u2(0))
def getstatic(field_index): return u1(0xB2) + u2(field_index)
def getfield(ref): return u1(0xB4) + u2(ref)
def putstatic(ref): return u1(0xB3) + u2(ref)
def putfield(ref): return u1(0xB5) + u2(ref)
def invokevirtual(method): return u1(0xB6) + u2(method)