Beispiel #1
0
    def test_calls(self):
        KSP.set_compiled(True)
        self.method()
        self.assertEqual(
            unpack_lines(Output().get()),
            call_out.format(method=Function.get_func_name(self.method)))
        Output().refresh()

        x = kInt(name='x')
        self.method(x)
        self.assertEqual(x._get_compiled(), '$x')
        self.assertEqual(x._get_runtime(), 3)
        self.assertEqual(
            unpack_lines(Output().get()),
            call_with_out.format(method=Function.get_func_name(self.method)))
        Output().refresh()

        self.inlined = True
        self.method(x, inline=True)
        self.assertEqual(unpack_lines(Output().get()), inlined_out)
        Output().refresh()

        arr = kArrInt([1, 2, 3, 4, 5])

        @func
        def foo(loc: kArg(int, 5) = arr):
            with For(arr=loc) as seq:
                for item in seq:
                    self.method(item)

        foo()

        # test for excluding from generation without
        # "calling" it
        @func
        def bar(var: int):
            self.method()

        bar(1, inline=True)

        generated_exec = KspObject.generate_all_executables()
        self.maxDiff = None
        self.assertEqual(
            unpack_lines(generated_exec),
            executables.format(method=Function.get_func_name(self.method),
                               foo=Function.get_func_name(foo)))

        Output().refresh()

        @func
        def foobar(arg=kLoc(int)):
            self.method(arg)

        KSP.in_init(True)
        foobar()
        KSP.in_init(False)
        self.assertEqual(unpack_lines(Output().get()), invoked_in_init)
Beispiel #2
0
    def wrapper(*a, inline=False, **kv):
        f_self, maped, outs = fargs.map(*a, *kv)
        odict = OrderedDict(**maped)
        args = list()
        for arg, val in odict.items():
            args.append(val)
        args = _func_stack.push(*args)

        passed = dict()
        for arg, name in zip(args, odict):
            passed[name] = arg
        _f_obj.cash_args((args, passed))
        if f_self:
            passed['self'] = f_self
        blocked = None
        if not inline and not KSP.in_init():
            FuncCallsStack.put(_f_obj)
            FuncCallsStack.append(_f_obj._call_stack)
            _f_obj.called = True
            Output().put(f'call {_f_obj.name()}')
            FunctionCallback.open()
            if not Output().blocked:
                Output().blocked = True
                blocked = True
        out = f(**passed)
        if not inline and not KSP.in_init():
            if _f_obj in _f_obj._call_stack:
                raise Exception(f'recursive call of {_f_obj} detected')
            FuncCallsStack.pop()
            FunctionCallback.close()
        if blocked:
            Output().blocked = False
        if outs:
            for name, val in outs.items():
                maped[name] <<= passed[name]
        _func_stack.pop()
        return out
Beispiel #3
0
 def close(self):
     super().close()
     KSP.in_init(False)
Beispiel #4
0
 def open(self):
     super().open()
     KSP.in_init(True)
Beispiel #5
0
    def _generate_code(self):
        print('generating code')
        refresh_all()
        KSP.set_compiled(True)
        KSP.in_init(True)
        if self._compact:
            IName.set_compact(True)
        # try:
        self.main()
        # except AttributeError:
        #     raise RuntimeError(
        #         '''all KSP objects attemped to appear in the code
        #         has to be placed inside function, which is assigned
        #         to script main attribute''')
        try:
            kLog()
            if kLog()._path:
                KSP.in_init(False)
                persistence_changed(kLog()._log_arr_pers)
                KSP.in_init(True)
        except TypeError as e:
            if str(e).startswith('__init__()'):
                pass
            else:
                raise e
        print('getting lines of regular operations')
        regular = Output().get()
        print('getting inits of declared objects')
        obj_init = KspObject.generate_all_inits()
        print('getting inits of NativeControls params')
        ctrls = KspNativeControlMeta.generate_init_code()
        print('getting lines of init callback, pasted as decorated funcs')
        init_cb = InitCallback.generate_body()[1:-1]
        KSP.in_init(False)
        print('generating other callbacks')
        cbs = Callback.get_all_bodies()
        print('generating functions bodies')
        funcs = list()
        for f in Function._functions.values():
            funcs = f._generate_executable()
            break
        # funcs = KspObject.generate_all_executables()
        out = list()
        print('joining the code')
        localtime = time.asctime(time.localtime(time.time()))
        out.append('{ Compiled on %s }' % localtime)
        out.append('on init')
        if self._title:
            out.append(f'set_script_title("{self._title}")')
        out.extend(FuncStack()._init_lines)
        out.extend(obj_init)
        out.extend(ctrls)
        out.extend(regular)
        out.extend(init_cb)
        out.append('end on')

        out.extend(funcs)
        out.extend(cbs)
        print('wrapping long lines')
        out = self._check_length(out)

        KSP.set_compiled(False)
        print('sucsessfully generated')
        return out
Beispiel #6
0
 def setUp(self):
     # super().setUp()
     self.int = 3
     self.inlined = False
     KSP.in_init(False)