def get_field_ast(field): triple = field.get_class_name()[1:-1], field.get_name(), field.get_descriptor() expr = None if field.init_value: vt = field.init_value.get_value_type() val = field.init_value.value # TODO: Add other types once dvm.EncodedValue parses them correctly if vt == dvm.VALUE_STRING: expr = literal_string(val) # elif vt in (dvm.VALUE_INT, dvm.VALUE_SHORT, dvm.VALUE_CHAR): # expr = literal_int(val) elif vt == dvm.VALUE_BYTE: x = ord(val) expr = literal_int(x - 256 if x >= 128 else x) # elif vt == dvm.VALUE_LONG: # expr = literal_long(val) # elif vt == dvm.VALUE_DOUBLE: # expr = literal_double(val) # elif vt == dvm.VALUE_FLOAT: # expr = literal_float(val) elif vt == dvm.VALUE_NULL: expr = literal_null() elif vt == dvm.VALUE_BOOLEAN: expr = literal_bool(val) else: expr = dummy('???') return { 'triple': triple, 'type': parse_descriptor(field.get_descriptor()), 'flags': util.get_access_field(field.get_access_flags()), 'expr': expr, }
def get_source(self): source = [] if not self.inner and self.package: source.append('package %s;\n' % self.package) superclass, prototype = self.superclass, self.prototype if superclass is not None and superclass != 'Ljava/lang/Object;': superclass = superclass[1:-1].replace('/', '.') prototype += ' extends %s' % superclass if len(self.interfaces) > 0: prototype += ' implements %s' % ', '.join( [n[1:-1].replace('/', '.') for n in self.interfaces]) source.append('%s {\n' % prototype) for field in self.fields: name = field.get_name() access = util.get_access_field(field.get_access_flags()) f_type = util.get_type(field.get_descriptor()) source.append(' ') if access: source.append(' '.join(access)) source.append(' ') init_value = field.get_init_value() if init_value: value = init_value.value if f_type == 'String': if value: value = '"%s"' % value.encode("unicode-escape").decode( "ascii") else: # FIXME we can not check if this value here is null or "" # In both cases we end up here... value = '""' elif field.proto == 'B': # byte value: convert from unsiged int to signed and print as hex # as bytes are signed in Java value = hex(struct.unpack("b", struct.pack("B", value))[0]) source.append('%s %s = %s;\n' % (f_type, name, value)) else: source.append('%s %s;\n' % (f_type, name)) for method in self.methods: if isinstance(method, DvMethod): source.append(method.get_source()) source.append('}\n') return ''.join(source)
def get_source(self): source = [] if not self.inner and self.package: source.append('package %s;\n' % self.package) superclass, prototype = self.superclass, self.prototype if superclass is not None and superclass != 'Ljava/lang/Object;': superclass = superclass[1:-1].replace('/', '.') prototype += ' extends %s' % superclass if len(self.interfaces) > 0: prototype += ' implements %s' % ', '.join( [n[1:-1].replace('/', '.') for n in self.interfaces]) source.append('%s {\n' % prototype) for field in self.fields: name = field.get_name() access = util.get_access_field(field.get_access_flags()) f_type = util.get_type(field.get_descriptor()) source.append(' ') if access: source.append(' '.join(access)) source.append(' ') init_value = field.get_init_value() if init_value: value = init_value.value if f_type == 'String': if value: value = '"%s"' % value.encode("unicode-escape").decode("ascii") else: # FIXME we can not check if this value here is null or "" # In both cases we end up here... value = '""' elif field.proto == 'B': # byte value: convert from unsiged int to signed and print as hex # as bytes are signed in Java value = hex(struct.unpack("b", struct.pack("B", value))[0]) source.append('%s %s = %s;\n' % (f_type, name, value)) else: source.append('%s %s;\n' % (f_type, name)) for method in self.methods: if isinstance(method, DvMethod): source.append(method.get_source()) source.append('}\n') return ''.join(source)
def get_source(self): source = [] if not self.inner and self.package: source.append('package %s;\n' % self.package) superclass, prototype = self.superclass, self.prototype if superclass is not None and superclass != 'Ljava/lang/Object;': superclass = superclass[1:-1].replace('/', '.') prototype += ' extends %s' % superclass if len(self.interfaces) > 0: prototype += ' implements %s' % ', '.join( [n[1:-1].replace('/', '.') for n in self.interfaces]) source.append('%s {\n' % prototype) for field in self.fields: name = field.get_name() access = util.get_access_field(field.get_access_flags()) f_type = util.get_type(field.get_descriptor()) source.append(' ') if access: source.append(' '.join(access)) source.append(' ') if field.init_value: value = field.init_value.value if f_type == 'String': value = '"%s"' % value elif field.proto == 'B': value = '0x%x' % struct.unpack('b', value)[0] source.append('%s %s = %s;\n' % (f_type, name, value)) else: source.append('%s %s;\n' % (f_type, name)) for klass in self.subclasses.values(): source.append(klass.get_source()) for method in self.methods: if isinstance(method, DvMethod): source.append(method.get_source()) else: source.append(DvMethod(self.vma.get_method(method)).get_source( )) source.append('}\n') return ''.join(source)
def get_source(self): source = [] if not self.inner and self.package: source.append('package %s;\n' % self.package) superclass, prototype = self.superclass, self.prototype if superclass is not None and superclass != 'Ljava/lang/Object;': superclass = superclass[1:-1].replace('/', '.') prototype += ' extends %s' % superclass if len(self.interfaces) > 0: prototype += ' implements %s' % ', '.join( [n[1:-1].replace('/', '.') for n in self.interfaces]) source.append('%s {\n' % prototype) for field in self.fields: name = field.get_name() access = util.get_access_field(field.get_access_flags()) f_type = util.get_type(field.get_descriptor()) source.append(' ') if access: source.append(' '.join(access)) source.append(' ') if field.init_value: value = field.init_value.value if f_type == 'String': value = '"%s"' % value elif field.proto == 'B': value = '0x%x' % struct.unpack('b', value)[0] source.append('%s %s = %s;\n' % (f_type, name, value)) else: source.append('%s %s;\n' % (f_type, name)) for klass in self.subclasses.values(): source.append(klass.get_source()) for method in self.methods: if isinstance(method, DvMethod): source.append(method.get_source()) else: source.append( DvMethod(self.vma.get_method(method)).get_source()) source.append('}\n') return ''.join(source)
def get_field_ast(field): triple = field.get_class_name()[1:-1], field.get_name(), field.get_descriptor() expr = None if field.init_value: val = field.init_value.value expr = dummy(str(val)) if val is not None: if field.get_descriptor() == 'Ljava/lang/String;': expr = literal_string(val) elif field.proto == 'B': expr = literal_hex_int(struct.unpack('<b', val)[0]) return { 'triple': triple, 'type': parse_descriptor(field.get_descriptor()), 'flags': util.get_access_field(field.get_access_flags()), 'expr': expr, }
def get_field_ast(field): triple = field.get_class_name()[1:-1], field.get_name(), field.get_descriptor() expr = None if field.init_value: val = field.init_value.value expr = dummy(str(val)) if val is not None: if field.get_descriptor() == "Ljava/lang/String;": expr = literal_string(val) elif field.proto == "B": expr = literal_hex_int(struct.unpack("<b", val)[0]) return { "triple": triple, "type": parse_descriptor(field.get_descriptor()), "flags": util.get_access_field(field.get_access_flags()), "expr": expr, }
def get_source(self): source = [] if not self.inner and self.package: source.append('package %s;\n' % self.package) if self.superclass is not None: self.superclass = self.superclass[1:-1].replace('/', '.') if self.superclass.split('.')[-1] == 'Object': self.superclass = None if self.superclass is not None: self.prototype += ' extends %s' % self.superclass if self.interfaces is not None: interfaces = self.interfaces[1:-1].split(' ') self.prototype += ' implements %s' % ', '.join( [n[1:-1].replace('/', '.') for n in interfaces]) source.append('%s {\n' % self.prototype) for name, field in sorted(self.fields.iteritems()): access = util.get_access_field(field.get_access_flags()) f_type = util.get_type(field.get_descriptor()) source.append(' ') if access: source.append(' '.join(access)) source.append(' ') if field.init_value: value = field.init_value.value if f_type == 'String': value = '"%s"' % value source.append('%s %s = %s;\n' % (f_type, name, value)) else: source.append('%s %s;\n' % (f_type, name)) for klass in self.subclasses.values(): source.append(klass.get_source()) for _, method in self.methods.iteritems(): if isinstance(method, DvMethod): source.append(method.get_source()) source.append('}\n') return ''.join(source)
def get_source(self): source = [] if not self.inner and self.package: source.append("package %s;\n" % self.package) superclass, prototype = self.superclass, self.prototype if superclass is not None and superclass != "Ljava/lang/Object;": superclass = superclass[1:-1].replace("/", ".") prototype += " extends %s" % superclass if len(self.interfaces) > 0: prototype += " implements %s" % ", ".join([n[1:-1].replace("/", ".") for n in self.interfaces]) source.append("%s {\n" % prototype) for field in self.fields: name = field.get_name() access = util.get_access_field(field.get_access_flags()) f_type = util.get_type(field.get_descriptor()) source.append(" ") if access: source.append(" ".join(access)) source.append(" ") if field.init_value: value = field.init_value.value if f_type == "String": value = '"%s"' % value elif field.proto == "B": value = "0x%x" % struct.unpack("b", value)[0] source.append("%s %s = %s;\n" % (f_type, name, value)) else: source.append("%s %s;\n" % (f_type, name)) for klass in self.subclasses.values(): source.append(klass.get_source()) for method in self.methods: if isinstance(method, DvMethod): source.append(method.get_source()) source.append("}\n") return "".join(source)
def get_field_ast(field, annotations): triple = field.get_class_name()[1:-1], field.get_name( ), field.get_descriptor() expr = None if field.init_value: val = field.init_value.value expr = None if val is not None: descriptor = str(field.get_descriptor()) if descriptor == 'Ljava/lang/String;': expr = literal_string(val) elif descriptor == 'Z': expr = literal_bool(val == 'True') elif descriptor in 'ISC': expr = literal_int(val) elif field.proto == 'B': expr = literal_hex_int( struct.unpack('<b', struct.pack("B", val))[0]) elif descriptor in 'J': expr = literal_long(val) elif descriptor in 'F': expr = literal_float(val) elif descriptor in 'D': expr = literal_double(val) elif descriptor == 'Ljava/lang/Class;': expr = literal_class(val) else: expr = dummy(str(val)) return { 'triple': triple, 'type': parse_descriptor(field.get_descriptor()), 'flags': util.get_access_field(field.get_access_flags()), 'annotations': annotations, 'expr': expr, }