This commit is contained in:
Sebastien Bourdeauducq 2022-04-18 15:55:37 +08:00
parent 44199781dc
commit 1eac111d4c
2 changed files with 8 additions and 24 deletions

View File

@ -496,12 +496,7 @@ pub fn gen_constructor<'ctx, 'a, G: CodeGenerator>(
match def { match def {
TopLevelDef::Class { methods, .. } => { TopLevelDef::Class { methods, .. } => {
// TODO: what about other fields that require alloca? // TODO: what about other fields that require alloca?
let mut fun_id = None; let fun_id = methods.iter().find(|method| method.0 == "__init__".into()).and_then(|method| Some(method.2));
for (name, _, id) in methods.iter() {
if name == &"__init__".into() {
fun_id = Some(*id);
}
}
let ty = ctx.get_llvm_type(generator, signature.ret).into_pointer_type(); let ty = ctx.get_llvm_type(generator, signature.ret).into_pointer_type();
let zelf_ty: BasicTypeEnum = ty.get_element_type().try_into().unwrap(); let zelf_ty: BasicTypeEnum = ty.get_element_type().try_into().unwrap();
let zelf: BasicValueEnum<'ctx> = ctx.builder.build_alloca(zelf_ty, "alloca").into(); let zelf: BasicValueEnum<'ctx> = ctx.builder.build_alloca(zelf_ty, "alloca").into();
@ -1005,13 +1000,7 @@ pub fn gen_binop_expr<'ctx, 'a, G: CodeGenerator>(
let defs = ctx.top_level.definitions.read(); let defs = ctx.top_level.definitions.read();
let obj_def = defs.get(id.0).unwrap().read(); let obj_def = defs.get(id.0).unwrap().read();
if let TopLevelDef::Class { methods, .. } = &*obj_def { if let TopLevelDef::Class { methods, .. } = &*obj_def {
let mut fun_id = None; methods.iter().find(|method| method.0 == op_name).unwrap().2
for (name, _, id) in methods.iter() {
if name == &op_name {
fun_id = Some(*id);
}
}
fun_id.unwrap()
} else { } else {
unreachable!() unreachable!()
} }
@ -1409,13 +1398,7 @@ pub fn gen_expr<'ctx, 'a, G: CodeGenerator>(
let defs = ctx.top_level.definitions.read(); let defs = ctx.top_level.definitions.read();
let obj_def = defs.get(id.0).unwrap().read(); let obj_def = defs.get(id.0).unwrap().read();
if let TopLevelDef::Class { methods, .. } = &*obj_def { if let TopLevelDef::Class { methods, .. } = &*obj_def {
let mut fun_id = None; methods.iter().find(|method| method.0 == *attr).unwrap().2
for (name, _, id) in methods.iter() {
if name == attr {
fun_id = Some(*id);
}
}
fun_id.unwrap()
} else { } else {
unreachable!() unreachable!()
} }

View File

@ -205,13 +205,14 @@ fn main() {
continue; continue;
} }
// still needs to skip this `from __future__ import annotations` because this seems to be // allow (and ignore) "from __future__ import annotations"
// magic in python and there seems no way to patch it from another module..
if matches!( if matches!(
&stmt.node, &stmt.node,
StmtKind::ImportFrom { module, names, .. } StmtKind::ImportFrom { module, names, .. }
if module == &Some("__future__".into()) && names[0].name == "annotations".into() if module == &Some("__future__".into()) && names.len() == 1 && names[0].name == "annotations".into()
) { continue; } ) {
continue;
}
let (name, def_id, ty) = let (name, def_id, ty) =
composer.register_top_level(stmt, Some(resolver.clone()), "__main__".into()).unwrap(); composer.register_top_level(stmt, Some(resolver.clone()), "__main__".into()).unwrap();