GeezerVisonThe World Wide Web, restored to 800 pixels of glory. |
| Home|About|Gaming cabinet|Archives|How it works|Starter sites |
GeezerVison is showing rustpython.github.io — shell.rs.html -- source 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 mod readline; #[cfg(not(target_os = "wasi"))] mod rustyline_helper; use rustpython_compiler::{compile, error::CompileError, error::CompileErrorType}; use rustpython_parser::error::ParseErrorType; use rustpython_vm::{ exceptions::{print_exception, PyBaseExceptionRef}, obj::objtype, pyobject::{ItemProtocol, PyResult}, scope::Scope, VirtualMachine, }; use readline::{Readline, ReadlineResult}; enum ShellExecResult { Ok, PyErr(PyBaseExceptionRef), Continue, } fn shell_exec(vm: &VirtualMachine, source: &str, scope: Scope) -> ShellExecResult { match vm.compile(source, compile::Mode::Single, "<stdin>".to_owned()) { Ok(code) => { match vm.run_code_obj(code, scope.clone()) { Ok(value) => { // Save non-None values as "_" if !vm.is_none(&value) { let key = "_"; scope.globals.set_item(key, value, vm).unwrap(); } ShellExecResult::Ok } Err(err) => ShellExecResult::PyErr(err), } } Err(CompileError { error: CompileErrorType::Parse(ParseErrorType::EOF), .. }) => ShellExecResult::Continue, Err(err) => ShellExecResult::PyErr(vm.new_syntax_error(&err)), } } pub fn run_shell(vm: &VirtualMachine, scope: Scope) -> PyResult<()> { println!( "Welcome to the magnificent Rust Python {} interpreter \u{1f631} \u{1f596}", crate_version!() ); let mut repl = Readline::new(vm, scope.clone()); let mut full_input = String::new(); // Retrieve a `history_path_str` dependent on the OS let repl_history_path = match dirs::config_dir() { Some(mut path) => { path.push("rustpython"); path.push("repl_history.txt"); path } None => ".repl_history.txt".into(), }; if repl.load_history(&repl_history_path).is_err() { println!("No previous history."); } let mut continuing = false; loop { let prompt_name = if continuing { "ps2" } else { "ps1" }; let prompt = vm .get_attribute(vm.sys_module.clone(), prompt_name) .and_then(|prompt| vm.to_str(&prompt)); let prompt = match prompt { Ok(ref s) => s.as_str(), Err(_) => "", }; let result = match repl.readline(prompt) { ReadlineResult::Line(line) => { debug!("You entered {:?}", line); repl.add_history_entry(line.trim_end()).unwrap(); let stop_continuing = line.is_empty(); if full_input.is_empty() { full_input = line; } else { full_input.push_str(&line); } full_input.push_str("\n"); if continuing { if stop_continuing { continuing = false; } else { continue; } } match shell_exec(vm, &full_input, scope.clone()) { ShellExecResult::Ok => { full_input.clear(); Ok(()) } ShellExecResult::Continue => { continuing = true; Ok(()) } ShellExecResult::PyErr(err) => { full_input.clear(); Err(err) } } } ReadlineResult::Interrupt => { continuing = false; full_input.clear(); let keyboard_interrupt = vm.new_exception_empty(vm.ctx.exceptions.keyboard_interrupt.clone()); Err(keyboard_interrupt) } ReadlineResult::EOF => { break; } ReadlineResult::EncodingError => { eprintln!("Invalid UTF-8 entered"); Ok(()) } ReadlineResult::Other(err) => { eprintln!("Readline error: {:?}", err); break; } ReadlineResult::IO(err) => { eprintln!("IO error: {:?}", err); break; } }; if let Err(exc) = result { if objtype::isinstance(&exc, &vm.ctx.exceptions.system_exit) { repl.save_history(&repl_history_path).unwrap(); return Err(exc); } print_exception(vm, &exc); } } repl.save_history(&repl_history_path).unwrap(); Ok(()) } |
| You are visitor 01402520 — GeezerVison does not store the pages you look up. Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required. |