Exemple #1
0
def _import_lib(vm, leaf, vm_path, cnd_dirs):
    vm_dir = _dirname(vm_path)
    for d in cnd_dirs:
        path = "%s/%s/%s" % (vm_dir, d, leaf)
        if os.path.exists(path):
            break
    else:
        _warning(vm_path, "Warning: Can't find %s." % leaf)
        return

    bc, start = _read_bc(path, "CONVLIBR")
    if start != 0:
        raise Exception("XXX")
    Bytecode.add_lib(vm, rffi.str2charp(bc))
Exemple #2
0
def _import_lib(vm, leaf, vm_path, cnd_dirs):
    vm_dir = _dirname(vm_path)
    for d in cnd_dirs:
        path = "%s/%s/%s" % (vm_dir, d, leaf)
        if os.path.exists(path):
            break
    else:
        _warning(vm_path, "Warning: Can't find %s." % leaf)
        return

    bc, start = _read_bc(path, "CONVLIBR")
    if start != 0:
        raise Exception("XXX")
    Bytecode.add_lib(vm, rffi.str2charp(bc))
Exemple #3
0
def _make_mode(vm_path, path, bc, verbosity, mk_fresh):
    # Try to work out a plausible cached path name.
    dp = path.rfind(os.extsep)
    if dp >= 0 and os.sep not in path[dp:]:
        cp = path[:dp]
    else:
        cp = None
    
    if not cp or mk_fresh:
        return _do_make_mode(vm_path, path, None, verbosity, mk_fresh)
    else:
		# There is a cached path, so now we try and load it and see if it is upto date. If any part
		# of this fails, we simply go straight to full make mode.
        try:
            st = os.stat(cp)
        except OSError:
            return _do_make_mode(vm_path, path, cp, verbosity, mk_fresh)
        
        cbc, start = _read_bc(cp, "CONVEXEC")
        if start == -1:
            return _do_make_mode(vm_path, path, cp, verbosity, mk_fresh)
        
        assert start >= 0
        useful_bc = cbc[start:]
        if Bytecode.exec_upto_date(None, rffi.str2charp(useful_bc), st.st_mtime):
            return cbc, start, 0
        
        return _do_make_mode(vm_path, path, cp, verbosity, mk_fresh)
Exemple #4
0
def _make_mode(vm_path, path, bc, verbosity, mk_fresh):
    # Try to work out a plausible cached path name.
    dp = path.rfind(os.extsep)
    if dp >= 0 and os.sep not in path[dp:]:
        cp = path[:dp]
    else:
        cp = None

    if not cp or mk_fresh:
        return _do_make_mode(vm_path, path, None, verbosity, mk_fresh)
    else:
        # There is a cached path, so now we try and load it and see if it is upto date. If any part
        # of this fails, we simply go straight to full make mode.
        try:
            st = os.stat(cp)
        except OSError:
            return _do_make_mode(vm_path, path, cp, verbosity, mk_fresh)

        cbc, start = _read_bc(cp, "CONVEXEC")
        if start == -1:
            return _do_make_mode(vm_path, path, cp, verbosity, mk_fresh)

        assert start >= 0
        useful_bc = cbc[start:]
        if Bytecode.exec_upto_date(None, rffi.str2charp(useful_bc),
                                   st.st_mtime):
            return cbc, start, 0

        return _do_make_mode(vm_path, path, cp, verbosity, mk_fresh)
Exemple #5
0
	def __init__(self, Program):
		self.ID = 0;
		self.Level = 0;
		self.Program = Program;
		self.CodeStack = Bytecode.CodeStack();

		self.Builtins = {};
		self.VariableMap = {};
		self.InvokableMap = {};
		self.InvokingRequests = [];

		self.AddBuiltin('read'		, 'read'	, None	, False	, True);
		self.AddBuiltin('readln'	, 'readln'	, None	, False	, True);
		self.AddBuiltin('write'		, 'write'	, None	, False	, False);
		self.AddBuiltin('writeln'	, 'writeln'	, None	, False	, False);

		self.AddBuiltin('char'		, 'chr'		, 1		, True	, [False]);
		self.AddBuiltin('real'		, 'real'	, 1		, True	, [False]);
		self.AddBuiltin('string'	, 'str'		, 1		, True	, [False]);
		self.AddBuiltin('integer'	, 'int'		, 1		, True	, [False]);
		self.AddBuiltin('boolean'	, 'bool'	, 1		, True	, [False]);

		self.AddBuiltin('sin'		, 'sin'		, 1		, True	, [False]);
		self.AddBuiltin('cos'		, 'cos'		, 1		, True	, [False]);
		self.AddBuiltin('tan'		, 'tan'		, 1		, True	, [False]);
		self.AddBuiltin('sqrt'		, 'sqrt'	, 1		, True	, [False]);

		self.AddBuiltin('length'	, 'lens'	, 1		, True	, [False]);
		self.AddBuiltin('concat'	, 'cats'	, 2		, True	, [False, False]);
		self.AddBuiltin('copy'		, 'cpys'	, 3		, True	, [False, False, False]);
		self.AddBuiltin('insert'	, 'ints'	, 3		, False	, [False, True , False]);
		self.AddBuiltin('delete'	, 'dels'	, 3		, False	, [True , False, False]);
