Add debugging displaying for codegen

This commit is contained in:
Shunsuke Shibayama 2022-09-07 14:53:04 +09:00
parent 5029d71cbe
commit 1d38b895e8

View file

@ -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