def run(self): self.init_ctx() rl = None def set_prompt(p): self.prompt = p def prompt(lw): self.from_repl.put(to_python(lw)) self.ctx.g.set_prompt = set_prompt self.ctx.g.prompt = prompt self.ctx.eval( """ listeners = {}; rl = { setPrompt:set_prompt, write:Duktape.write, clearLine: function() {}, on: function(ev, cb) { listeners[ev] = cb; return rl; }, prompt: prompt, sync_prompt: true, send_line: function(line) { listeners['line'](line); }, send_interrupt: function() { listeners['SIGINT'](); }, close: function() {listeners['close'](); }, }; repl_options.readline = { createInterface: function(options) { rl.completer = options.completer; return rl; }}; exports.init_repl(repl_options) """, fname="<init repl>", ) rl = self.ctx.g.rl completer = to_python(rl.completer) send_interrupt = to_python(rl.send_interrupt) send_line = to_python(rl.send_line) while True: ev, line = self.to_repl.get() try: if ev == "SIGINT": self.output.write("\n") send_interrupt() elif ev == "line": send_line(line) else: val = completer(line) val = to_python(val) self.from_repl.put(val[0]) except Exception as e: if isinstance(e, JSError): print(e.stack or e.message, file=sys.stderr) else: import traceback traceback.print_exc() for i in xrange(100): # Do this many times to ensure we dont deadlock self.from_repl.put(None)
def run(self): self.init_ctx() rl = None def set_prompt(p): self.prompt = p def prompt(lw): self.from_repl.put(to_python(lw)) self.ctx.g.set_prompt = set_prompt self.ctx.g.prompt = prompt self.ctx.eval(''' listeners = {}; rl = { setPrompt:set_prompt, write:Duktape.write, clearLine: function() {}, on: function(ev, cb) { listeners[ev] = cb; return rl; }, prompt: prompt, sync_prompt: true, send_line: function(line) { listeners['line'](line); }, send_interrupt: function() { listeners['SIGINT'](); }, close: function() {listeners['close'](); }, }; repl_options.readline = { createInterface: function(options) { rl.completer = options.completer; return rl; }}; exports.init_repl(repl_options) ''', fname='<init repl>') rl = self.ctx.g.rl completer = to_python(rl.completer) send_interrupt = to_python(rl.send_interrupt) send_line = to_python(rl.send_line) while True: ev, line = self.to_repl.get() try: if ev == 'SIGINT': self.output.write('\n') send_interrupt() elif ev == 'line': send_line(line) else: val = completer(line) val = to_python(val) self.from_repl.put(val[0]) except Exception as e: if isinstance(e, JSError): print(e.stack or error_message(e), file=sys.stderr) else: import traceback traceback.print_exc() for i in range(100): # Do this many times to ensure we dont deadlock self.from_repl.put(None)
def compile_pyj(data, filename='<stdin>', beautify=True, private_scope=True, libdir=None, omit_baselib=False): if isinstance(data, bytes): data = data.decode('utf-8') c = compiler() c.g.current_options = { 'beautify':beautify, 'private_scope':private_scope, 'omit_baselib': omit_baselib, 'libdir': libdir or P('rapydscript/lib', allow_user_override=False), 'basedir': os.getcwdu() if not filename or filename == '<stdin>' else os.path.dirname(filename), 'filename': filename, } c.g.rs_source_code = data ok, result = c.eval( ''' ans = [null, null]; try { ans = [true, exports["compile"](rs_source_code, %s, current_options)]; } catch(e) { ans = [false, e] } ans; ''' % json.dumps(filename)) if ok: return result presult = to_python(result) if 'message' in result: msg = presult['message'] if 'filename' in presult and 'line' in presult: msg = '%s:%s:%s' % (presult['filename'], presult['line'], msg) raise CompileFailure(msg) if result.stack: # Javascript error object instead of ParseError raise CompileFailure(result.stack) raise CompileFailure(repr(presult))
def compile_pyj(data, filename='<stdin>', beautify=True, private_scope=True, libdir=None, omit_baselib=False): if isinstance(data, bytes): data = data.decode('utf-8') c = compiler() c.g.current_options = { 'beautify':beautify, 'private_scope':private_scope, 'omit_baselib': omit_baselib, 'libdir': libdir or default_lib_dir(), 'basedir': getcwd() if not filename or filename == '<stdin>' else os.path.dirname(filename), 'filename': filename, } c.g.rs_source_code = data ok, result = c.eval( ''' ans = [null, null]; try { ans = [true, exports["compile"](rs_source_code, %s, current_options)]; } catch(e) { ans = [false, e] } ans; ''' % json.dumps(filename)) if ok: return result presult = to_python(result) if 'message' in result: msg = presult['message'] if 'filename' in presult and 'line' in presult: msg = '%s:%s:%s' % (presult['filename'], presult['line'], msg) raise CompileFailure(msg) if result.stack: # Javascript error object instead of ParseError raise CompileFailure(result.stack) raise CompileFailure(repr(presult))
def compile_pyj(data, filename='<stdin>', beautify=True, private_scope=True, libdir=None, omit_baselib=False): if isinstance(data, bytes): data = data.decode('utf-8') c = compiler() c.g.current_options = { 'beautify':beautify, 'private_scope':private_scope, 'omit_baselib': omit_baselib, 'libdir': libdir or P('rapydscript/lib', allow_user_override=False), 'basedir': os.getcwdu() if not filename or filename == '<stdin>' else os.path.dirname(filename), 'filename': filename, } c.g.rs_source_code = data ok, result = c.eval( ''' ans = [null, null]; try { ans = [true, exports["compile"](rs_source_code, %s, current_options)]; } catch(e) { ans = [false, e] } ans; ''' % json.dumps(filename)) if ok: return result result = to_python(result) if 'message' in result: msg = result['message'] if 'filename' in result and 'line' in result: msg = '%s:%s:%s' % (result['filename'], result['line'], msg) raise CompileFailure(msg) raise CompileFailure(repr(result))
def run(self): self.init_ctx() rl = None def set_prompt(p): self.prompt = p def prompt(lw): self.from_repl.put(to_python(lw)) self.ctx.g.set_prompt = set_prompt self.ctx.g.prompt = prompt self.ctx.eval(''' listeners = {}; rl = { setPrompt:set_prompt, write:Duktape.write, clearLine:function() {}, on: function(ev, cb) { listeners[ev] = cb; return rl; }, prompt: prompt, sync_prompt: true, send_line: function(line) { listeners['line'](line); }, send_interrupt: function() { listeners['SIGINT'](); }, close: function() {listeners['close'](); } }; ''') rl = self.ctx.g.rl self.ctx.eval('module.exports(repl_options)') while True: ev, line = self.to_repl.get() try: if ev == 'SIGINT': self.output.write('\n') rl.send_interrupt() elif ev == 'line': rl.send_line(line) else: val = rl.completer(line) val = to_python(val) self.from_repl.put(val[0]) except Exception as e: if 'JSError' in e.__class__.__name__: e = JSError(e) # A bare JSError print (e.stack or e.message, file=sys.stderr) else: import traceback traceback.print_exc() for i in xrange(100): # Do this many times to ensure we dont deadlock self.from_repl.put(None)
def compile_pyj(data, filename="<stdin>", beautify=True, private_scope=True, libdir=None, omit_baselib=False): if isinstance(data, bytes): data = data.decode("utf-8") c = compiler() c.g.current_options = { "beautify": beautify, "private_scope": private_scope, "omit_baselib": omit_baselib, "libdir": libdir or P("rapydscript/lib", allow_user_override=False), "basedir": os.getcwdu() if not filename or filename == "<stdin>" else os.path.dirname(filename), "filename": filename, } c.g.rs_source_code = data ok, result = c.eval( """ ans = [null, null]; try { ans = [true, exports["compile"](rs_source_code, %s, current_options)]; } catch(e) { ans = [false, e] } ans; """ % json.dumps(filename) ) if ok: return result presult = to_python(result) if "message" in result: msg = presult["message"] if "filename" in presult and "line" in presult: msg = "%s:%s:%s" % (presult["filename"], presult["line"], msg) raise CompileFailure(msg) if result.stack: # Javascript error object instead of ParseError raise CompileFailure(result.stack) raise CompileFailure(repr(presult))
def prompt(lw): self.from_repl.put(to_python(lw))