mirror of
https://github.com/erg-lang/erg.git
synced 2025-10-01 21:21:10 +00:00
Fix #296
This commit is contained in:
parent
debd544fdb
commit
ec4d668189
5 changed files with 25 additions and 20 deletions
|
@ -58,5 +58,5 @@ bd_zh_cn_re = "build --features debug --features simplified_chinese --release"
|
||||||
bd_zh_tw_re = "build --features debug --features traditional_chinese --release"
|
bd_zh_tw_re = "build --features debug --features traditional_chinese --release"
|
||||||
|
|
||||||
# static linking to libc
|
# static linking to libc
|
||||||
[target.'cfg(unix)']
|
# [target.'cfg(unix)']
|
||||||
rustflags = ["-C", "target-feature=+crt-static"]
|
# rustflags = ["-C", "target-feature=+crt-static"]
|
||||||
|
|
|
@ -328,6 +328,7 @@ impl PyCodeGenerator {
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn edit_code(&mut self, idx: usize, arg: usize) {
|
fn edit_code(&mut self, idx: usize, arg: usize) {
|
||||||
|
log!(err "editing: {idx} {arg}");
|
||||||
match u8::try_from(arg) {
|
match u8::try_from(arg) {
|
||||||
Ok(u8code) => {
|
Ok(u8code) => {
|
||||||
*self.mut_cur_block_codeobj().code.get_mut(idx).unwrap() = u8code;
|
*self.mut_cur_block_codeobj().code.get_mut(idx).unwrap() = u8code;
|
||||||
|
@ -660,14 +661,6 @@ impl PyCodeGenerator {
|
||||||
.local_search(&escaped, Name)
|
.local_search(&escaped, Name)
|
||||||
.unwrap_or_else(|| self.register_name(escaped));
|
.unwrap_or_else(|| self.register_name(escaped));
|
||||||
let instr = self.select_load_instr(name.kind, Name);
|
let instr = self.select_load_instr(name.kind, Name);
|
||||||
/*let null_idx = self.cur_block_codeobj().code.len() - 2;
|
|
||||||
if instr == LOAD_GLOBAL
|
|
||||||
&& self.cur_block_codeobj().code.get(null_idx) == Some(&(Opcode311::PUSH_NULL as u8))
|
|
||||||
{
|
|
||||||
self.mut_cur_block_codeobj().code.pop();
|
|
||||||
self.mut_cur_block_codeobj().code.pop();
|
|
||||||
self.mut_cur_block().lasti -= 2;
|
|
||||||
}*/
|
|
||||||
self.write_instr(instr);
|
self.write_instr(instr);
|
||||||
self.write_arg(name.idx);
|
self.write_arg(name.idx);
|
||||||
self.stack_inc();
|
self.stack_inc();
|
||||||
|
@ -2879,8 +2872,11 @@ impl PyCodeGenerator {
|
||||||
let freevars_len = self.cur_block_codeobj().freevars.len();
|
let freevars_len = self.cur_block_codeobj().freevars.len();
|
||||||
if freevars_len > 0 {
|
if freevars_len > 0 {
|
||||||
self.mut_cur_block_codeobj().flags += CodeObjFlags::Nested as u32;
|
self.mut_cur_block_codeobj().flags += CodeObjFlags::Nested as u32;
|
||||||
|
if self.py_version.minor >= Some(11) {
|
||||||
self.edit_code(idx_copy_free_vars + 1, freevars_len);
|
self.edit_code(idx_copy_free_vars + 1, freevars_len);
|
||||||
|
}
|
||||||
} else if self.py_version.minor >= Some(11) {
|
} else if self.py_version.minor >= Some(11) {
|
||||||
|
// cancel copying
|
||||||
let code = self.cur_block_codeobj().code.get(idx_copy_free_vars);
|
let code = self.cur_block_codeobj().code.get(idx_copy_free_vars);
|
||||||
debug_assert_eq!(code, Some(&(Opcode311::COPY_FREE_VARS as u8)));
|
debug_assert_eq!(code, Some(&(Opcode311::COPY_FREE_VARS as u8)));
|
||||||
self.edit_code(idx_copy_free_vars, CommonOpcode::NOP as usize);
|
self.edit_code(idx_copy_free_vars, CommonOpcode::NOP as usize);
|
||||||
|
|
|
@ -313,7 +313,7 @@ impl CodeObj {
|
||||||
pub fn into_bytes(self, python_ver: PythonVersion) -> Vec<u8> {
|
pub fn into_bytes(self, python_ver: PythonVersion) -> Vec<u8> {
|
||||||
let mut bytes = vec![DataTypePrefix::Code as u8];
|
let mut bytes = vec![DataTypePrefix::Code as u8];
|
||||||
bytes.append(&mut self.argcount.to_le_bytes().to_vec());
|
bytes.append(&mut self.argcount.to_le_bytes().to_vec());
|
||||||
if python_ver.minor >= Some(10) {
|
if python_ver.minor >= Some(8) {
|
||||||
bytes.append(&mut self.posonlyargcount.to_le_bytes().to_vec());
|
bytes.append(&mut self.posonlyargcount.to_le_bytes().to_vec());
|
||||||
}
|
}
|
||||||
bytes.append(&mut self.kwonlyargcount.to_le_bytes().to_vec());
|
bytes.append(&mut self.kwonlyargcount.to_le_bytes().to_vec());
|
||||||
|
|
21
src/dummy.rs
21
src/dummy.rs
|
@ -1,6 +1,7 @@
|
||||||
use std::fs::remove_file;
|
use std::fs::remove_file;
|
||||||
use std::io::{Read, Write};
|
use std::io::{Read, Write};
|
||||||
use std::net::{Ipv4Addr, SocketAddrV4, TcpListener, TcpStream};
|
use std::net::{Ipv4Addr, SocketAddrV4, TcpListener, TcpStream};
|
||||||
|
use std::process;
|
||||||
use std::thread::sleep;
|
use std::thread::sleep;
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
|
|
||||||
|
@ -94,7 +95,10 @@ impl Runnable for DummyVM {
|
||||||
|
|
||||||
fn finish(&mut self) {
|
fn finish(&mut self) {
|
||||||
if let Some(stream) = &mut self.stream {
|
if let Some(stream) = &mut self.stream {
|
||||||
stream.write_all("exit".as_bytes()).unwrap();
|
if let Err(err) = stream.write_all("exit".as_bytes()) {
|
||||||
|
eprintln!("Write error: {err}");
|
||||||
|
process::exit(1);
|
||||||
|
}
|
||||||
let mut buf = [0; 1024];
|
let mut buf = [0; 1024];
|
||||||
match stream.read(&mut buf) {
|
match stream.read(&mut buf) {
|
||||||
Result::Ok(n) => {
|
Result::Ok(n) => {
|
||||||
|
@ -103,8 +107,9 @@ impl Runnable for DummyVM {
|
||||||
println!("The REPL server is closed.");
|
println!("The REPL server is closed.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Result::Err(e) => {
|
Result::Err(err) => {
|
||||||
panic!("{}", format!("Read error: {e}"));
|
eprintln!("Read error: {err}");
|
||||||
|
process::exit(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
remove_file("o.pyc").unwrap_or(());
|
remove_file("o.pyc").unwrap_or(());
|
||||||
|
@ -156,15 +161,17 @@ impl Runnable for DummyVM {
|
||||||
}
|
}
|
||||||
s.to_string()
|
s.to_string()
|
||||||
}
|
}
|
||||||
Result::Err(e) => {
|
Result::Err(err) => {
|
||||||
self.finish();
|
self.finish();
|
||||||
panic!("{}", format!("Read error: {e}"));
|
eprintln!("Read error: {err}");
|
||||||
|
process::exit(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Result::Err(e) => {
|
Result::Err(err) => {
|
||||||
self.finish();
|
self.finish();
|
||||||
panic!("{}", format!("Sending error: {e}"))
|
eprintln!("Sending error: {err}");
|
||||||
|
process::exit(1);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
if res.ends_with("None") {
|
if res.ends_with("None") {
|
||||||
|
|
|
@ -70,7 +70,9 @@ fn _exec_vm(file_path: &'static str) -> Result<i32, CompileErrors> {
|
||||||
} else {
|
} else {
|
||||||
Some("python3")
|
Some("python3")
|
||||||
};
|
};
|
||||||
// cfg.target_version = Some(PythonVersion::new(3, Some(10), Some(6))); // your Python's version
|
// cfg.target_version = Some(PythonVersion::new(3, Some(8), Some(10))); // your Python's version
|
||||||
|
// cfg.py_magic_num = Some(3413); // in (most) 3.8.x
|
||||||
|
// cfg.target_version = Some(PythonVersion::new(3, Some(10), Some(6)));
|
||||||
// cfg.py_magic_num = Some(3439); // in (most) 3.10.x
|
// cfg.py_magic_num = Some(3439); // in (most) 3.10.x
|
||||||
cfg.target_version = Some(PythonVersion::new(3, Some(11), Some(0)));
|
cfg.target_version = Some(PythonVersion::new(3, Some(11), Some(0)));
|
||||||
cfg.py_magic_num = Some(3495); // in 3.11.0
|
cfg.py_magic_num = Some(3495); // in 3.11.0
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue