示例#1
0
文件: jit.py 项目: rjnw/pycket
 def interp_w():
     loader = JsonLoader(False)
     ast = loader.to_module((_json)).assign_convert_module()
     env = (_env)
     env.globalconfig.load(ast)
     env.commanline_arguments = []
     interpret_module(ast, env)
示例#2
0
    def actual_entry(argv):
        jit.set_param(None, "trace_limit", 1000000)
        jit.set_param(None, "threshold", 131)
        jit.set_param(None, "trace_eagerness", 50)

        config, names, args, retval = parse_args(argv)
        if retval != 0 or config is None:
            return retval
        args_w = [W_String.fromstr_utf8(arg) for arg in args]
        module_name, json_ast = ensure_json_ast(config, names)

        entry_flag = 'byte-expand' in names
        reader = JsonLoader(bytecode_expand=entry_flag)
        if json_ast is None:
            ast = reader.expand_to_ast(module_name)
        else:
            ast = reader.load_json_ast_rpython(module_name, json_ast)

        env = ToplevelEnv(pycketconfig)
        env.globalconfig.load(ast)
        env.commandline_arguments = args_w
        env.module_env.add_module(module_name, ast)
        try:
            val = interpret_module(ast, env)
        finally:
            from pycket.prims.input_output import shutdown
            if config.get('save-callgraph', False):
                with open('callgraph.dot', 'w') as outfile:
                    env.callgraph.write_dot_file(outfile)
            shutdown(env)
        return 0
示例#3
0
def parse_file(fname, *replacements, **kwargs):
    abspath = kwargs.get("abspath", False)
    if not abspath:
        fname = os.path.join(os.path.dirname(__file__), fname)

    if kwargs.get("inplace", False):
        assert not replacements
        if not pytest.config.byte_option:
            reader = JsonLoader(bytecode_expand=False)
        else:
            reader = JsonLoader(bytecode_expand=True)
        ast = reader.expand_to_ast(fname)
        return ast

    with file(fname) as f:
        s = f.read()
    for replace, with_ in replacements:
        assert s.count(replace) == 1
        s = s.replace(replace, with_)
    s = s.decode("utf-8")

    if not pytest.config.byte_option:
        s = expand_string(s)
        ast = parse_module(s)
    else:
        s = expand_from_bytecode(s, True)
        ast = parse_module(s, bytecode_expand=True)

    return ast
示例#4
0
    def actual_entry(argv):
        jit.set_param(None, "trace_limit", 1000000)
        jit.set_param(None, "threshold", 131)
        jit.set_param(None, "trace_eagerness", 50)
        jit.set_param(None, "max_unroll_loops", 15)

        config, names, args, retval = parse_args(argv)
        if retval != 0 or config is None:
            return retval
        args_w = [W_String.fromstr_utf8(arg) for arg in args]
        module_name, json_ast = ensure_json_ast(config, names)

        entry_flag = 'byte-expand' in names
        reader = JsonLoader(bytecode_expand=entry_flag)
        if json_ast is None:
            ast = reader.expand_to_ast(module_name)
        else:
            ast = reader.load_json_ast_rpython(module_name, json_ast)

        env = ToplevelEnv(pycketconfig)
        env.globalconfig.load(ast)
        env.commandline_arguments = args_w
        env.module_env.add_module(module_name, ast)
        try:
            val = interpret_module(ast, env)
        finally:
            from pycket.prims.input_output import shutdown
            for callback in POST_RUN_CALLBACKS:
                callback(config, env)
            shutdown(env)
        return 0
示例#5
0
    def actual_entry(argv):
        jit.set_param(None, "trace_limit", 1000000)
        jit.set_param(None, "threshold", 131)
        jit.set_param(None, "trace_eagerness", 50)
        jit.set_param(None, "max_unroll_loops", 10)

        config, names, args, retval = parse_args(argv)
        if retval != 0 or config is None:
            return retval
        args_w = [W_String.fromstr_utf8(arg) for arg in args]
        module_name, json_ast = ensure_json_ast(config, names)

        entry_flag = 'byte-expand' in names
        reader = JsonLoader(bytecode_expand=entry_flag)
        if json_ast is None:
            ast = reader.expand_to_ast(module_name)
        else:
            ast = reader.load_json_ast_rpython(module_name, json_ast)

        env = ToplevelEnv(pycketconfig)
        env.globalconfig.load(ast)
        env.commandline_arguments = args_w
        env.module_env.add_module(module_name, ast)
        try:
            val = interpret_module(ast, env)
        finally:
            from pycket.prims.input_output import shutdown
            for callback in POST_RUN_CALLBACKS:
                callback(config, env)
            shutdown(env)
        return 0
