fix: Python 3.7~3.8 bugs

This commit is contained in:
Shunsuke Shibayama 2023-09-13 11:09:30 +09:00
parent 75c1ac733c
commit aacdca31b8
6 changed files with 35 additions and 4 deletions

View file

@ -187,6 +187,7 @@ pub struct PyCodeGenerator {
union_loaded: bool,
fake_generic_loaded: bool,
abc_loaded: bool,
builtins_loaded: bool,
unit_size: usize,
units: PyCodeGenStack,
fresh_gen: SharedFreshNameGenerator,
@ -209,6 +210,7 @@ impl PyCodeGenerator {
union_loaded: false,
fake_generic_loaded: false,
abc_loaded: false,
builtins_loaded: false,
unit_size: 0,
units: PyCodeGenStack::empty(),
fresh_gen: SharedFreshNameGenerator::new("codegen"),
@ -231,6 +233,7 @@ impl PyCodeGenerator {
union_loaded: false,
fake_generic_loaded: false,
abc_loaded: false,
builtins_loaded: false,
unit_size: 0,
units: PyCodeGenStack::empty(),
fresh_gen: self.fresh_gen.clone(),
@ -253,6 +256,7 @@ impl PyCodeGenerator {
self.union_loaded = false;
self.fake_generic_loaded = false;
self.abc_loaded = false;
self.builtins_loaded = false;
}
#[inline]
@ -2456,13 +2460,18 @@ impl PyCodeGenerator {
Some(7) => self.emit_with_instr_307(args),
_ => todo!("not supported Python version"),
},
"sum" if self.py_version.minor <= Some(7) && args.get_kw("start").is_some() => {
self.load_builtins();
self.emit_load_name_instr(Identifier::private("#sum"));
self.emit_args_311(args, Name, true);
}
other if local.ref_t().is_poly_type_meta() && other != "classof" => {
if self.py_version.minor <= Some(9) {
self.load_fake_generic();
self.emit_load_name_instr(Identifier::private("#FakeGenericAlias"));
let mut args = args;
args.insert_pos(0, PosArg::new(Expr::Accessor(Accessor::Ident(local))));
self.emit_args_311(args, Name, false);
self.emit_args_311(args, Name, true);
} else {
self.emit_load_name_instr(local);
self.emit_index_args(args);
@ -3573,6 +3582,13 @@ impl PyCodeGenerator {
);
}
fn load_builtins(&mut self) {
self.emit_global_import_items(
Identifier::public("_erg_builtins"),
vec![(Identifier::public("sum"), Some(Identifier::private("#sum")))],
);
}
pub fn emit(&mut self, hir: HIR) -> CodeObj {
log!(info "the code-generating process has started.{RESET}");
self.unit_size += 1;