mirror of
https://github.com/erg-lang/erg.git
synced 2025-09-29 12:24:45 +00:00
Add debugging displaying for codegen
This commit is contained in:
parent
5029d71cbe
commit
1d38b895e8
1 changed files with 30 additions and 1 deletions
|
@ -11,7 +11,8 @@ use erg_common::opcode::Opcode;
|
||||||
use erg_common::traits::{Locational, Stream};
|
use erg_common::traits::{Locational, Stream};
|
||||||
use erg_common::Str;
|
use erg_common::Str;
|
||||||
use erg_common::{
|
use erg_common::{
|
||||||
debug_power_assert, enum_unwrap, fn_name_full, impl_stream_for_wrapper, log, switch_unreachable,
|
debug_power_assert, enum_unwrap, fn_name, fn_name_full, impl_stream_for_wrapper, log,
|
||||||
|
switch_unreachable,
|
||||||
};
|
};
|
||||||
use erg_parser::ast::DefId;
|
use erg_parser::ast::DefId;
|
||||||
use erg_type::codeobj::{CodeObj, CodeObjFlags};
|
use erg_type::codeobj::{CodeObj, CodeObjFlags};
|
||||||
|
@ -551,6 +552,7 @@ impl CodeGenerator {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn emit_load_name_instr(&mut self, ident: Identifier) -> CompileResult<()> {
|
fn emit_load_name_instr(&mut self, ident: Identifier) -> CompileResult<()> {
|
||||||
|
log!(info "entered {}", fn_name!());
|
||||||
let name = self
|
let name = self
|
||||||
.local_search(ident.inspect(), Name)
|
.local_search(ident.inspect(), Name)
|
||||||
.unwrap_or_else(|| self.register_name(ident));
|
.unwrap_or_else(|| self.register_name(ident));
|
||||||
|
@ -567,6 +569,7 @@ impl CodeGenerator {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn emit_import_name_instr(&mut self, ident: Identifier) -> CompileResult<()> {
|
fn emit_import_name_instr(&mut self, ident: Identifier) -> CompileResult<()> {
|
||||||
|
log!(info "entered {}", fn_name!());
|
||||||
let name = self
|
let name = self
|
||||||
.local_search(ident.inspect(), Name)
|
.local_search(ident.inspect(), Name)
|
||||||
.unwrap_or_else(|| self.register_name(ident));
|
.unwrap_or_else(|| self.register_name(ident));
|
||||||
|
@ -577,6 +580,7 @@ impl CodeGenerator {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn emit_import_from_instr(&mut self, ident: Identifier) -> CompileResult<()> {
|
fn emit_import_from_instr(&mut self, ident: Identifier) -> CompileResult<()> {
|
||||||
|
log!(info "entered {}", fn_name!());
|
||||||
let name = self
|
let name = self
|
||||||
.local_search(ident.inspect(), Name)
|
.local_search(ident.inspect(), Name)
|
||||||
.unwrap_or_else(|| self.register_name(ident));
|
.unwrap_or_else(|| self.register_name(ident));
|
||||||
|
@ -592,6 +596,7 @@ impl CodeGenerator {
|
||||||
uniq_obj_name: Option<&str>,
|
uniq_obj_name: Option<&str>,
|
||||||
name: Str,
|
name: Str,
|
||||||
) -> CompileResult<()> {
|
) -> CompileResult<()> {
|
||||||
|
log!(info "entered {}", fn_name!());
|
||||||
let name = self
|
let name = self
|
||||||
.local_search(&name, Attr)
|
.local_search(&name, Attr)
|
||||||
.unwrap_or_else(|| self.register_attr(class, uniq_obj_name, name));
|
.unwrap_or_else(|| self.register_attr(class, uniq_obj_name, name));
|
||||||
|
@ -612,6 +617,7 @@ impl CodeGenerator {
|
||||||
uniq_obj_name: Option<&str>,
|
uniq_obj_name: Option<&str>,
|
||||||
name: Str,
|
name: Str,
|
||||||
) -> CompileResult<()> {
|
) -> CompileResult<()> {
|
||||||
|
log!(info "entered {}", fn_name!());
|
||||||
let name = self
|
let name = self
|
||||||
.local_search(&name, Method)
|
.local_search(&name, Method)
|
||||||
.unwrap_or_else(|| self.register_method(class, uniq_obj_name, name));
|
.unwrap_or_else(|| self.register_method(class, uniq_obj_name, name));
|
||||||
|
@ -627,6 +633,7 @@ impl CodeGenerator {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn emit_store_instr(&mut self, ident: Identifier, acc_kind: AccessKind) {
|
fn emit_store_instr(&mut self, ident: Identifier, acc_kind: AccessKind) {
|
||||||
|
log!(info "entered {}", fn_name!());
|
||||||
let name = self
|
let name = self
|
||||||
.local_search(ident.inspect(), acc_kind)
|
.local_search(ident.inspect(), acc_kind)
|
||||||
.unwrap_or_else(|| self.register_name(ident));
|
.unwrap_or_else(|| self.register_name(ident));
|
||||||
|
@ -650,6 +657,7 @@ impl CodeGenerator {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn store_acc(&mut self, acc: Accessor) {
|
fn store_acc(&mut self, acc: Accessor) {
|
||||||
|
log!(info "entered {}", fn_name!());
|
||||||
match acc {
|
match acc {
|
||||||
Accessor::Local(local) => {
|
Accessor::Local(local) => {
|
||||||
self.emit_store_instr(Identifier::new(None, VarName::new(local.name)), Name);
|
self.emit_store_instr(Identifier::new(None, VarName::new(local.name)), Name);
|
||||||
|
@ -711,6 +719,7 @@ impl CodeGenerator {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn emit_class_def(&mut self, class_def: ClassDef) {
|
fn emit_class_def(&mut self, class_def: ClassDef) {
|
||||||
|
log!(info "entered {}", fn_name!());
|
||||||
let ident = class_def.sig.ident().clone();
|
let ident = class_def.sig.ident().clone();
|
||||||
let kind = class_def.kind;
|
let kind = class_def.kind;
|
||||||
let require_or_sup = class_def.require_or_sup.clone();
|
let require_or_sup = class_def.require_or_sup.clone();
|
||||||
|
@ -735,6 +744,7 @@ impl CodeGenerator {
|
||||||
// fn emit_poly_type_def(&mut self, sig: SubrSignature, body: DefBody) {}
|
// fn emit_poly_type_def(&mut self, sig: SubrSignature, body: DefBody) {}
|
||||||
|
|
||||||
fn emit_require_type(&mut self, kind: TypeKind, require_or_sup: Expr) -> usize {
|
fn emit_require_type(&mut self, kind: TypeKind, require_or_sup: Expr) -> usize {
|
||||||
|
log!(info "entered {}", fn_name!());
|
||||||
match kind {
|
match kind {
|
||||||
TypeKind::Class => 0,
|
TypeKind::Class => 0,
|
||||||
TypeKind::Subclass => {
|
TypeKind::Subclass => {
|
||||||
|
@ -746,11 +756,13 @@ impl CodeGenerator {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn emit_attr_def(&mut self, attr_def: AttrDef) {
|
fn emit_attr_def(&mut self, attr_def: AttrDef) {
|
||||||
|
log!(info "entered {}", fn_name!());
|
||||||
self.codegen_frameless_block(attr_def.block, vec![]);
|
self.codegen_frameless_block(attr_def.block, vec![]);
|
||||||
self.store_acc(attr_def.attr);
|
self.store_acc(attr_def.attr);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn emit_var_def(&mut self, sig: VarSignature, mut body: DefBody) {
|
fn emit_var_def(&mut self, sig: VarSignature, mut body: DefBody) {
|
||||||
|
log!(info "entered {}", fn_name!());
|
||||||
if body.block.len() == 1 {
|
if body.block.len() == 1 {
|
||||||
self.codegen_expr(body.block.remove(0));
|
self.codegen_expr(body.block.remove(0));
|
||||||
} else {
|
} else {
|
||||||
|
@ -760,6 +772,7 @@ impl CodeGenerator {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn emit_subr_def(&mut self, sig: SubrSignature, body: DefBody) {
|
fn emit_subr_def(&mut self, sig: SubrSignature, body: DefBody) {
|
||||||
|
log!(info "entered {}", fn_name!());
|
||||||
let name = sig.ident.inspect().clone();
|
let name = sig.ident.inspect().clone();
|
||||||
let mut opcode_flag = 0u8;
|
let mut opcode_flag = 0u8;
|
||||||
let params = self.gen_param_names(&sig.params);
|
let params = self.gen_param_names(&sig.params);
|
||||||
|
@ -784,6 +797,7 @@ impl CodeGenerator {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn emit_discard_instr(&mut self, mut args: Args) -> CompileResult<()> {
|
fn emit_discard_instr(&mut self, mut args: Args) -> CompileResult<()> {
|
||||||
|
log!(info "entered {}", fn_name!());
|
||||||
while let Some(arg) = args.try_remove(0) {
|
while let Some(arg) = args.try_remove(0) {
|
||||||
self.codegen_expr(arg);
|
self.codegen_expr(arg);
|
||||||
self.emit_pop_top();
|
self.emit_pop_top();
|
||||||
|
@ -792,6 +806,7 @@ impl CodeGenerator {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn emit_if_instr(&mut self, mut args: Args) -> CompileResult<()> {
|
fn emit_if_instr(&mut self, mut args: Args) -> CompileResult<()> {
|
||||||
|
log!(info "entered {}", fn_name!());
|
||||||
let cond = args.remove(0);
|
let cond = args.remove(0);
|
||||||
self.codegen_expr(cond);
|
self.codegen_expr(cond);
|
||||||
let idx_pop_jump_if_false = self.cur_block().lasti;
|
let idx_pop_jump_if_false = self.cur_block().lasti;
|
||||||
|
@ -840,6 +855,7 @@ impl CodeGenerator {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn emit_for_instr(&mut self, mut args: Args) -> CompileResult<()> {
|
fn emit_for_instr(&mut self, mut args: Args) -> CompileResult<()> {
|
||||||
|
log!(info "entered {}", fn_name!());
|
||||||
let iterable = args.remove(0);
|
let iterable = args.remove(0);
|
||||||
self.codegen_expr(iterable);
|
self.codegen_expr(iterable);
|
||||||
self.write_instr(GET_ITER);
|
self.write_instr(GET_ITER);
|
||||||
|
@ -862,6 +878,7 @@ impl CodeGenerator {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn emit_match_instr(&mut self, mut args: Args, _use_erg_specific: bool) -> CompileResult<()> {
|
fn emit_match_instr(&mut self, mut args: Args, _use_erg_specific: bool) -> CompileResult<()> {
|
||||||
|
log!(info "entered {}", fn_name!());
|
||||||
let expr = args.remove(0);
|
let expr = args.remove(0);
|
||||||
self.codegen_expr(expr);
|
self.codegen_expr(expr);
|
||||||
let len = args.len();
|
let len = args.len();
|
||||||
|
@ -898,6 +915,7 @@ impl CodeGenerator {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn emit_match_pattern(&mut self, pat: ParamPattern) -> CompileResult<Vec<usize>> {
|
fn emit_match_pattern(&mut self, pat: ParamPattern) -> CompileResult<Vec<usize>> {
|
||||||
|
log!(info "entered {}", fn_name!());
|
||||||
let mut pop_jump_points = vec![];
|
let mut pop_jump_points = vec![];
|
||||||
match pat {
|
match pat {
|
||||||
ParamPattern::VarName(name) => {
|
ParamPattern::VarName(name) => {
|
||||||
|
@ -951,6 +969,7 @@ impl CodeGenerator {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn emit_call(&mut self, call: Call) {
|
fn emit_call(&mut self, call: Call) {
|
||||||
|
log!(info "entered {}", fn_name!());
|
||||||
if let Some(method_name) = call.method_name {
|
if let Some(method_name) = call.method_name {
|
||||||
self.emit_call_method(*call.obj, method_name, call.args);
|
self.emit_call_method(*call.obj, method_name, call.args);
|
||||||
} else {
|
} else {
|
||||||
|
@ -964,6 +983,7 @@ impl CodeGenerator {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn emit_call_local(&mut self, local: Local, mut args: Args) -> CompileResult<()> {
|
fn emit_call_local(&mut self, local: Local, mut args: Args) -> CompileResult<()> {
|
||||||
|
log!(info "entered {}", fn_name!());
|
||||||
match &local.inspect()[..] {
|
match &local.inspect()[..] {
|
||||||
"assert" => self.emit_assert_instr(args),
|
"assert" => self.emit_assert_instr(args),
|
||||||
"discard" => self.emit_discard_instr(args),
|
"discard" => self.emit_discard_instr(args),
|
||||||
|
@ -1003,6 +1023,7 @@ impl CodeGenerator {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn emit_call_method(&mut self, obj: Expr, method_name: Token, mut args: Args) {
|
fn emit_call_method(&mut self, obj: Expr, method_name: Token, mut args: Args) {
|
||||||
|
log!(info "entered {}", fn_name!());
|
||||||
if &method_name.inspect()[..] == "update!" {
|
if &method_name.inspect()[..] == "update!" {
|
||||||
return self.emit_call_update(obj, args);
|
return self.emit_call_update(obj, args);
|
||||||
}
|
}
|
||||||
|
@ -1044,6 +1065,7 @@ impl CodeGenerator {
|
||||||
/// X = (x -> x + 1)(X)
|
/// X = (x -> x + 1)(X)
|
||||||
/// X = X + 1
|
/// X = X + 1
|
||||||
fn emit_call_update(&mut self, obj: Expr, mut args: Args) {
|
fn emit_call_update(&mut self, obj: Expr, mut args: Args) {
|
||||||
|
log!(info "entered {}", fn_name!());
|
||||||
let acc = enum_unwrap!(obj, Expr::Accessor);
|
let acc = enum_unwrap!(obj, Expr::Accessor);
|
||||||
let func = args.remove_left_or_key("f").unwrap();
|
let func = args.remove_left_or_key("f").unwrap();
|
||||||
self.codegen_expr(func);
|
self.codegen_expr(func);
|
||||||
|
@ -1057,6 +1079,7 @@ impl CodeGenerator {
|
||||||
|
|
||||||
// assert takes 1 or 2 arguments (0: cond, 1: message)
|
// assert takes 1 or 2 arguments (0: cond, 1: message)
|
||||||
fn emit_assert_instr(&mut self, mut args: Args) -> CompileResult<()> {
|
fn emit_assert_instr(&mut self, mut args: Args) -> CompileResult<()> {
|
||||||
|
log!(info "entered {}", fn_name!());
|
||||||
self.codegen_expr(args.remove(0));
|
self.codegen_expr(args.remove(0));
|
||||||
let pop_jump_point = self.cur_block().lasti;
|
let pop_jump_point = self.cur_block().lasti;
|
||||||
self.write_instr(Opcode::POP_JUMP_IF_TRUE);
|
self.write_instr(Opcode::POP_JUMP_IF_TRUE);
|
||||||
|
@ -1077,6 +1100,7 @@ impl CodeGenerator {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn codegen_expr(&mut self, expr: Expr) {
|
fn codegen_expr(&mut self, expr: Expr) {
|
||||||
|
log!(info "entered {}", fn_name!());
|
||||||
if expr.ln_begin().unwrap_or_else(|| panic!("{expr}")) > self.cur_block().prev_lineno {
|
if expr.ln_begin().unwrap_or_else(|| panic!("{expr}")) > self.cur_block().prev_lineno {
|
||||||
let sd = self.cur_block().lasti - self.cur_block().prev_lasti;
|
let sd = self.cur_block().lasti - self.cur_block().prev_lasti;
|
||||||
let ld = expr.ln_begin().unwrap() - self.cur_block().prev_lineno;
|
let ld = expr.ln_begin().unwrap() - self.cur_block().prev_lineno;
|
||||||
|
@ -1315,6 +1339,7 @@ impl CodeGenerator {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn codegen_acc(&mut self, acc: Accessor) {
|
fn codegen_acc(&mut self, acc: Accessor) {
|
||||||
|
log!(info "entered {}", fn_name!());
|
||||||
match acc {
|
match acc {
|
||||||
Accessor::Local(local) => {
|
Accessor::Local(local) => {
|
||||||
self.emit_load_name_instr(Identifier::new(None, VarName::new(local.name)))
|
self.emit_load_name_instr(Identifier::new(None, VarName::new(local.name)))
|
||||||
|
@ -1360,6 +1385,7 @@ impl CodeGenerator {
|
||||||
|
|
||||||
/// forブロックなどで使う
|
/// forブロックなどで使う
|
||||||
fn codegen_frameless_block(&mut self, block: Block, params: Vec<Str>) {
|
fn codegen_frameless_block(&mut self, block: Block, params: Vec<Str>) {
|
||||||
|
log!(info "entered {}", fn_name!());
|
||||||
for param in params {
|
for param in params {
|
||||||
self.emit_store_instr(Identifier::private(param), Name);
|
self.emit_store_instr(Identifier::private(param), Name);
|
||||||
}
|
}
|
||||||
|
@ -1375,6 +1401,7 @@ impl CodeGenerator {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn codegen_typedef_block(&mut self, class: ClassDef) -> CodeObj {
|
fn codegen_typedef_block(&mut self, class: ClassDef) -> CodeObj {
|
||||||
|
log!(info "entered {}", fn_name!());
|
||||||
let name = class.sig.ident().inspect().clone();
|
let name = class.sig.ident().inspect().clone();
|
||||||
self.unit_size += 1;
|
self.unit_size += 1;
|
||||||
let firstlineno = match (
|
let firstlineno = match (
|
||||||
|
@ -1450,6 +1477,7 @@ impl CodeGenerator {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn emit_auto_new(&mut self, sig: &Signature, __new__: Type) {
|
fn emit_auto_new(&mut self, sig: &Signature, __new__: Type) {
|
||||||
|
log!(info "entered {}", fn_name!());
|
||||||
let line = sig.ln_begin().unwrap();
|
let line = sig.ln_begin().unwrap();
|
||||||
let ident = Identifier::private_with_line(Str::ever("__new__"), line);
|
let ident = Identifier::private_with_line(Str::ever("__new__"), line);
|
||||||
let param_name = fresh_varname();
|
let param_name = fresh_varname();
|
||||||
|
@ -1506,6 +1534,7 @@ impl CodeGenerator {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn codegen_block(&mut self, block: Block, opt_name: Option<Str>, params: Vec<Str>) -> CodeObj {
|
fn codegen_block(&mut self, block: Block, opt_name: Option<Str>, params: Vec<Str>) -> CodeObj {
|
||||||
|
log!(info "entered {}", fn_name!());
|
||||||
self.unit_size += 1;
|
self.unit_size += 1;
|
||||||
let name = if let Some(name) = opt_name {
|
let name = if let Some(name) = opt_name {
|
||||||
name
|
name
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue