mirror of
https://github.com/erg-lang/erg.git
synced 2025-10-01 05:11:09 +00:00
Fix a method calling bug
This commit is contained in:
parent
4f69725811
commit
c11ea3e892
2 changed files with 25 additions and 17 deletions
|
@ -32,8 +32,8 @@ use crate::error::{CompileError, CompileErrors, CompileResult};
|
||||||
use crate::hir::AttrDef;
|
use crate::hir::AttrDef;
|
||||||
use crate::hir::Attribute;
|
use crate::hir::Attribute;
|
||||||
use crate::hir::{
|
use crate::hir::{
|
||||||
Accessor, Args, Array, Block, Call, ClassDef, Def, DefBody, Expr, Literal, Local, PosArg,
|
Accessor, Args, Array, Block, Call, ClassDef, DefBody, Expr, Literal, Local, PosArg, Signature,
|
||||||
Signature, SubrSignature, Tuple, VarSignature, HIR,
|
SubrSignature, Tuple, VarSignature, HIR,
|
||||||
};
|
};
|
||||||
use AccessKind::*;
|
use AccessKind::*;
|
||||||
|
|
||||||
|
@ -998,7 +998,7 @@ impl CodeGenerator {
|
||||||
}
|
}
|
||||||
other => {
|
other => {
|
||||||
self.codegen_expr(other);
|
self.codegen_expr(other);
|
||||||
self.emit_args(call.args);
|
self.emit_args(call.args, Name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1018,7 +1018,7 @@ impl CodeGenerator {
|
||||||
self.emit_load_name_instr(ident).unwrap_or_else(|e| {
|
self.emit_load_name_instr(ident).unwrap_or_else(|e| {
|
||||||
self.errs.push(e);
|
self.errs.push(e);
|
||||||
});
|
});
|
||||||
self.emit_args(args);
|
self.emit_args(args, Name);
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1040,10 +1040,10 @@ impl CodeGenerator {
|
||||||
.unwrap_or_else(|err| {
|
.unwrap_or_else(|err| {
|
||||||
self.errs.push(err);
|
self.errs.push(err);
|
||||||
});
|
});
|
||||||
self.emit_args(args);
|
self.emit_args(args, Method);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn emit_args(&mut self, mut args: Args) {
|
fn emit_args(&mut self, mut args: Args, kind: AccessKind) {
|
||||||
let argc = args.len();
|
let argc = args.len();
|
||||||
let pos_len = args.pos_args.len();
|
let pos_len = args.pos_args.len();
|
||||||
let mut kws = Vec::with_capacity(args.kw_len());
|
let mut kws = Vec::with_capacity(args.kw_len());
|
||||||
|
@ -1081,8 +1081,12 @@ impl CodeGenerator {
|
||||||
} else {
|
} else {
|
||||||
self.write_arg(1);
|
self.write_arg(1);
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
if kind.is_method() {
|
||||||
|
self.write_instr(CALL_METHOD);
|
||||||
} else {
|
} else {
|
||||||
self.write_instr(CALL_FUNCTION);
|
self.write_instr(CALL_FUNCTION);
|
||||||
|
}
|
||||||
self.write_arg(argc as u8);
|
self.write_arg(argc as u8);
|
||||||
}
|
}
|
||||||
0
|
0
|
||||||
|
@ -1501,6 +1505,7 @@ impl CodeGenerator {
|
||||||
fn emit_init_method(&mut self, sig: &Signature, __new__: Type) {
|
fn emit_init_method(&mut self, sig: &Signature, __new__: Type) {
|
||||||
log!(info "entered {}", fn_name!());
|
log!(info "entered {}", fn_name!());
|
||||||
let line = sig.ln_begin().unwrap();
|
let line = sig.ln_begin().unwrap();
|
||||||
|
let class_name = sig.ident().inspect();
|
||||||
let ident = Identifier::public_with_line(Token::dummy(), Str::ever("__init__"), line);
|
let ident = Identifier::public_with_line(Token::dummy(), Str::ever("__init__"), line);
|
||||||
let param_name = fresh_varname();
|
let param_name = fresh_varname();
|
||||||
let param = VarName::from_str_and_line(Str::from(param_name.clone()), line);
|
let param = VarName::from_str_and_line(Str::from(param_name.clone()), line);
|
||||||
|
@ -1508,7 +1513,7 @@ impl CodeGenerator {
|
||||||
let self_param = VarName::from_str_and_line(Str::ever("self"), line);
|
let self_param = VarName::from_str_and_line(Str::ever("self"), line);
|
||||||
let self_param = ParamSignature::new(ParamPattern::VarName(self_param), None, None);
|
let self_param = ParamSignature::new(ParamPattern::VarName(self_param), None, None);
|
||||||
let params = Params::new(vec![self_param, param], None, vec![], None);
|
let params = Params::new(vec![self_param, param], None, vec![], None);
|
||||||
let sig = Signature::Subr(SubrSignature::new(ident, params.clone(), __new__.clone()));
|
let subr_sig = SubrSignature::new(ident, params.clone(), __new__.clone());
|
||||||
let mut attrs = vec![];
|
let mut attrs = vec![];
|
||||||
match __new__.non_default_params().unwrap()[0].typ() {
|
match __new__.non_default_params().unwrap()[0].typ() {
|
||||||
// {x = Int; y = Int}
|
// {x = Int; y = Int}
|
||||||
|
@ -1543,13 +1548,13 @@ impl CodeGenerator {
|
||||||
}
|
}
|
||||||
let block = Block::new(attrs);
|
let block = Block::new(attrs);
|
||||||
let body = DefBody::new(Token::dummy(), block, DefId(0));
|
let body = DefBody::new(Token::dummy(), block, DefId(0));
|
||||||
let init_def = Def::new(sig, body.clone());
|
self.emit_subr_def(Some(class_name), subr_sig, body);
|
||||||
self.codegen_expr(Expr::Def(init_def));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// ```python
|
/// ```python
|
||||||
/// class C:
|
/// class C:
|
||||||
/// def new(*x): return C.__call__(*x)
|
/// # __new__ => __call__
|
||||||
|
/// def new(x): return C.__call__(x)
|
||||||
/// ```
|
/// ```
|
||||||
fn emit_new_func(&mut self, sig: &Signature, __new__: Type) {
|
fn emit_new_func(&mut self, sig: &Signature, __new__: Type) {
|
||||||
log!(info "entered {}", fn_name!());
|
log!(info "entered {}", fn_name!());
|
||||||
|
@ -1561,10 +1566,10 @@ impl CodeGenerator {
|
||||||
let param = ParamSignature::new(ParamPattern::VarName(param), None, None);
|
let param = ParamSignature::new(ParamPattern::VarName(param), None, None);
|
||||||
let sig = SubrSignature::new(
|
let sig = SubrSignature::new(
|
||||||
ident,
|
ident,
|
||||||
Params::new(vec![], Some(param), vec![], None),
|
Params::new(vec![param], None, vec![], None),
|
||||||
__new__.clone(),
|
__new__.clone(),
|
||||||
);
|
);
|
||||||
let var_args = PosArg::new(Expr::Accessor(Accessor::local(
|
let arg = PosArg::new(Expr::Accessor(Accessor::local(
|
||||||
Token::symbol_with_line(¶m_name[..], line),
|
Token::symbol_with_line(¶m_name[..], line),
|
||||||
Type::Failure,
|
Type::Failure,
|
||||||
)));
|
)));
|
||||||
|
@ -1580,7 +1585,7 @@ impl CodeGenerator {
|
||||||
let call = Expr::Call(Call::new(
|
let call = Expr::Call(Call::new(
|
||||||
class_new,
|
class_new,
|
||||||
None,
|
None,
|
||||||
Args::new(vec![], Some(var_args), vec![], None),
|
Args::new(vec![arg], None, vec![], None),
|
||||||
Type::Failure,
|
Type::Failure,
|
||||||
));
|
));
|
||||||
let block = Block::new(vec![call]);
|
let block = Block::new(vec![call]);
|
||||||
|
|
|
@ -7,9 +7,12 @@ Point3D = Inherit Point2D, Additional := {z = Int}
|
||||||
Point3D.
|
Point3D.
|
||||||
# Overloading is prohibited by default. Remove this decorator and check for errors.
|
# Overloading is prohibited by default. Remove this decorator and check for errors.
|
||||||
@Override
|
@Override
|
||||||
new x, y, z = Point3D::__new__ {x; y; z}
|
new x, y, z =
|
||||||
|
Point3D::__new__ {x; y; z}
|
||||||
@Override
|
@Override
|
||||||
norm self = self::x**2 + self::y**2 + self::z**2
|
norm self = self::x**2 + self::y**2 + self::z**2
|
||||||
|
|
||||||
p = Point3D.new {x = 1; y = 2; z = 3}
|
p = Point2D.new {x = 1; y = 2}
|
||||||
print! p.norm()
|
print! p, p.norm()
|
||||||
|
q = Point3D.new 1, 2, 3
|
||||||
|
print! q, q.norm()
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue