Пример #1
0
 def setUp(self):
     _, self.obj = heap._create_class(self, self.names['obj'], None, {},
                                      ('shadow', ))
     _, self.cls = heap._create_class(self, self.names['cls'], self.obj, {},
                                      ('secret', ))
     _, self.lst = heap._create_class(self, self.names['lst'], self.obj, {},
                                      ('next', ))
     _, self.inr = heap._create_class(self, self.names['inn'], self.obj, {},
                                      ('this$0', ))
     _, self.shd = heap._create_class(self, self.names['shd'], self.lst, {},
                                      ('shadow', 'unique'))
Пример #2
0
    def test_prim_array_deferred_short(self):
        _, sacls = heap._create_class(self, self.names['Sar'], self.obj, {},
                                      (), ())
        data = hprof.heap._DeferredArrayData(
            jtype.short, b'\x23\x10\xff\x10\x00\x00\x21\x78')
        sarr = sacls(8, data)

        self.assertEqual(sarr._hprof_id, 8)
        self.assertEqual(len(sarr), 4)
        self.assertEqual(sarr[0], 0x2310)
        self.assertEqual(sarr[1], 0xff10 - 0x10000)
        self.assertEqual(sarr[2], 0)
        self.assertEqual(sarr[3], 0x2178)

        sarr._hprof_array_data = data
        self.assertEqual(sarr._hprof_id, 8)
        self.assertEqual(sarr[1], 0xff10 - 0x10000)
        self.assertEqual(sarr[3], 0x2178)
        self.assertEqual(len(sarr), 4)
        self.assertEqual(sarr[2], 0)
        self.assertEqual(sarr[0], 0x2310)

        with self.assertRaises(IndexError):
            sarr[4]

        self.assertEqual(str(sarr), 'short[4] {8976, -240, 0, 8568}')
        self.assertEqual(repr(sarr), '<short[4] 0x8>')
Пример #3
0
 def test_double_dollar(self):
     _, lambdacls = heap._create_class(self, self.names['lam'], self.obj,
                                       {'line': 79},
                                       ('closure_x', 'closure_y'),
                                       (jtype.int, jtype.int))
     self.assertEqual(str(lambdacls),
                      'com.example.Vehicle$$Lambda$1/455659002')
     lambdaobj = lambdacls(33)
     self.obj._hprof_ifieldvals.__set__(lambdaobj, (11, ))
     lambdacls._hprof_ifieldvals.__set__(lambdaobj, (10, 20))
     with self.assertRaises(AttributeError):
         lambdaobj.missing
     with self.assertRaises(AttributeError):
         lambdaobj.missing = 3
     with self.assertRaises(AttributeError):
         lambdaobj.closure_x = 3
     self.assertEqual(lambdaobj._hprof_id, 33)
     self.assertEqual(lambdaobj.shadow, 11)
     self.assertEqual(lambdaobj.closure_x, 10)
     self.assertEqual(lambdaobj.closure_y, 20)
     self.assertEqual(lambdaobj.line, 79)
     self.assertIsInstance(lambdaobj, heap.JavaObject)
     self.assertIsInstance(lambdaobj, self.obj)
     self.assertIsInstance(lambdaobj, lambdacls)
     self.assertEqual(str(lambdaobj), 'Vehicle$$Lambda$1/455659002@21')
     self.assertEqual(repr(lambdaobj),
                      '<com.example.Vehicle$$Lambda$1/455659002 0x21>')
     self.assertCountEqual(dir(lambdaobj),
                           ('shadow', 'closure_x', 'closure_y', 'line'))
 def c(name, supercls):
     name, cls = _create_class(self.heap.classtree, name, supercls, {},
                               (), ())
     self.heap._instances[cls] = []
     if name not in self.heap.classes:
         self.heap.classes[name] = []
     self.heap.classes[name].append(cls)
     return cls
Пример #5
0
 def test_refs_to_class(self):
     _, string = heap._create_class(self, self.names['str'], self.obj, {},
                                    ('chars', ), (jtype.object, ))
     o = hprof.cast(string, self.obj)
     c = hprof.cast(string, self.cls)
     self.assertIs(o, string)
     self.assertIs(c, string)
     with self.assertRaises(TypeError):
         hprof.cast(string, string)
     with self.assertRaises(TypeError):
         hprof.cast(string, self.lst)
Пример #6
0
    def test_prim_array(self):
        _, sacls = heap._create_class(self, self.names['Sar'], self.obj, {},
                                      (), ())
        self.assertEqual(str(sacls), 'short[]')
        self.assertEqual(repr(sacls), "<JavaClass 'short[]'>")
        self.assertTrue(isinstance(sacls, heap.JavaClass))
        self.assertTrue(isinstance(sacls, heap.JavaArrayClass))
        self.assertTrue(issubclass(sacls, heap.JavaObject))
        self.assertTrue(issubclass(sacls, heap.JavaArray))
        self.assertTrue(issubclass(sacls, self.obj))

        sarr = sacls(1, (1, 2, 9))
        self.obj._hprof_ifieldvals.__set__(sarr, (0xf00d, ))

        self.assertCountEqual(dir(sarr), ('shadow', ))
        self.assertEqual(sarr._hprof_id, 1)
        self.assertEqual(sarr.shadow, 0xf00d)

        self.assertEqual(len(sarr), 3)
        self.assertEqual(sarr[0], 1)
        self.assertEqual(sarr[1], 2)
        self.assertEqual(sarr[2], 9)
        self.assertEqual(sarr[-1], 9)
        self.assertEqual(sarr[-2], 2)
        self.assertEqual(sarr[-3], 1)
        self.assertEqual(sarr[:], (1, 2, 9))
        self.assertEqual(sarr[1:], (2, 9))
        self.assertEqual(sarr[:2], (1, 2))
        self.assertEqual(sarr[:-1], (1, 2))
        self.assertEqual(sarr[2:], (9, ))
        self.assertEqual(sarr[:0], ())
        self.assertEqual(sarr[:1], (1, ))
        with self.assertRaises(IndexError):
            sarr[3]
        with self.assertRaises(IndexError):
            sarr[-4]
        with self.assertRaises(TypeError):
            sarr['hello']
        self.assertIn(1, sarr)
        self.assertIn(2, sarr)
        self.assertIn(9, sarr)
        self.assertNotIn(3, sarr)
        self.assertNotIn(4, sarr)
        self.assertNotIn(5, sarr)
        self.assertNotIn(-1, sarr)
        for i, x in enumerate(sarr):
            self.assertEqual(x, sarr[i])
        self.assertEqual(i, 2)

        self.assertEqual(str(sarr), 'short[3] {1, 2, 9}')
        self.assertEqual(repr(sarr), '<short[3] 0x1>')
Пример #7
0
    def test_prim_array_deferred_double(self):
        _, acls = heap._create_class(self, self.names['Dar'], self.obj, {}, ())
        arr = acls(1)
        data = hprof.heap._DeferredArrayData(
            hprof.jtype.double,
            b'\x23\x10\xff\x80\x00\x00\x7f\x78\x84\x25\x66\x76\x12\x34\x56\x78'
        )

        arr._hprof_array_data = data
        self.assertEqual(len(arr), 2)
        self.assertEqual(arr[0], 8.921154138878651e-140)
        self.assertEqual(arr[1], -1.0979758629196027e-288)
        with self.assertRaises(IndexError):
            arr[2]
Пример #8
0
    def test_prim_array_deferred_float(self):
        _, acls = heap._create_class(self, self.names['Far'], self.obj, {}, ())
        arr = acls(1)
        data = hprof.heap._DeferredArrayData(
            hprof.jtype.float,
            b'\x23\x10\xff\x80\x00\x00\x7f\x78\x84\x25\x66\x76')

        arr._hprof_array_data = data
        self.assertEqual(len(arr), 3)
        self.assertEqual(arr[0], 7.8603598714015e-18)
        self.assertEqual(arr[1], 4.572717148784743e-41)
        self.assertEqual(arr[2], -1.944270454372837e-36)
        with self.assertRaises(IndexError):
            arr[3]
Пример #9
0
    def test_prim_array_deferred_long(self):
        _, acls = heap._create_class(self, self.names['Jar'], self.obj, {}, ())
        arr = acls(1)
        data = hprof.heap._DeferredArrayData(
            hprof.jtype.long,
            b'\x23\x10\xff\x80\x00\x00\x7f\x78\x84\x25\x66\x76\x12\x34\x56\x78'
        )

        arr._hprof_array_data = data
        self.assertEqual(len(arr), 2)
        self.assertEqual(arr[0], 0x2310ff8000007f78)
        self.assertEqual(arr[1], 0x8425667612345678 - 0x10000000000000000)
        with self.assertRaises(IndexError):
            arr[2]
Пример #10
0
    def test_prim_array_deferred_int(self):
        _, acls = heap._create_class(self, self.names['Iar'], self.obj, {}, ())
        arr = acls(1)
        data = hprof.heap._DeferredArrayData(
            hprof.jtype.int,
            b'\x23\x10\xff\x80\x00\x00\x7f\x78\x84\x25\x66\x76')

        arr._hprof_array_data = data
        self.assertEqual(len(arr), 3)
        self.assertEqual(arr[0], 0x2310ff80)
        self.assertEqual(arr[1], 0x00007f78)
        self.assertEqual(arr[2], 0x84256676 - 0x100000000)
        with self.assertRaises(IndexError):
            arr[3]
Пример #11
0
 def test_dollar_prefix_class_name(self):
     for clsname in ('java.reflect.$Proxy2', '$Proxy3'):
         with self.subTest(clsname):
             outname, proxy_class = heap._create_class(
                 self, clsname, self.obj, {'I_AM_A_PROXY': True},
                 ('proxied', ), (jtype.object, ))
             self.assertTrue(issubclass(proxy_class, self.obj))
             self.assertFalse(issubclass(self.obj, proxy_class))
             self.assertEqual(outname, clsname)
             self.assertIs(proxy_class.I_AM_A_PROXY, True)
     self.assertIsInstance(self.java, heap.JavaPackage)
     self.assertIsInstance(self.java.reflect, heap.JavaPackage)
     self.assertIsInstance(getattr(self.java.reflect, '$Proxy2'),
                           heap.JavaClassName)
     self.assertIsInstance(getattr(self, '$Proxy3'), heap.JavaClassName)
Пример #12
0
    def test_prim_array_deferred_int(self):
        _, acls = heap._create_class(self, self.names['Iar'], self.obj, {}, (),
                                     ())
        data = hprof.heap._DeferredArrayData(
            jtype.int, b'\x23\x10\xff\x80\x00\x00\x7f\x78\x84\x25\x66\x76')
        arr = acls(16, data)

        self.assertEqual(arr._hprof_id, 16)
        self.assertEqual(len(arr), 3)
        self.assertEqual(arr[0], 0x2310ff80)
        self.assertEqual(arr[1], 0x00007f78)
        self.assertEqual(arr[2], 0x84256676 - 0x100000000)
        with self.assertRaises(IndexError):
            arr[3]

        self.assertEqual(str(arr), 'int[3] {588316544, 32632, -2077923722}')
        self.assertEqual(repr(arr), '<int[3] 0x10>')
Пример #13
0
    def test_prim_array_deferred_bool(self):
        _, acls = heap._create_class(self, self.names['Zar'], self.obj, {}, ())
        arr = acls(1)
        data = hprof.heap._DeferredArrayData(
            hprof.jtype.boolean, b'\x23\x10\xff\x10\x00\x00\x21\x78')

        arr._hprof_array_data = data
        self.assertEqual(len(arr), 8)
        self.assertIs(arr[0], True)
        self.assertIs(arr[1], True)
        self.assertIs(arr[2], True)
        self.assertIs(arr[3], True)
        self.assertIs(arr[4], False)
        self.assertIs(arr[5], False)
        self.assertIs(arr[6], True)
        self.assertIs(arr[7], True)
        with self.assertRaises(IndexError):
            arr[8]
