mirror of
https://github.com/erg-lang/erg.git
synced 2025-09-29 20:34:44 +00:00
WIP
This commit is contained in:
parent
5e73048367
commit
c58042c640
1 changed files with 19 additions and 9 deletions
|
@ -201,6 +201,14 @@ impl CodeGenerator {
|
||||||
&self.toplevel_block().codeobj
|
&self.toplevel_block().codeobj
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
#[allow(dead_code)]
|
||||||
|
fn emit_print_expr(&mut self) {
|
||||||
|
self.write_instr(Opcode311::PRINT_EXPR);
|
||||||
|
self.write_arg(0);
|
||||||
|
self.stack_dec();
|
||||||
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn jump_delta(&self, jump_to: usize) -> usize {
|
fn jump_delta(&self, jump_to: usize) -> usize {
|
||||||
if self.py_version.minor >= Some(10) {
|
if self.py_version.minor >= Some(10) {
|
||||||
|
@ -490,18 +498,19 @@ impl CodeGenerator {
|
||||||
.unwrap_or_else(|| self.register_name(escaped));
|
.unwrap_or_else(|| self.register_name(escaped));
|
||||||
let instr = match name.kind {
|
let instr = match name.kind {
|
||||||
StoreLoadKind::Fast | StoreLoadKind::FastConst => LOAD_FAST,
|
StoreLoadKind::Fast | StoreLoadKind::FastConst => LOAD_FAST,
|
||||||
StoreLoadKind::Global | StoreLoadKind::GlobalConst => LOAD_GLOBAL,
|
StoreLoadKind::Global | StoreLoadKind::GlobalConst =>
|
||||||
|
if self.py_version.minor >= Some(11) { LOAD_NAME } else { LOAD_GLOBAL },
|
||||||
StoreLoadKind::Deref | StoreLoadKind::DerefConst => LOAD_DEREF,
|
StoreLoadKind::Deref | StoreLoadKind::DerefConst => LOAD_DEREF,
|
||||||
StoreLoadKind::Local | StoreLoadKind::LocalConst => LOAD_NAME,
|
StoreLoadKind::Local | StoreLoadKind::LocalConst => LOAD_NAME,
|
||||||
};
|
};
|
||||||
let null_idx = self.cur_block_codeobj().code.len() - 2;
|
// let null_idx = self.cur_block_codeobj().code.len() - 2;
|
||||||
if instr == LOAD_GLOBAL
|
/*if instr == LOAD_GLOBAL
|
||||||
&& self.cur_block_codeobj().code.get(null_idx) == Some(&(Opcode311::PUSH_NULL as u8))
|
&& 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_codeobj().code.pop();
|
self.mut_cur_block_codeobj().code.pop();
|
||||||
self.mut_cur_block().lasti -= 2;
|
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();
|
||||||
|
@ -625,6 +634,7 @@ impl CodeGenerator {
|
||||||
self.write_instr(instr);
|
self.write_instr(instr);
|
||||||
self.write_arg(name.idx);
|
self.write_arg(name.idx);
|
||||||
if self.py_version.minor >= Some(11) {
|
if self.py_version.minor >= Some(11) {
|
||||||
|
self.stack_inc(); // instead of PUSH_NULL
|
||||||
self.write_bytes(&[0; 20]);
|
self.write_bytes(&[0; 20]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -772,7 +782,7 @@ impl CodeGenerator {
|
||||||
if self.py_version.minor >= Some(11) {
|
if self.py_version.minor >= Some(11) {
|
||||||
self.write_instr(Opcode311::PUSH_NULL);
|
self.write_instr(Opcode311::PUSH_NULL);
|
||||||
self.write_arg(0);
|
self.write_arg(0);
|
||||||
// self.stack_inc();
|
self.stack_inc();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -784,12 +794,12 @@ impl CodeGenerator {
|
||||||
self.write_instr(Opcode311::CALL);
|
self.write_instr(Opcode311::CALL);
|
||||||
self.write_arg(argc);
|
self.write_arg(argc);
|
||||||
self.write_bytes(&[0; 8]);
|
self.write_bytes(&[0; 8]);
|
||||||
|
self.stack_dec();
|
||||||
}
|
}
|
||||||
|
|
||||||
fn emit_call_instr(&mut self, argc: usize, kind: AccessKind) {
|
fn emit_call_instr(&mut self, argc: usize, kind: AccessKind) {
|
||||||
if self.py_version.minor >= Some(11) {
|
if self.py_version.minor >= Some(11) {
|
||||||
self.emit_precall_and_call(argc);
|
self.emit_precall_and_call(argc);
|
||||||
// self.stack_dec();
|
|
||||||
} else {
|
} else {
|
||||||
match kind {
|
match kind {
|
||||||
AccessKind::Method => self.write_instr(Opcode310::CALL_METHOD),
|
AccessKind::Method => self.write_instr(Opcode310::CALL_METHOD),
|
||||||
|
@ -1062,6 +1072,7 @@ impl CodeGenerator {
|
||||||
make_function_flag += MakeFunctionFlags::Defaults as usize;
|
make_function_flag += MakeFunctionFlags::Defaults as usize;
|
||||||
}
|
}
|
||||||
let code = self.emit_block(body.block, Some(name.clone()), params);
|
let code = self.emit_block(body.block, Some(name.clone()), params);
|
||||||
|
// code.flags += CodeObjFlags::Optimized as u32;
|
||||||
if !self.cur_block_codeobj().cellvars.is_empty() {
|
if !self.cur_block_codeobj().cellvars.is_empty() {
|
||||||
let cellvars_len = self.cur_block_codeobj().cellvars.len();
|
let cellvars_len = self.cur_block_codeobj().cellvars.len();
|
||||||
for i in 0..cellvars_len {
|
for i in 0..cellvars_len {
|
||||||
|
@ -1693,6 +1704,7 @@ impl CodeGenerator {
|
||||||
self.emit_call_local(ident, call.args)
|
self.emit_call_local(ident, call.args)
|
||||||
}
|
}
|
||||||
other => {
|
other => {
|
||||||
|
self.emit_push_null();
|
||||||
self.emit_expr(other);
|
self.emit_expr(other);
|
||||||
self.emit_args_311(call.args, Name);
|
self.emit_args_311(call.args, Name);
|
||||||
}
|
}
|
||||||
|
@ -2383,9 +2395,7 @@ impl CodeGenerator {
|
||||||
self.emit_load_method_instr(Identifier::public("append"));
|
self.emit_load_method_instr(Identifier::public("append"));
|
||||||
self.emit_load_const(erg_std_path().to_str().unwrap());
|
self.emit_load_const(erg_std_path().to_str().unwrap());
|
||||||
self.emit_call_instr(1, Method);
|
self.emit_call_instr(1, Method);
|
||||||
if self.py_version.minor < Some(11) {
|
self.stack_dec();
|
||||||
self.stack_dec();
|
|
||||||
}
|
|
||||||
self.emit_pop_top();
|
self.emit_pop_top();
|
||||||
let erg_std_mod = if self.py_version.minor >= Some(10) {
|
let erg_std_mod = if self.py_version.minor >= Some(10) {
|
||||||
Identifier::public("_erg_std_prelude")
|
Identifier::public("_erg_std_prelude")
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue