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))
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)
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]);
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
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