Пример #14
0
    def test_prim_array_deferred_char(self):
        _, acls = heap._create_class(self, self.names['Car'], self.obj, {}, ())
        arr = acls(1)
        data = hprof.heap._DeferredArrayData(
            hprof.jtype.char,
            b'\0\x57\0\xf6\0\x72\0\x6c\xd8\x01\xdc\x00\0\x21')

        arr._hprof_array_data = data
        self.assertEqual(len(arr), 7)
        self.assertEqual(arr[0], 'W')
        self.assertEqual(arr[1], 'ö')
        self.assertEqual(arr[2], 'r')
        self.assertEqual(arr[3], 'l')
        self.assertEqual(arr[4], '\ud801')
        self.assertEqual(arr[5], '\udc00')
        self.assertEqual(arr[6], '!')
        with self.assertRaises(IndexError):
            arr[7]
Пример #15
0
    def test_prim_array_deferred_long(self):
        _, acls = heap._create_class(self, self.names['Jar'], self.obj, {}, (),
                                     ())
        data = hprof.heap._DeferredArrayData(
            jtype.long,
            b'\x23\x10\xff\x80\x00\x00\x7f\x78\x84\x25\x66\x76\x12\x34\x56\x78'
        )
        arr = acls(15, data)

        self.assertEqual(arr._hprof_id, 15)
        self.assertEqual(len(arr), 2)
        self.assertEqual(arr[0], 0x2310ff8000007f78)
        self.assertEqual(arr[1], 0x8425667612345678 - 0x10000000000000000)
        with self.assertRaises(IndexError):
            arr[2]

        self.assertEqual(
            str(arr), 'long[2] {2526800316175777656, -8924614429267175816}')
        self.assertEqual(repr(arr), '<long[2] 0xf>')
Пример #16
0
    def test_prim_array_deferred_byte(self):
        _, acls = heap._create_class(self, self.names['Bar'], self.obj, {}, ())
        arr = acls(1)
        data = hprof.heap._DeferredArrayData(
            hprof.jtype.byte, b'\x23\x10\xff\x80\x00\x00\x7f\x78\x84')

        arr._hprof_array_data = data
        self.assertEqual(len(arr), 9)
        self.assertEqual(arr[0], 0x23)
        self.assertEqual(arr[1], 0x10)
        self.assertEqual(arr[2], -1)
        self.assertEqual(arr[3], -128)
        self.assertEqual(arr[4], 0x00)
        self.assertEqual(arr[5], 0x00)
        self.assertEqual(arr[6], 127)
        self.assertEqual(arr[7], 0x78)
        self.assertEqual(arr[8], -124)
        with self.assertRaises(IndexError):
            arr[9]
Пример #17
0
    def test_prim_array_deferred_char(self):
        _, acls = heap._create_class(self, self.names['Car'], self.obj, {}, (),
                                     ())
        data = hprof.heap._DeferredArrayData(
            jtype.char, b'\0\x57\0\xf6\0\x72\0\x6c\xd8\x01\xdc\x00\0\x21')
        arr = acls(2, data)

        self.assertEqual(arr._hprof_id, 2)
        self.assertEqual(len(arr), 7)
        self.assertEqual(arr[0], 'W')
        self.assertEqual(arr[1], 'ö')
        self.assertEqual(arr[2], 'r')
        self.assertEqual(arr[3], 'l')
        self.assertEqual(arr[4], '\ud801')
        self.assertEqual(arr[5], '\udc00')
        self.assertEqual(arr[6], '!')
        with self.assertRaises(IndexError):
            arr[7]

        self.assertEqual(
            str(arr),
            "char[7] {'W', 'ö', 'r', 'l', '\\ud801', '\\udc00', '!'}")
        self.assertEqual(repr(arr), '<char[7] 0x2>')
