Fix subtle call issue

This commit is contained in:
Ahmad Sattar 2023-02-04 00:56:45 +01:00
parent a863c83824
commit 6a92aed8a2
No known key found for this signature in database
GPG key ID: 457C18819D9C9570

View file

@ -284,28 +284,31 @@ trait Backend<'a> {
if let LowLevelWrapperType::CanBeReplacedBy(lowlevel) = if let LowLevelWrapperType::CanBeReplacedBy(lowlevel) =
LowLevelWrapperType::from_symbol(func_sym.name()) LowLevelWrapperType::from_symbol(func_sym.name())
{ {
self.build_run_low_level( return self.build_run_low_level(
sym, sym,
&lowlevel, &lowlevel,
arguments, arguments,
arg_layouts, arg_layouts,
ret_layout, ret_layout,
) );
} else if self.defined_in_app_module(func_sym.name()) { } else if sym.is_builtin() {
let layout_id = LayoutIds::default().get(func_sym.name(), layout); // These builtins can be built through `build_fn_call` as well, but the
let fn_name = self.symbol_to_string(func_sym.name(), layout_id); // implementation in `build_builtin` inlines some of the symbols.
// Now that the arguments are needed, load them if they are literals. return self.build_builtin(
self.load_literal_symbols(arguments);
self.build_fn_call(sym, fn_name, arguments, arg_layouts, ret_layout)
} else {
self.build_builtin(
sym, sym,
func_sym.name(), func_sym.name(),
arguments, arguments,
arg_layouts, arg_layouts,
ret_layout, ret_layout,
) );
} }
let layout_id = LayoutIds::default().get(func_sym.name(), layout);
let fn_name = self.symbol_to_string(func_sym.name(), layout_id);
// Now that the arguments are needed, load them if they are literals.
self.load_literal_symbols(arguments);
self.build_fn_call(sym, fn_name, arguments, arg_layouts, ret_layout)
} }
CallType::LowLevel { op: lowlevel, .. } => { CallType::LowLevel { op: lowlevel, .. } => {
@ -802,7 +805,6 @@ trait Backend<'a> {
arg_layouts: &[InLayout<'a>], arg_layouts: &[InLayout<'a>],
ret_layout: &InLayout<'a>, ret_layout: &InLayout<'a>,
) { ) {
self.load_literal_symbols(args);
match func_sym { match func_sym {
Symbol::NUM_IS_ZERO => { Symbol::NUM_IS_ZERO => {
debug_assert_eq!( debug_assert_eq!(
@ -816,6 +818,7 @@ trait Backend<'a> {
"NumIsZero: expected to have return layout of type Bool" "NumIsZero: expected to have return layout of type Bool"
); );
self.load_literal_symbols(args);
self.load_literal( self.load_literal(
&Symbol::DEV_TMP, &Symbol::DEV_TMP,
&arg_layouts[0], &arg_layouts[0],
@ -843,11 +846,13 @@ trait Backend<'a> {
let bool_layout = Layout::BOOL; let bool_layout = Layout::BOOL;
self.load_literal(&Symbol::DEV_TMP, &bool_layout, &Literal::Bool(true)); self.load_literal(&Symbol::DEV_TMP, &bool_layout, &Literal::Bool(true));
self.return_symbol(&Symbol::DEV_TMP, &bool_layout); self.return_symbol(&Symbol::DEV_TMP, &bool_layout);
self.free_symbol(&Symbol::DEV_TMP)
} }
Symbol::BOOL_FALSE => { Symbol::BOOL_FALSE => {
let bool_layout = Layout::BOOL; let bool_layout = Layout::BOOL;
self.load_literal(&Symbol::DEV_TMP, &bool_layout, &Literal::Bool(false)); self.load_literal(&Symbol::DEV_TMP, &bool_layout, &Literal::Bool(false));
self.return_symbol(&Symbol::DEV_TMP, &bool_layout); self.return_symbol(&Symbol::DEV_TMP, &bool_layout);
self.free_symbol(&Symbol::DEV_TMP)
} }
_ => todo!("the function, {:?}", func_sym), _ => todo!("the function, {:?}", func_sym),
} }