コード例 #1
0
def test_stacking_interpreter():
    # | testBlock |
    # testBlock := [ :aNumber |
    #     aNumber = 0
    #         ifTrue: [ 0 ]
    #         ifFalse: [ (testBlock value: aNumber - 1) + aNumber ]].
    # ^ testBlock value: 11
    import operator
    interp = interpreter.Interpreter(space, max_stack_depth=3)
    #create a method with the correct bytecodes and a literal
    bytes = reduce(
        operator.add,
        map(chr, [
            0x8a, 0x01, 0x68, 0x10, 0x8f, 0x11, 0x00, 0x11, 0x10, 0x75, 0xb6,
            0x9a, 0x75, 0xa4, 0x09, 0x8c, 0x00, 0x01, 0x10, 0x76, 0xb1, 0xca,
            0x10, 0xb0, 0x7d, 0x8e, 0x00, 0x00, 0x8c, 0x00, 0x00, 0x20, 0xca,
            0x7c
        ]))
    w_method = model.W_CompiledMethod(len(bytes))
    w_method.islarge = 1
    w_method.bytes = bytes
    w_method.argsize = 0
    w_method.tempsize = 1
    w_method.setliterals([space.wrap_int(11)])

    #create a frame for that method
    w_frame = w_method.as_compiledmethod_get_shadow(space).create_frame(
        space, space.wrap_int(0), []).w_self()
    try:
        interp.loop(w_frame)
    except interpreter.ReturnFromTopLevel, e:
        assert space.unwrap_int(e.object) == 66
コード例 #2
0
def mock(stack, context = None):
    mapped_stack = [wrap(x) for x in stack]
    if context is None:
        frame = MockFrame(mapped_stack)
    else:
        frame = context
        for i in range(len(stack)):
            frame.as_context_get_shadow(space).push(stack[i])
    interp = interpreter.Interpreter(space, image_name=IMAGENAME)
    return (interp, frame, len(stack))
コード例 #3
0
def setup_module(module, filename='mini.image'):
    space = objspace.ObjSpace()
    from spyvm.tool.analyseimage import image_dir
    module.mini_image = image_dir.join(filename)
    module.reader = open_miniimage(space)
    reader.initialize()
    module.image = squeakimage.SqueakImage()
    module.image.from_reader(space, reader)
    module.space = space
    module.interp = interpreter.Interpreter(space, image)
    return space, module.interp
コード例 #4
0
def setup():
    from spyvm import objspace
    space = objspace.ObjSpace()
    image = create_testimage(space)
    interp = interpreter.Interpreter(space, image)
    w_selector = interp.perform(space.wrap_string("loopTest"), "asSymbol")
    w_object = model.W_SmallInteger(0)
    s_class = w_object.shadow_of_my_class(space)
    s_method = s_class.lookup(w_selector)
    s_frame = s_method.create_frame(space, w_object, [])
    return interp, s_frame
コード例 #5
0
def setup():
    space = objspace.ObjSpace()
    stream = squeakimage.Stream(filename=imagefile)
    image = squeakimage.ImageReader(space, stream).create_image()
    interp = interpreter.Interpreter(space, image)
    w_selector = interp.perform(space.wrap_string("loopTest"), "asSymbol")
    w_object = model.W_SmallInteger(0)
    s_class = w_object.class_shadow(space)
    w_method = s_class.lookup(w_selector)
    s_frame = w_method.create_frame(space, w_object)
    return interp, s_frame
コード例 #6
0
def test_runimage():
    py.test.skip(
        "This method actually runs an image. Fails since no graphical primitives yet"
    )
    from spyvm import wrapper
    ap = wrapper.ProcessWrapper(space,
                                wrapper.scheduler(space).active_process())
    w_ctx = ap.suspended_context()
    ap.store_suspended_context(space.w_nil)

    interp = interpreter.Interpreter(space)
    interp.interpret_with_w_frame(w_ctx)
コード例 #7
0
def build_up_closure_environment(args, copiedValues=[]):
    from test_interpreter import new_frame
    w_frame, s_initial_context = new_frame("<never called, but used for method generation>",
        space=space)

    size_arguments = len(args)
    closure = space.newClosure(w_frame, 4, #pc
                                size_arguments, copiedValues)
    s_initial_context.push_all([closure] + args)
    interp = interpreter.Interpreter(space)
    s_active_context = prim_table[primitives.CLOSURE_VALUE + size_arguments](interp, s_initial_context, size_arguments)
    return s_initial_context, closure, s_active_context
コード例 #8
0
ファイル: jit.py プロジェクト: timfel/lang-smalltalk
    def test_miniloop(self):

        from spyvm import objspace
        space = objspace.ObjSpace()

        image = create_testimage(space)
        interp = interpreter.Interpreter(space, image)
        w_selector = interp.perform(space.wrap_string('loopTest2'), "asSymbol")
        assert isinstance(w_selector, model.W_BytesObject)
        def interp_w():
            interp.perform(model.W_SmallInteger(1000), w_selector)

        self.meta_interp(interp_w, [], listcomp=True, listops=True, backendopt=True, inline=True)
コード例 #9
0
def test_primitive_next_instance_wo_some_instance_in_same_frame():
    someInstances = map(space.wrap_list, [[2], [3]])
    from test_interpreter import new_frame
    w_frame, s_context = new_frame("<never called, but needed for method generation>",
        space=space)

    s_context.push(space.w_Array)
    interp = interpreter.Interpreter(space)
    w_1 = someInstances[0]
    assert w_1.getclass(space) is space.w_Array

    s_context.push(w_1)
    prim_table[primitives.NEXT_INSTANCE](interp, s_context, 0)
    w_2 = s_context.pop()
    assert w_2.getclass(space) is space.w_Array
    assert w_1 is not w_2
コード例 #10
0
def test_step_run_something():
    from spyvm.test import test_miniimage
    setup_module(test_miniimage, filename='running-something-mini.image')
    from spyvm import wrapper
    ap = wrapper.ProcessWrapper(space,
                                wrapper.scheduler(space).active_process())
    w_ctx = ap.suspended_context()
    s_ctx = w_ctx.as_context_get_shadow(space)
    ap.store_suspended_context(space.w_nil)

    interp = interpreter.Interpreter(space)
    assert isinstance(s_ctx, shadow.MethodContextShadow)
    assert s_ctx.top().is_same_object(space.w_true)
    interp.step(s_ctx)
    interp.step(s_ctx)
    assert s_ctx.top().value == 1
    interp.step(s_ctx)
    assert s_ctx.top().value == 2
    interp.step(s_ctx)
    assert s_ctx.top().value == 3
コード例 #11
0
def test_primitive_value_no_context_switch(monkeypatch):
    class Context_switched(Exception):
        pass
    class Stepping(Exception):
        pass

    def quick_check_for_interrupt(s_frame, dec=1):
        raise Context_switched
    def step(s_frame):
        raise Stepping

    from test_interpreter import new_frame
    w_frame, s_initial_context = new_frame("<never called, but used for method generation>",
        space=space)

    closure = space.newClosure(w_frame, 4, 0, [])
    s_frame = w_frame.as_methodcontext_get_shadow(space)
    interp = interpreter.Interpreter(space, image_name=IMAGENAME)
    interp._loop = True

    try:
        monkeypatch.setattr(interp, "quick_check_for_interrupt", quick_check_for_interrupt)
        monkeypatch.setattr(interp, "step", step)
        try:
            s_frame.push(closure)
            prim_table[primitives.CLOSURE_VALUE](interp, s_frame, 0)
        except Context_switched:
            assert True
        except Stepping:
            assert False
        try:
            s_frame.push(closure)
            prim_table[primitives.CLOSURE_VALUE_NO_CONTEXT_SWITCH](interp, s_frame, 0)
        except Context_switched:
            assert False
        except Stepping:
            assert True
    finally:
        monkeypatch.undo()