Пример #18
0
    def test_prim_array_deferred_short(self):
        _, sacls = heap._create_class(self, self.names['Sar'], self.obj, {},
                                      ())
        sarr = sacls(1)
        data = hprof.heap._DeferredArrayData(
            hprof.jtype.short, b'\x23\x10\xff\x10\x00\x00\x21\x78')

        sarr._hprof_array_data = data
        self.assertEqual(len(sarr), 4)
        self.assertEqual(sarr[0], 0x2310)
        self.assertEqual(sarr[1], 0xff10 - 0x10000)
        self.assertEqual(sarr[2], 0)
        self.assertEqual(sarr[3], 0x2178)

        sarr._hprof_array_data = data
        self.assertEqual(sarr[1], 0xff10 - 0x10000)
        self.assertEqual(sarr[3], 0x2178)
        self.assertEqual(len(sarr), 4)
        self.assertEqual(sarr[2], 0)
        self.assertEqual(sarr[0], 0x2310)

        with self.assertRaises(IndexError):
            sarr[4]
Пример #19
0
    def test_prim_array_deferred_byte(self):
        _, acls = heap._create_class(self, self.names['Bar'], self.obj, {}, (),
                                     ())
        data = hprof.heap._DeferredArrayData(
            jtype.byte, b'\x23\x10\xff\x80\x00\x00\x7f\x78\x84')
        arr = acls(4, data)

        self.assertEqual(arr._hprof_id, 4)
        self.assertEqual(len(arr), 9)
        self.assertEqual(arr[0], 0x23)
        self.assertEqual(arr[1], 0x10)
        self.assertEqual(arr[2], -1)
        self.assertEqual(arr[3], -128)
        self.assertEqual(arr[4], 0x00)
        self.assertEqual(arr[5], 0x00)
        self.assertEqual(arr[6], 127)
        self.assertEqual(arr[7], 0x78)
        self.assertEqual(arr[8], -124)
        with self.assertRaises(IndexError):
            arr[9]

        self.assertEqual(str(arr),
                         'byte[9] {35, 16, -1, -128, 0, 0, 127, 120, -124}')
        self.assertEqual(repr(arr), '<byte[9] 0x4>')
Пример #20
0
    def test_prim_array_deferred_bool(self):
        _, acls = heap._create_class(self, self.names['Zar'], self.obj, {}, (),
                                     ())
        data = hprof.heap._DeferredArrayData(
            jtype.boolean, b'\x23\x10\xff\x10\x00\x00\x21\x78')
        arr = acls(1, data)

        self.assertEqual(arr._hprof_id, 1)
        self.assertEqual(len(arr), 8)
        self.assertIs(arr[0], True)
        self.assertIs(arr[1], True)
        self.assertIs(arr[2], True)
        self.assertIs(arr[3], True)
        self.assertIs(arr[4], False)
        self.assertIs(arr[5], False)
        self.assertIs(arr[6], True)
        self.assertIs(arr[7], True)
        with self.assertRaises(IndexError):
            arr[8]

        self.assertEqual(
            str(arr),
            'boolean[8] {True, True, True, True, False, False, True, True}')
        self.assertEqual(repr(arr), '<boolean[8] 0x1>')
Пример #21
0
 def test_duplicate_class(self):
     old = self.java.lang.Class
     _, newcls = heap._create_class(self, self.names['cls'], self.obj, {},
                                    ('secret', ), (jtype.int, ))
     self.assertIs(old, self.java.lang.Class)  # same name object
     self.assertIsNot(newcls, self.cls)