Exemple #6
0
def entry_point(argv):
    vm_path = _get_vm_path(argv)
    
    verbosity = 0
    mk_fresh = False
    i = 1
    for i in range(1, len(argv)):
        arg = argv[i]
        if len(arg) == 0 or (len(arg) == 1 and arg[0] == "-"):
            _usage(vm_path)
            return 1
        if arg[0] == "-":
            for c in arg[1:]:
                if c == "v":
                    verbosity += 1
                elif c == "f":
                    mk_fresh = True
                else:
                    _usage(vm_path)
                    return 1
        else:
            break
    if i < len(argv):
        filename = argv[i]
        if i + 1 < len(argv):
            args = argv[i + 1 : ]
        else:
            args = []
    else:
        filename = None
        args = []

    if filename is None:
        convergeip = _find_con_exec(vm_path, "convergei")
        if convergeip is None:
            return 1
        filename = convergeip

    progp = _canon_path(filename)
    bc, start = _read_bc(progp, "CONVEXEC")
    if len(bc) == 0:
        _error(vm_path, "No such file '%s'." % filename)
        return 1
    
    if start == -1:
        bc, start, rtn = _make_mode(vm_path, progp, bc, verbosity, mk_fresh)
        if rtn != 0:
            return rtn

    if start == -1:
        _error(vm_path, "No valid bytecode to run.")
        return 1

    assert start >= 0
    useful_bc = rffi.str2charp(bc[start:])
    vm = VM.new_vm(vm_path, args)
    _import_lib(vm, "Stdlib.cvl", vm_path, STDLIB_DIRS)
    _import_lib(vm, "Compiler.cvl", vm_path, COMPILER_DIRS)
    try:
        main_mod_id = Bytecode.add_exec(vm, useful_bc)
        mod = vm.get_mod(main_mod_id)
        mod.import_(vm)
        vm.apply(mod.get_defn(vm, "main"))
    except VM.Con_Raise_Exception, e:
        ex_mod = vm.get_builtin(Builtins.BUILTIN_EXCEPTIONS_MODULE)
        sys_ex_class = ex_mod.get_defn(vm, "System_Exit_Exception")
        if vm.get_slot_apply(sys_ex_class, "instantiated", [e.ex_obj], allow_fail=True) is not None:
            code = Builtins.type_check_int(vm, e.ex_obj.get_slot(vm, "code"))
            return int(code.v)
        else:
            pb = vm.import_stdlib_mod(Stdlib_Modules.STDLIB_BACKTRACE).get_defn(vm, "print_best")
            vm.apply(pb, [e.ex_obj])
            return 1
Exemple #7
0
def entry_point(argv):
    vm_path = _get_vm_path(argv)

    verbosity = 0
    mk_fresh = False
    i = 1
    for i in range(1, len(argv)):
        arg = argv[i]
        if len(arg) == 0 or (len(arg) == 1 and arg[0] == "-"):
            _usage(vm_path)
            return 1
        if arg[0] == "-":
            for c in arg[1:]:
                if c == "v":
                    verbosity += 1
                elif c == "f":
                    mk_fresh = True
                else:
                    _usage(vm_path)
                    return 1
        else:
            break
    if i < len(argv):
        filename = argv[i]
        if i + 1 < len(argv):
            args = argv[i + 1:]
        else:
            args = []
    else:
        filename = None
        args = []

    if filename is None:
        convergeip = _find_con_exec(vm_path, "convergei")
        if convergeip is None:
            return 1
        filename = convergeip

    progp = _canon_path(filename)
    bc, start = _read_bc(progp, "CONVEXEC")
    if len(bc) == 0:
        _error(vm_path, "No such file '%s'." % filename)
        return 1

    if start == -1:
        bc, start, rtn = _make_mode(vm_path, progp, bc, verbosity, mk_fresh)
        if rtn != 0:
            return rtn

    if start == -1:
        _error(vm_path, "No valid bytecode to run.")
        return 1

    assert start >= 0
    useful_bc = rffi.str2charp(bc[start:])
    vm = VM.new_vm(vm_path, args)
    _import_lib(vm, "Stdlib.cvl", vm_path, STDLIB_DIRS)
    _import_lib(vm, "Compiler.cvl", vm_path, COMPILER_DIRS)
    try:
        main_mod_id = Bytecode.add_exec(vm, useful_bc)
        mod = vm.get_mod(main_mod_id)
        mod.import_(vm)
        vm.apply(mod.get_defn(vm, "main"))
    except VM.Con_Raise_Exception, e:
        ex_mod = vm.get_builtin(Builtins.BUILTIN_EXCEPTIONS_MODULE)
        sys_ex_class = ex_mod.get_defn(vm, "System_Exit_Exception")
        if vm.get_slot_apply(sys_ex_class,
                             "instantiated", [e.ex_obj],
                             allow_fail=True) is not None:
            code = Builtins.type_check_int(vm, e.ex_obj.get_slot(vm, "code"))
            return int(code.v)
        else:
            pb = vm.import_stdlib_mod(
                Stdlib_Modules.STDLIB_BACKTRACE).get_defn(vm, "print_best")
            vm.apply(pb, [e.ex_obj])
            return 1