コード例 #12
0
ファイル: analyseimage.py プロジェクト: timfel/lang-smalltalk
def tinyBenchmarks():
    image = create_squeakimage()
    interp = interpreter.Interpreter()

    w_object = model.W_SmallInteger(0)

    # Should get this from w_object
    w_smallint_class = image.special(constants.SO_SMALLINTEGER_CLASS)
    s_class = w_object.shadow_of_my_class()
    #w_method = s_class.lookup("benchFib")
    w_method = s_class.lookup("tinyBenchmarks")

    assert w_method
    w_frame = w_method.create_frame(w_object, [])
    interp.store_w_active_context(w_frame)

    from spyvm.interpreter import BYTECODE_TABLE
    while True:
        try:
            interp.step()
        except interpreter.ReturnFromTopLevel, e:
            print e.object
            return
コード例 #13
0
def entry_point(argv):
    # == Main execution parameters
    path = None
    selector = None
    code = ""
    number = 0
    have_number = False
    stringarg = None
    headless = True
    # == Other parameters
    poll = False
    interrupts = True
    trace = False
    trace_important = False
    
    space = prebuilt_space
    idx = 1
    try:
        while idx < len(argv):
            arg = argv[idx]
            idx += 1
            if arg in ["-h", "--help"]:
                _usage(argv)
                return 0
            elif arg in ["-j", "--jit"]:
                jitarg, idx = get_parameter(argv, idx, arg)
                jit.set_user_param(interpreter.Interpreter.jit_driver, jitarg)
            elif arg in ["-n", "--number"]:
                number, idx = get_int_parameter(argv, idx, arg)
                have_number = True
            elif arg in ["-m", "--method"]:
                selector, idx = get_parameter(argv, idx, arg)
            elif arg in ["-t", "--trace"]:
                trace = True
            elif arg in ["-T"]:
                trace_important = True
            elif arg in ["-s", "--safe-trace"]:
                space.omit_printing_raw_bytes.activate()
            elif arg in ["-p", "--poll"]:
                poll = True
            elif arg in ["-a", "--arg"]:
                stringarg, idx = get_parameter(argv, idx, arg)
            elif arg in ["-r", "--run"]:
                code, idx = get_parameter(argv, idx, arg)
            elif arg in ["-i", "--no-interrupts"]:
                interrupts = False
            elif arg in ["-P", "--process"]:
                headless = False
            elif arg in ["--hacks"]:
                space.run_spy_hacks.activate()
            elif arg in ["-S"]:
                space.strategy_factory.no_specialized_storage.activate()
            elif arg in ["-u"]:
                from spyvm.plugins.vmdebugging import stop_ui_process
                stop_ui_process()
            elif arg in ["-l", "--storage-log"]:
                space.strategy_factory.logger.activate()
            elif arg in ["-L", "--storage-log-aggregate"]:
                space.strategy_factory.logger.activate(aggregate=True)
            elif path is None:
                path = arg
            else:
                _usage(argv)
                return -1
        
        if path is None:
            path = "Squeak.image"
        if code and selector:
            raise error.Exit("Cannot handle both -r and -m.")
    except error.Exit as e:
        print_error("Parameter error: %s" % e.msg)
        return 1
    
    path = rpath.rabspath(path)
    try:
        stream = squeakimage.Stream(filename=path)
    except OSError as e:
        print_error("%s -- %s (LoadError)" % (os.strerror(e.errno), path))
        return 1
    
    # Load & prepare image and environment
    image = squeakimage.ImageReader(space, stream).create_image()
    interp = interpreter.Interpreter(space, image,
                trace=trace, trace_important=trace_important,
                evented=not poll, interrupts=interrupts)
    space.runtime_setup(argv[0], path)
    print_error("") # Line break after image-loading characters
    
    # Create context to be executed
    if code or selector:
        if not have_number:
            w_receiver = space.w_nil
        else:
            w_receiver = space.wrap_int(number)
        if code:
            selector = compile_code(interp, w_receiver, code)
        s_frame = create_context(interp, w_receiver, selector, stringarg)
        if headless:
            space.headless.activate()
            context = s_frame
        else:
            create_process(interp, s_frame)
            context = active_context(space)
    else:
        context = active_context(space)
    
    w_result = execute_context(interp, context)
    print result_string(w_result)
    return 0