示例#6
0
def parse_file(fname, *replacements, **kwargs):
    abspath = kwargs.get("abspath", False)
    if not abspath:
        fname = os.path.join(os.path.dirname(__file__), fname)

    if kwargs.get("inplace", False):
        assert not replacements
        if not pytest.config.byte_option:
            reader = JsonLoader(bytecode_expand=False)
        else:
            reader = JsonLoader(bytecode_expand=True)
        ast = reader.expand_to_ast(fname)
        return ast

    with file(fname) as f:
        s = f.read()
    for replace, with_ in replacements:
        assert s.count(replace) == 1
        s = s.replace(replace, with_)
    s = s.decode("utf-8")

    s = expand_string(s)
    ast = parse_module(s)

    # if not pytest.config.byte_option:
    #     s = expand_string(s)
    #     ast = parse_module(s)
    # else:
    #     s = expand_from_bytecode(s, True)
    #     ast = parse_module(s, bytecode_expand=True)

    return ast
示例#7
0
def sample_sexp():
    from pycket.expand import readfile_rpython, getkey
    from pycket import pycket_json

    data = readfile_rpython('sample-module.json')
    json = pycket_json.loads(data)
    ast = JsonLoader().to_ast(json) #module
    return ast.to_sexp()
示例#8
0
def sample_sexp():
    from pycket.expand import readfile_rpython, getkey
    from pycket import pycket_json

    data = readfile_rpython('sample-module.json')
    json = pycket_json.loads(data)
    ast = JsonLoader().to_ast(json) #module
    return ast.to_sexp()
示例#9
0
    def test_setbang(self):

        loader = JsonLoader(bytecode_expand=False)
        ast = loader.to_ast(expand("""
        #lang pycket
        (let ([n 1000])
          (letrec ([countdown (lambda () (if (< n 0) 1 (begin (set! n (- n 1)) (countdown))))])
            (countdown)))
        """))

        def interp_w():
            val = interpret_one(ast)
            ov = check_one_val(val)
            assert isinstance(ov, W_Fixnum)
            return ov.value

        assert interp_w() == 1

        self.meta_interp(interp_w, [], listcomp=True, listops=True, backendopt=True)
示例#10
0
    def old_pycket_actual_entry(argv):
        jit.set_param(None, "trace_limit", 1000000)
        jit.set_param(None, "threshold", 131)
        jit.set_param(None, "trace_eagerness", 50)
        jit.set_param(None, "max_unroll_loops", 15)

        config, names, args, retval = old_pycket_parse_args(argv)
        if retval != 0 or config is None:
            return retval
        args_w = [W_String.fromstr_utf8(arg) for arg in args]
        module_name, json_ast = ensure_json_ast(config, names)

        from pycket.env import w_global_config
        from pycket.prims.general import make_stub_predicates_no_linklet
        w_global_config.set_linklet_mode_off()

        entry_flag = 'byte-expand' in names
        multi_mod_flag = 'multiple-modules' in names

        multi_mod_map = ModuleMap(json_ast) if multi_mod_flag else None

        reader = JsonLoader(bytecode_expand=entry_flag,
                            multiple_modules=multi_mod_flag,
                            module_mapper=multi_mod_map)

        if json_ast is None:
            ast = reader.expand_to_ast(module_name)
        else:
            ast = reader.load_json_ast_rpython(module_name, json_ast)

        env = ToplevelEnv(pycketconfig)
        env.globalconfig.load(ast)
        env.commandline_arguments = args_w
        env.module_env.add_module(module_name, ast)
        try:
            val = interpret_module(ast, env)
        finally:
            from pycket.prims.input_output import shutdown
            for callback in POST_RUN_CALLBACKS:
                callback(config, env)
            shutdown(env)
        return 0
示例#11
0
文件: jit.py 项目: yws/pycket-1
    def test_setbang(self):

        loader = JsonLoader(bytecode_expand=False)
        ast = loader.to_ast(
            expand("""
        #lang pycket
        (let ([n 1000])
          (letrec ([countdown (lambda () (if (< n 0) 1 (begin (set! n (- n 1)) (countdown))))])
            (countdown)))
        """))

        def interp_w():
            val = interpret_one(ast)
            ov = check_one_val(val)
            assert isinstance(ov, W_Fixnum)
            return ov.value

        assert interp_w() == 1

        self.meta_interp(interp_w, [],
                         listcomp=True,
                         listops=True,
                         backendopt=True)
