Example #1
0
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,
    }
Example #2
0
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,
    }
Example #3
0
    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)
Example #4
0
    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)
Example #5
0
    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)
Example #6
0
    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)
Example #7
0
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,
    }
Example #8
0
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,
    }
Example #9
0
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,
    }
Example #10
0
    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)
Example #11
0
    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)
Example #12
0
    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)
Example #13
0
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,
    }