Пример #22
0
    def test_refs(self):
        _, extraclass = heap._create_class(self, self.names['ext'], self.shd,
                                           {}, ('shadow', ), (jtype.int, ))
        e = extraclass(0xbadf00d)
        self.obj._hprof_ifieldvals.__set__(e, (1111, ))
        self.lst._hprof_ifieldvals.__set__(e, (708, ))
        self.shd._hprof_ifieldvals.__set__(e, (2223, 33))
        extraclass._hprof_ifieldvals.__set__(e, (10, ))

        self.assertEqual(e.shadow, 10)
        self.assertEqual(e.unique, 33)
        self.assertEqual(e.next, 708)
        self.assertCountEqual(dir(e), ('shadow', 'unique', 'next'))
        self.assertEqual(str(e), 'Extra@badf00d')
        self.assertEqual(repr(e), '<Extra 0xbadf00d>')

        r = heap.Ref(e, extraclass)
        self.assertIs(r,
                      e)  # no reason to use Ref when reftype matches exactly.

        s = hprof.cast(e, self.shd)
        self.assertEqual(s, e)
        self.assertEqual(s.shadow, 2223)
        self.assertEqual(s.unique, 33)
        self.assertEqual(s.next, 708)
        self.assertCountEqual(dir(s), ('shadow', 'unique', 'next'))
        self.assertEqual(str(s), '<Ref of type Shadower to Extra 0xbadf00d>')
        self.assertEqual(repr(s), str(s))
        self.assertIsInstance(s, self.obj)
        self.assertIsInstance(s, self.lst)
        self.assertIsInstance(s, self.shd)
        self.assertIsInstance(s, extraclass)
        self.assertNotIsInstance(s, self.cls)

        l = hprof.cast(e, self.lst)
        self.assertEqual(l.shadow, 1111)
        self.assertEqual(l, e)
        with self.assertRaises(AttributeError):
            self.assertEqual(l.unique, 33)
        self.assertEqual(l.next, 708)
        self.assertCountEqual(dir(l), ('shadow', 'next'))
        self.assertEqual(str(l),
                         '<Ref of type java.util.List to Extra 0xbadf00d>')
        self.assertEqual(repr(l), str(l))
        self.assertIsInstance(l, self.obj)
        self.assertIsInstance(l, self.lst)
        self.assertIsInstance(l, self.shd)
        self.assertIsInstance(l, extraclass)
        self.assertNotIsInstance(l, self.cls)

        o = hprof.cast(e, self.obj)
        self.assertEqual(o, e)
        self.assertEqual(o.shadow, 1111)
        with self.assertRaises(AttributeError):
            self.assertEqual(o.unique, 33)
        with self.assertRaises(AttributeError):
            self.assertEqual(o.next, 708)
        self.assertCountEqual(dir(o), ('shadow', ))
        self.assertEqual(str(o),
                         '<Ref of type java.lang.Object to Extra 0xbadf00d>')
        self.assertEqual(repr(o), str(o))
        self.assertIsInstance(o, self.obj)
        self.assertIsInstance(o, self.lst)
        self.assertIsInstance(o, self.shd)
        self.assertIsInstance(o, extraclass)
        self.assertNotIsInstance(o, self.cls)
Пример #23
0
 def check(name, expected):
     clsname, cls = heap._create_class(self, name, self.obj, {}, (), ())
     self.assertIsNone(cls.__module__)
     self.assertEqual(clsname, expected)
     self.assertEqual(str(cls), expected)
     self.assertEqual(repr(cls), "<JavaClass '%s'>" % expected)