示例#12
0
文件: linklet.py 项目: pycket/pycket
    def load_linklet(json_file_name, set_version=False):
        from pycket.expand import readfile_rpython, getkey, JsonLoader
        from pycket.util import console_log
        from pycket.env import w_version
        """ Expands and loads a linklet from a JSON file"""
        with PerfRegion("json-load"):
            data = readfile_rpython(json_file_name)
            json = pycket_json.loads(data)
            console_log("Finished reading JSON from %s" % json_file_name, 2)
            assert json.is_object
            json_python_dict = json.value_object()
            assert "linklet" in json_python_dict
            linklet_dict = getkey(json_python_dict, "linklet", type='o')
            assert "exports" in linklet_dict and "body" in linklet_dict

            # list of JsonObject
            exports_list = getkey(linklet_dict, "exports", type='a')

        if set_version:
            from pycket.util import console_log
            conf = getkey(linklet_dict, "config", type='o')
            ver = conf['version'].value_string()
            console_log("Setting the version to %s" % ver)
            w_version.set_version(ver)

        exports = {}
        for exp in exports_list:
            if exp.is_array:
                arr = exp.value_array()
                internal_str = arr[0].value_object()['quote'].value_object(
                )['toplevel'].value_string()
                internal_name = W_Symbol.make(internal_str)
                external_name = W_Symbol.make(
                    arr[1].value_object()['quote'].value_object()
                    ['toplevel'].value_string())
                w_internal_name = Gensym.gensym(internal_str)
                exports[internal_name] = Export(w_internal_name, external_name)
            else:
                exp_str = exp.value_object()['quote'].value_object(
                )['toplevel'].value_string()
                exp_sym = W_Symbol.make(exp_str)
                w_exp_sym = Gensym.gensym(exp_str)
                exports[exp_sym] = Export(w_exp_sym, exp_sym)

        imports_list = getkey(linklet_dict, "importss", type='a', default=[])

        importss = [None] * len(imports_list)  # list of dict

        if "importss" in linklet_dict:
            for index, imports in enumerate(imports_list):
                arr = imports.value_array()
                # bootstrap linklets have no imports at all
                # this is only for debugging purposes
                instance_imports = []
                for id_str in arr:
                    imp_str = id_str.value_object()['quote'].value_object(
                    )['toplevel'].value_string()
                    imp_sym = W_Symbol.make(imp_str)
                    w_imp_sym = Gensym.gensym(imp_str)
                    instance_imports.append(
                        Import(W_Fixnum(index), imp_sym, w_imp_sym, w_imp_sym))
                importss[index] = instance_imports

        console_log("Converting linklet forms to AST ...", 2)

        loader = JsonLoader()
        with PerfRegion("json-to-ast"):
            all_forms = []
            for body_form in getkey(linklet_dict, "body", type='a'):
                form_2 = loader.to_ast(body_form)
                form_1 = Context.normalize_term(form_2)
                form = assign_convert(form_1)
                all_forms.append(form)
            # for each exported defined id, we need to add a
            # variable-set! for the exported var with the defined id
            for exp_sym, exp_obj in exports.iteritems():
                rator = ModuleVar(var_set_sym, "#%kernel", var_set_sym, None)
                exp_var = LinkletVar(exp_obj.int_id)
                top_var = ToplevelVar(exp_sym)
                mode = Quote(values.w_false)  # FIXME: possible optimization
                rands = [exp_var, top_var, mode]
                all_forms.append(App.make(rator, rands))

        linkl = W_Linklet(W_Symbol.make(json_file_name), importss, exports,
                          all_forms)
        console_log("Finished converting linklet forms to AST ...", 2)

        config = {}
        config_obj = getkey(linklet_dict, "config", type='o')
        if config_obj is not None:
            for k, v in config_obj.iteritems():
                config[k] = v.value_string()

        return linkl, config
示例#13
0
文件: jit.py 项目: yws/pycket-1
 def interp_w():
     loader = JsonLoader(False)
     ast = parse_module(_json)
     env.globalconfig.load(ast)
     env.commandline_arguments = []
     interpret_module(ast, env)
