Exemplo n.º 1
0
    def setup_class(cls):
        from test_basic import compile, run

        class EC(object):
            def __init__(self, value):
                self.value = value

        raw_thread_local = rthread.ThreadLocalReference(EC)

        def bootstrap():
            rthread.gc_thread_start()
            _sleep(1)
            ec = EC(4567)
            raw_thread_local.set(ec)
            revdb.stop_point()
            print raw_thread_local.get().value
            assert raw_thread_local.get() is ec
            rthread.gc_thread_die()

        def main(argv):
            revdb.stop_point()
            ec = EC(12)
            raw_thread_local.set(ec)
            rthread.start_new_thread(bootstrap, ())
            _sleep(2)
            print raw_thread_local.get().value
            assert raw_thread_local.get() is ec
            return 9

        compile(cls, main, backendopt=False, thread=True)
        assert run(cls, '') == '4567\n12\n'
Exemplo n.º 2
0
    def setup_class(cls):
        class W_Root(object):
            def __init__(self, n):
                self.n = n

        PyObjectS = lltype.Struct('PyObjectS', ('c_ob_refcnt', lltype.Signed),
                                  ('c_ob_pypy_link', lltype.Signed))
        PyObject = lltype.Ptr(PyObjectS)
        w1 = W_Root(-42)
        ob1 = lltype.malloc(PyObjectS, flavor='raw', zero=True, immortal=True)
        ob1.c_ob_refcnt = rawrefcount.REFCNT_FROM_PYPY

        def main(argv):
            rawrefcount.create_link_pypy(w1, ob1)
            w = None
            ob = lltype.nullptr(PyObjectS)
            oblist = []
            for op in argv[1:]:
                revdb.stop_point()
                w = W_Root(42)
                ob = lltype.malloc(PyObjectS, flavor='raw', zero=True)
                ob.c_ob_refcnt = rawrefcount.REFCNT_FROM_PYPY
                rawrefcount.create_link_pypy(w, ob)
                oblist.append(ob)
            del oblist[-1]
            #
            rgc.collect()
            assert rawrefcount.from_obj(PyObject, w) == ob
            assert rawrefcount.to_obj(W_Root, ob) == w
            while True:
                ob = rawrefcount.next_dead(PyObject)
                if not ob:
                    break
                assert ob in oblist
                oblist.remove(ob)
            objectmodel.keepalive_until_here(w)
            revdb.stop_point()
            return 9

        compile(cls, main, backendopt=False)
        ARGS26 = 'a b c d e f g h i j k l m n o p q r s t u v w x y z'
        run(cls, ARGS26)
        rdb = fetch_rdb(cls, [cls.exename] + ARGS26.split())
        assert rdb.number_of_stop_points() == cls.expected_stop_points
Exemplo n.º 3
0
    def setup_class(cls):
        from test_basic import compile, run

        class X:
            def __init__(self, s):
                self.s = s

        prebuilt = X('prebuilt')

        def make(s):
            lst = [prebuilt] + [X(c) for c in s]
            keepalive = lst[-1]
            return [weakref.ref(x) for x in lst], keepalive

        def main(argv):
            lst, keepalive = make(argv[0])
            expected = ['prebuilt'] + [c for c in argv[0]]
            dead = [False] * len(lst)
            for j in range(17000):
                outp = []
                for i in range(len(lst)):
                    v = lst[i]()
                    debug_print(v)
                    if dead[i]:
                        assert v is None
                    elif v is None:
                        outp.append('<DEAD>')
                        dead[i] = True
                    else:
                        outp.append(v.s)
                        assert v.s == expected[i]
                print ''.join(outp)
                if (j % 1000) == 999:
                    debug_print('============= COLLECT ===========')
                    rgc.collect()
                debug_print('------ done', j, '.')
            assert not dead[0]
            assert not dead[-1]
            keepalive_until_here(keepalive)
            revdb.stop_point()
            return 9

        compile(cls, main, backendopt=False)
        output = run(cls, '')
        lines = output.splitlines()
        assert lines[-1].startswith('prebuilt') and lines[-1].endswith(
            str(cls.exename)[-1])
        assert (len(lines[-1]) + output.count('<DEAD>') == len('prebuilt') +
                len(str(cls.exename)))
Exemplo n.º 4
0
    def setup_class(cls):
        from test_basic import compile, run

        def bootstrap():
            rthread.gc_thread_start()
            _sleep(1)
            revdb.stop_point()
            _sleep(2)
            revdb.stop_point()
            rthread.gc_thread_die()

        def main(argv):
            revdb.stop_point()
            rthread.start_new_thread(bootstrap, ())
            for i in range(2):
                _sleep(2)
                revdb.stop_point()
            print "ok"
            return 9

        compile(cls, main, backendopt=False, thread=True)
        assert run(cls, '') == 'ok\n'