コード例 #14
0
from spyvm import objspace, wrapper, constants


def mockclass(space,
              instsize,
              w_superclass=None,
              w_metaclass=None,
              name='?',
              format=shadow.POINTERS,
              varsized=True):
    return objspace.bootstrap_class(space, instsize, w_superclass, w_metaclass,
                                    name, format, varsized)


space = objspace.ObjSpace()
interp = interpreter.Interpreter(space)


def step_in_interp(ctxt):  # due to missing resets in between tests
    interp._loop = False
    try:
        retval = interp.step(ctxt)
        if retval is not None:
            return retval.w_self()
    except interpreter.Return, nlr:
        nlr.s_target_context.push(nlr.value)
        return nlr.s_target_context.w_self()


# expose the bytecode's values as global constants.
# Bytecodes that have a whole range are exposed as global functions:
コード例 #15
0
def entry_point(argv):
    idx = 1
    path = None
    number = 0
    benchmark = None
    trace = False
    evented = True
    stringarg = ""
    code = None
    as_benchmark = False

    while idx < len(argv):
        arg = argv[idx]
        if arg in ["-h", "--help"]:
            _usage(argv)
            return 0
        elif arg in ["-j", "--jit"]:
            _arg_missing(argv, idx, arg)
            jitarg = argv[idx + 1]
            idx += 1
            jit.set_user_param(interpreter.Interpreter.jit_driver, jitarg)
        elif arg in ["-n", "--number"]:
            _arg_missing(argv, idx, arg)
            number = int(argv[idx + 1])
            idx += 1
        elif arg in ["-m", "--method"]:
            _arg_missing(argv, idx, arg)
            benchmark = argv[idx + 1]
            idx += 1
        elif arg in ["-t", "--trace"]:
            trace = True
        elif arg in ["-p", "--poll_events"]:
            evented = False
        elif arg in ["-a", "--arg"]:
            _arg_missing(argv, idx, arg)
            stringarg = argv[idx + 1]
            idx += 1
        elif arg in ["-r", "--run"]:
            _arg_missing(argv, idx, arg)
            code = argv[idx + 1]
            as_benchmark = False
            idx += 1
        elif arg in ["-b", "--benchmark"]:
            _arg_missing(argv, idx, arg)
            code = argv[idx + 1]
            as_benchmark = True
            idx += 1
        elif path is None:
            path = argv[idx]
        else:
            _usage(argv)
            return -1
        idx += 1

    if path is None:
        path = "Squeak.image"

    path = rpath.rabspath(path)
    try:
        f = open_file_as_stream(path, mode="rb", buffering=0)
    except OSError as e:
        os.write(2, "%s -- %s (LoadError)\n" % (os.strerror(e.errno), path))
        return 1
    try:
        imagedata = f.readall()
    finally:
        f.close()

    image_reader = squeakimage.reader_for_image(
        space, squeakimage.Stream(data=imagedata))
    image = create_image(space, image_reader)
    interp = interpreter.Interpreter(space,
                                     image,
                                     image_name=path,
                                     trace=trace,
                                     evented=evented)
    space.runtime_setup(argv[0])
    if benchmark is not None:
        return _run_benchmark(interp, number, benchmark, stringarg)
    elif code is not None:
        return _run_code(interp, code, as_benchmark=as_benchmark)
    else:
        _run_image(interp)
        return 0