示例#14
0
文件: linklet.py 项目: samth/pycket
    def load_linklet(json_file_name, set_version=False, generate_zo=False):
        from pycket.expand import readfile_rpython, getkey, JsonLoader
        from pycket.util import console_log
        from pycket.env import w_version
        import os

        if generate_zo:
            try:
                os.remove("expander.zo")
            except OSError:
                pass

        if set_version and os.path.exists("expander.zo"):
            console_log("Loading the expander linklet from expander.zo")
            # We're loading the expander, so try fasl->sexp
            from pycket.racket_entry import get_primitive
            from pycket.prims.input_output import open_input_file

            with PerfRegion("expander-linklet"):
                fasl_to_s_exp = get_primitive("fasl->s-exp")
                in_file = open_input_file.w_prim.call_interpret(
                    [W_Path("expander.zo")])
                try:
                    expander_zo_sexp = fasl_to_s_exp.call_interpret(
                        [in_file, w_true])
                    version = expander_zo_sexp.car()
                    expander_sexp = expander_zo_sexp.cdr()
                    expander_linkl = deserialize_loop(expander_sexp)
                    w_version.set_version(version.tostring())
                    console_log("Setting the version to %s" %
                                version.tostring())
                    return expander_linkl, None
                except (SchemeException, OSError):
                    console_log("Couldn't read from expander.zo")
        """ Expands and loads a linklet from a JSON file"""
        with PerfRegion("json-load"):
            data = readfile_rpython(json_file_name)
            json = pycket_json.loads(data)
            console_log("Finished reading JSON from %s" % json_file_name, 2)
            assert json.is_object
            json_python_dict = json.value_object()
            assert "linklet" in json_python_dict
            linklet_dict = getkey(json_python_dict, "linklet", type='o')
            assert "exports" in linklet_dict and "body" in linklet_dict

            # list of JsonObject
            exports_list = getkey(linklet_dict, "exports", type='a')

        if set_version:
            from pycket.util import console_log
            conf = getkey(linklet_dict, "config", type='o')
            ver = conf['version'].value_string()
            console_log("Setting the version to %s" % ver)
            w_version.set_version(ver)

        exports = {}
        for exp in exports_list:
            if exp.is_array:
                arr = exp.value_array()
                internal_str = arr[0].value_object()['quote'].value_object(
                )['toplevel'].value_string()
                internal_name = W_Symbol.make(internal_str)
                external_name = W_Symbol.make(
                    arr[1].value_object()['quote'].value_object()
                    ['toplevel'].value_string())
                w_internal_name = Gensym.gensym(internal_str)
                exports[internal_name] = Export(w_internal_name, external_name)
            else:
                exp_str = exp.value_object()['quote'].value_object(
                )['toplevel'].value_string()
                exp_sym = W_Symbol.make(exp_str)
                w_exp_sym = Gensym.gensym(exp_str)
                exports[exp_sym] = Export(w_exp_sym, exp_sym)

        imports_list = getkey(linklet_dict, "importss", type='a', default=[])

        importss = [None] * len(imports_list)  # list of dict

        if "importss" in linklet_dict:
            for index, imports in enumerate(imports_list):
                arr = imports.value_array()
                # bootstrap linklets have no imports at all
                # this is only for debugging purposes
                instance_imports = []
                for id_str in arr:
                    imp_str = id_str.value_object()['quote'].value_object(
                    )['toplevel'].value_string()
                    imp_sym = W_Symbol.make(imp_str)
                    w_imp_sym = Gensym.gensym(imp_str)
                    instance_imports.append(
                        Import(W_Fixnum(index), imp_sym, w_imp_sym, w_imp_sym))
                importss[index] = instance_imports

        console_log("Converting linklet forms to AST ...", 2)

        loader = JsonLoader()
        with PerfRegion("json-to-ast"):
            all_forms = []
            for body_form in getkey(linklet_dict, "body", type='a'):
                form_2 = loader.to_ast(body_form)
                form_1 = Context.normalize_term(form_2)
                # if form_1.tostring() != form_2.tostring():
                #     import pdb;pdb.set_trace()
                form = assign_convert(form_1)
                all_forms.append(form)
            # for each exported defined id, we need to add a
            # variable-set! for the exported var with the defined id
            for exp_sym, exp_obj in exports.iteritems():
                rator = ModuleVar(var_set_sym, "#%kernel", var_set_sym, None)
                exp_var = LinkletStaticVar(exp_obj.int_id)
                top_var = ToplevelVar(exp_sym)
                mode = Quote(values.w_false)  # FIXME: possible optimization
                rands = [exp_var, top_var, mode]
                all_forms.append(App.make(rator, rands))

        linkl = W_Linklet(W_Symbol.make(json_file_name), importss, exports,
                          all_forms)
        console_log("Finished converting linklet forms to AST ...", 2)

        config = {}
        config_obj = getkey(linklet_dict, "config", type='o')
        if config_obj is not None:
            for k, v in config_obj.iteritems():
                config[k] = v.value_string()

        if set_version and not os.path.exists("expander.zo"):
            console_log("Serializing the expander linklet into expander.zo")
            from pycket.racket_entry import get_primitive
            from pycket.prims.input_output import open_output_file
            s_exp_to_fasl = get_primitive("s-exp->fasl")
            expander_sexp = ast_to_sexp(linkl)
            version = W_Symbol.make(w_version.get_version())
            expander_zo_sexp = W_Cons.make(version, expander_sexp)
            try:
                out_file = open_output_file.w_prim.call_interpret(
                    [W_Path("expander.zo")])
                s_exp_to_fasl.call_interpret(
                    [expander_zo_sexp, out_file, values.w_false])
            except (SchemeException, OSError):
                console_log("Couldn't write the expander.zo")

        return linkl, config