Exemplo n.º 5
0
 def setup_class(cls):
     from test_basic import compile, run
     main = get_old_style_finalizer_main()
     compile(cls, main, backendopt=False)
     run(cls, '')
Exemplo n.º 6
0
    def setup_class(cls):
        from test_basic import compile, run

        class Stuff:
            pass

        class DBState:
            break_loop = -2
            stuff = None
            metavar = None
            printed_stuff = None
            watch_future = -1

        dbstate = DBState()

        def blip(cmd, extra):
            debug_print('<<<', cmd.c_cmd, cmd.c_arg1, cmd.c_arg2, cmd.c_arg3,
                        extra, '>>>')
            if extra == 'set-breakpoint':
                dbstate.break_loop = cmd.c_arg1
            revdb.send_answer(42, cmd.c_cmd, -43, -44, extra)

        lambda_blip = lambda: blip

        def command_print(cmd, extra):
            if extra == 'print-me':
                stuff = dbstate.stuff
            elif extra == '$0':
                stuff = dbstate.metavar
            elif extra == '2.35':
                val = rdtoa.strtod('2.35')
                valx, valy = math.modf(val)
                revdb.send_output(rdtoa.dtoa(valx) + '\n')
                revdb.send_output(rdtoa.dtoa(valy) + '\n')
                xx, yy = math.frexp(val)
                revdb.send_output(rdtoa.dtoa(xx) + '\n')
                revdb.send_output('%d\n' % yy)
                return
            elif extra == 'very-long-loop':
                i = 0
                total = 0
                while i < 2000000000:
                    total += revdb.flag_io_disabled()
                    i += 1
                revdb.send_output(str(total))
                return
            else:
                assert False
            uid = revdb.get_unique_id(stuff)
            ll_assert(uid > 0, "uid == 0")
            revdb.send_nextnid(uid)  # outputs '$NUM = '
            revdb.send_output('stuff\n')
            dbstate.printed_stuff = stuff

        lambda_print = lambda: command_print

        def command_attachid(cmd, extra):
            index_metavar = cmd.c_arg1
            uid = cmd.c_arg2
            ll_assert(index_metavar == 0, "index_metavar != 0")  # in this test
            dbstate.metavar = dbstate.printed_stuff
            if dbstate.metavar is None:
                # uid not found, probably a future object
                dbstate.watch_future = uid

        lambda_attachid = lambda: command_attachid

        def command_allocating(uid, gcref):
            stuff = cast_gcref_to_instance(Stuff, gcref)
            # 'stuff' is just allocated; 'stuff.x' is not yet initialized
            dbstate.printed_stuff = stuff
            if dbstate.watch_future != -1:
                ll_assert(dbstate.watch_future == uid,
                          "watch_future out of sync")
                dbstate.watch_future = -1
                dbstate.metavar = stuff

        lambda_allocating = lambda: command_allocating

        def command_compilewatch(cmd, expression):
            revdb.send_watch("marshalled_code", ok_flag=1)

        lambda_compilewatch = lambda: command_compilewatch

        def command_checkwatch(cmd, marshalled_code):
            assert marshalled_code == "marshalled_code"
            # check that $0 exists
            if dbstate.metavar is not None:
                revdb.send_watch("ok, stuff exists\n", ok_flag=1)
            else:
                revdb.send_watch("stuff does not exist!\n", ok_flag=0)

        lambda_checkwatch = lambda: command_checkwatch

        def main(argv):
            revdb.register_debug_command(100, lambda_blip)
            revdb.register_debug_command(CMD_PRINT, lambda_print)
            revdb.register_debug_command(CMD_ATTACHID, lambda_attachid)
            revdb.register_debug_command("ALLOCATING", lambda_allocating)
            revdb.register_debug_command(revdb.CMD_COMPILEWATCH,
                                         lambda_compilewatch)
            revdb.register_debug_command(revdb.CMD_CHECKWATCH,
                                         lambda_checkwatch)
            for i, op in enumerate(argv[1:]):
                dbstate.stuff = Stuff()
                dbstate.stuff.x = i + 1000
                if i == dbstate.break_loop or i == dbstate.break_loop + 1:
                    revdb.breakpoint(99)
                revdb.stop_point()
                print op
            return 9

        compile(cls, main, backendopt=False)
        assert run(
            cls,
            'abc d ef g h i j k l m') == ('abc\nd\nef\ng\nh\ni\nj\nk\nl\nm\n')
Exemplo n.º 7
0
 def setup_class(cls):
     from test_basic import compile, run
     main = get_callback_demo()
     compile(cls, main, backendopt=False)
     run(cls, '')