Пример #24
0
    def test_obj_array(self):
        # the base array class...
        _, oacls = heap._create_class(self, self.names['oar'], self.obj, {},
                                      ('extrastuff', ), (jtype.int, ))
        self.assertEqual(str(oacls), 'java.lang.Object[]')
        self.assertEqual(repr(oacls), "<JavaClass 'java.lang.Object[]'>")
        self.assertTrue(isinstance(oacls, heap.JavaClass))
        self.assertTrue(isinstance(oacls, heap.JavaArrayClass))
        self.assertTrue(issubclass(oacls, heap.JavaObject))
        self.assertTrue(issubclass(oacls, heap.JavaArray))
        self.assertTrue(issubclass(oacls, self.obj))

        oarr = oacls(73, "dummy")
        oarr._hprof_array_data = (oarr, oacls, 33)  # self-referential!
        self.obj._hprof_ifieldvals.__set__(oarr, (0xbeef, ))
        oarr._hprof_ifieldvals = (49, )
        self.assertEqual(len(oarr), 3)
        self.assertEqual(oarr[0], oarr)
        self.assertEqual(oarr[1], oacls)
        self.assertEqual(oarr[2], 33)
        self.assertEqual(oarr[-1], 33)
        self.assertEqual(oarr[-2], oacls)
        self.assertEqual(oarr[-3], oarr)
        self.assertEqual(oarr[:], (oarr, oacls, 33))
        self.assertEqual(oarr[1:], (oacls, 33))
        self.assertEqual(oarr[:2], (oarr, oacls))
        self.assertEqual(oarr[:-1], (oarr, oacls))
        self.assertEqual(oarr[2:], (33, ))
        self.assertEqual(oarr[:0], ())
        self.assertEqual(oarr[:1], (oarr, ))
        with self.assertRaises(IndexError):
            oarr[3]
        with self.assertRaises(IndexError):
            oarr[-4]
        with self.assertRaises(TypeError):
            oarr['hello']
        self.assertIn(oarr, oarr)
        self.assertIn(oacls, oarr)
        self.assertIn(33, oarr)
        self.assertNotIn(11, oarr)
        self.assertNotIn(12, oarr)
        self.assertNotIn(49, oarr)
        self.assertNotIn(32, oarr)
        for i, x in enumerate(oarr):
            self.assertEqual(x, oarr[i])
        self.assertEqual(i, 2)
        self.assertCountEqual(dir(oarr), ('shadow', 'extrastuff'))
        self.assertEqual(oarr._hprof_id, 73)
        self.assertEqual(oarr.shadow, 0xbeef)
        self.assertEqual(oarr.extrastuff, 49)
        self.assertEqual(
            str(oarr),
            'Object[3] {<java.lang.Object[3] 0x49>, <JavaClass \'java.lang.Object[]\'>, 33}'
        )
        self.assertEqual(repr(oarr), '<java.lang.Object[3] 0x49>')

        # ...and a subclass
        _, lacls = heap._create_class(self, self.names['lar'], oacls, {},
                                      ('more', ), (jtype.int, ))
        self.assertEqual(str(lacls), 'List$$lambda[]')
        self.assertEqual(repr(lacls), "<JavaClass 'List$$lambda[]'>")
        self.assertTrue(isinstance(lacls, heap.JavaClass))
        self.assertTrue(isinstance(lacls, heap.JavaArrayClass))
        self.assertTrue(issubclass(lacls, heap.JavaObject))
        self.assertTrue(issubclass(lacls, self.obj))
        self.assertTrue(issubclass(lacls, oacls))

        larr = lacls(97, (1, 3, 5, 7, 9))
        oacls._hprof_ifieldvals.__set__(larr, (56, ))
        lacls._hprof_ifieldvals.__set__(larr, (99, ))
        self.assertEqual(len(larr), 5)
        self.assertEqual(larr[0], 1)
        self.assertEqual(larr[1], 3)
        self.assertEqual(larr[2], 5)
        self.assertEqual(larr[3], 7)
        self.assertEqual(larr[4], 9)
        self.assertEqual(larr[-1], 9)
        self.assertEqual(larr[-2], 7)
        self.assertEqual(larr[-3], 5)
        self.assertEqual(larr[-4], 3)
        self.assertEqual(larr[-5], 1)
        self.assertEqual(larr[:], (1, 3, 5, 7, 9))
        self.assertEqual(larr[1:], (3, 5, 7, 9))
        self.assertEqual(larr[:2], (1, 3))
        self.assertEqual(larr[:-1], (1, 3, 5, 7))
        self.assertEqual(larr[2:], (5, 7, 9))
        self.assertEqual(larr[:0], ())
        self.assertEqual(larr[:1], (1, ))
        with self.assertRaises(IndexError):
            larr[5]
        with self.assertRaises(IndexError):
            larr[-6]
        with self.assertRaises(TypeError):
            larr['world']
        self.assertIn(1, larr)
        self.assertIn(3, larr)
        self.assertIn(5, larr)
        self.assertIn(7, larr)
        self.assertIn(9, larr)
        self.assertNotIn(0, larr)
        self.assertNotIn(2, larr)
        self.assertNotIn(4, larr)
        self.assertNotIn(6, larr)
        self.assertNotIn(8, larr)
        self.assertNotIn(100, larr)
        for i, x in enumerate(larr):
            self.assertEqual(x, larr[i])
        self.assertEqual(i, 4)
        self.assertEqual(larr._hprof_id, 97)
        self.assertEqual(larr.extrastuff, 56)
        self.assertEqual(larr.more, 99)
        self.assertEqual(str(larr), 'List$$lambda[5] {1, 3, 5, 7, 9}')
        self.assertEqual(repr(larr), '<List$$lambda[5] 0x61>')