示例#15
0
文件: linklet.py 项目: pycket/pycket
    def load_linklet(json_file_name, set_version=False):
        from pycket.expand import readfile_rpython, getkey, JsonLoader
        from pycket.util import console_log
        from pycket.env import w_version

        """ Expands and loads a linklet from a JSON file"""
        with PerfRegion("json-load"):
            data = readfile_rpython(json_file_name)
            json = pycket_json.loads(data)
            console_log("Finished reading JSON from %s" % json_file_name, 2)
            assert json.is_object
            json_python_dict = json.value_object()
            assert "linklet" in json_python_dict
            linklet_dict = getkey(json_python_dict, "linklet", type='o')
            assert "exports" in linklet_dict and "body" in linklet_dict

            # list of JsonObject
            exports_list = getkey(linklet_dict, "exports", type='a')

        if set_version:
            from pycket.util import console_log
            conf = getkey(linklet_dict, "config", type='o')
            ver = conf['version'].value_string()
            console_log("Setting the version to %s" % ver)
            w_version.set_version(ver)

        exports = {}
        for exp in exports_list:
            if exp.is_array:
                arr = exp.value_array()
                internal_str = arr[0].value_object()['quote'].value_object()['toplevel'].value_string()
                internal_name = W_Symbol.make(internal_str)
                external_name = W_Symbol.make(arr[1].value_object()['quote'].value_object()['toplevel'].value_string())
                w_internal_name = Gensym.gensym(internal_str)
                exports[internal_name] = Export(w_internal_name, external_name)
            else:
                exp_str = exp.value_object()['quote'].value_object()['toplevel'].value_string()
                exp_sym = W_Symbol.make(exp_str)
                w_exp_sym = Gensym.gensym(exp_str)
                exports[exp_sym] = Export(w_exp_sym, exp_sym)

        imports_list = getkey(linklet_dict, "importss", type='a', default=[])

        importss = [None]*len(imports_list) # list of dict

        if "importss" in linklet_dict:
            for index, imports in enumerate(imports_list):
                arr = imports.value_array()
                # bootstrap linklets have no imports at all
                # this is only for debugging purposes
                instance_imports = []
                for id_str in arr:
                    imp_str = id_str.value_object()['quote'].value_object()['toplevel'].value_string()
                    imp_sym = W_Symbol.make(imp_str)
                    w_imp_sym = Gensym.gensym(imp_str)
                    instance_imports.append(Import(W_Fixnum(index), imp_sym, w_imp_sym, w_imp_sym))
                importss[index] = instance_imports

        console_log("Converting linklet forms to AST ...", 2)

        loader = JsonLoader()
        with PerfRegion("json-to-ast"):
            all_forms = []
            for body_form in getkey(linklet_dict, "body", type='a'):
                form_2 = loader.to_ast(body_form)
                form_1 = Context.normalize_term(form_2)
                form = assign_convert(form_1)
                all_forms.append(form)
            # for each exported defined id, we need to add a
            # variable-set! for the exported var with the defined id
            for exp_sym, exp_obj in exports.iteritems():
                rator = ModuleVar(var_set_sym, "#%kernel", var_set_sym, None)
                exp_var = LinkletVar(exp_obj.int_id)
                top_var = ToplevelVar(exp_sym)
                mode = Quote(values.w_false) # FIXME: possible optimization
                rands = [exp_var, top_var, mode]
                all_forms.append(App.make(rator,rands))

        linkl = W_Linklet(W_Symbol.make(json_file_name), importss, exports, all_forms)
        console_log("Finished converting linklet forms to AST ...", 2)

        config = {}
        config_obj = getkey(linklet_dict, "config", type='o')
        if config_obj is not None:
            for k, v in config_obj.iteritems():
                config[k] = v.value_string()

        return linkl, config