Move load_symbol to scope

This commit is contained in:
Ayaz Hafiz 2023-06-09 15:38:38 -05:00
parent 8d3d4ed9d8
commit 6e23365551
No known key found for this signature in database
GPG key ID: 0E2A37416A25EF58
4 changed files with 31 additions and 33 deletions

View file

@ -913,7 +913,7 @@ pub(crate) fn build_exp_call<'a, 'ctx>(
Vec::with_capacity_in(arguments.len(), env.arena);
for symbol in arguments.iter() {
arg_tuples.push(load_symbol(scope, symbol));
arg_tuples.push(scope.load_symbol(symbol));
}
let bytes = specialization_id.to_bytes();
@ -1053,7 +1053,7 @@ pub(crate) fn build_exp_expr<'a, 'ctx>(
symbol,
..
} => {
let reset = load_symbol(scope, symbol).into_pointer_value();
let reset = scope.load_symbol(symbol).into_pointer_value();
build_tag(
env,
layout_interner,
@ -1098,7 +1098,7 @@ pub(crate) fn build_exp_expr<'a, 'ctx>(
}
ExprUnbox { symbol } => {
let value = load_symbol(scope, symbol);
let value = scope.load_symbol(symbol);
debug_assert!(value.is_pointer_value());
@ -1579,7 +1579,7 @@ fn build_tag_fields<'a, 'r, 'ctx, 'env>(
let field_type = basic_type_from_layout(env, layout_interner, *tag_field_layout);
field_types.push(field_type);
let raw_value: BasicValueEnum<'ctx> = load_symbol(scope, field_symbol);
let raw_value: BasicValueEnum<'ctx> = scope.load_symbol(field_symbol);
let field_value = build_tag_field_value(env, layout_interner, raw_value, *tag_field_layout);
field_values.push((*tag_field_layout, field_value));
@ -2184,7 +2184,7 @@ fn list_literal<'a, 'ctx>(
global_elements.push(val.into_int_value());
}
ListLiteralElement::Symbol(symbol) => {
let val = load_symbol(scope, symbol);
let val = scope.load_symbol(symbol);
// here we'd like to furthermore check for intval.is_const().
// if all elements are const for LLVM, we could make the array a constant.
@ -2273,7 +2273,7 @@ fn list_literal<'a, 'ctx>(
ListLiteralElement::Literal(literal) => {
build_exp_literal(env, layout_interner, parent, element_layout, literal)
}
ListLiteralElement::Symbol(symbol) => load_symbol(scope, symbol),
ListLiteralElement::Symbol(symbol) => scope.load_symbol(symbol),
};
let index_val = ctx.i64_type().const_int(index as u64, false);
let elem_ptr = unsafe {
@ -2960,17 +2960,6 @@ pub(crate) fn build_exp_stmt<'a, 'ctx>(
}
}
pub(crate) fn load_symbol<'ctx>(scope: &Scope<'_, 'ctx>, symbol: &Symbol) -> BasicValueEnum<'ctx> {
match scope.get(symbol) {
Some((_, ptr)) => *ptr,
None => panic!(
"There was no entry for {:?} {} in scope {:?}",
symbol, symbol, scope
),
}
}
pub(crate) fn load_symbol_and_layout<'a, 'ctx>(
scope: &Scope<'a, 'ctx>,
symbol: &Symbol,
@ -6063,7 +6052,7 @@ pub(crate) fn throw_exception<'a, 'ctx>(
message: &Symbol,
tag: CrashTag,
) {
let msg_val = load_symbol(scope, message);
let msg_val = scope.load_symbol(message);
env.call_panic(env, msg_val, tag);

View file

@ -11,9 +11,7 @@ use roc_module::symbol::Symbol;
use roc_mono::layout::{Builtin, InLayout, LayoutIds, LayoutInterner, STLayoutInterner};
use super::bitcode::{call_list_bitcode_fn, BitcodeReturns};
use super::build::{
create_entry_block_alloca, load_roc_value, load_symbol, store_roc_value, BuilderExt,
};
use super::build::{create_entry_block_alloca, load_roc_value, store_roc_value, BuilderExt};
use super::convert::zig_list_type;
use super::scope::Scope;
use super::struct_::struct_from_fields;
@ -41,7 +39,7 @@ pub(crate) fn list_symbol_to_c_abi<'a, 'ctx>(
let list_type = zig_list_type(env);
let list_alloca = create_entry_block_alloca(env, parent, list_type.into(), "list_alloca");
let list = load_symbol(scope, &symbol);
let list = scope.load_symbol(&symbol);
env.builder.build_store(list_alloca, list);
list_alloca

View file

@ -55,7 +55,7 @@ use crate::llvm::{
use super::{build::throw_internal_exception, convert::zig_with_overflow_roc_dec, scope::Scope};
use super::{
build::{load_symbol, load_symbol_and_layout, Env},
build::{load_symbol_and_layout, Env},
convert::zig_dec_type,
};
@ -80,7 +80,7 @@ pub(crate) fn run_low_level<'a, 'ctx>(
// look at that, a usage for if let ... else
let [$($x),+] = match &args {
[$($x),+] => {
[ $(load_symbol(scope, $x)),+ ]
[ $(scope.load_symbol($x)),+ ]
}
_ => {
// we could get fancier with reporting here, but this macro is used a bunch
@ -685,7 +685,7 @@ pub(crate) fn run_low_level<'a, 'ctx>(
let (first_list, list_layout) = load_symbol_and_layout(scope, &args[0]);
let second_list = load_symbol(scope, &args[1]);
let second_list = scope.load_symbol(&args[1]);
let element_layout = list_element_layout!(layout_interner, list_layout);
@ -701,7 +701,7 @@ pub(crate) fn run_low_level<'a, 'ctx>(
// List.appendUnsafe : List elem, elem -> List elem
debug_assert_eq!(args.len(), 2);
let original_wrapper = load_symbol(scope, &args[0]).into_struct_value();
let original_wrapper = scope.load_symbol(&args[0]).into_struct_value();
let (elem, elem_layout) = load_symbol_and_layout(scope, &args[1]);
list_append_unsafe(env, layout_interner, original_wrapper, elem, elem_layout)
@ -710,7 +710,7 @@ pub(crate) fn run_low_level<'a, 'ctx>(
// List.prepend : List elem, elem -> List elem
debug_assert_eq!(args.len(), 2);
let original_wrapper = load_symbol(scope, &args[0]).into_struct_value();
let original_wrapper = scope.load_symbol(&args[0]).into_struct_value();
let (elem, elem_layout) = load_symbol_and_layout(scope, &args[1]);
list_prepend(env, layout_interner, original_wrapper, elem, elem_layout)
@ -721,7 +721,7 @@ pub(crate) fn run_low_level<'a, 'ctx>(
let (list, list_layout) = load_symbol_and_layout(scope, &args[0]);
let element_layout = list_element_layout!(layout_interner, list_layout);
let spare = load_symbol(scope, &args[1]);
let spare = scope.load_symbol(&args[1]);
list_reserve(
env,
@ -748,8 +748,8 @@ pub(crate) fn run_low_level<'a, 'ctx>(
let (list, list_layout) = load_symbol_and_layout(scope, &args[0]);
let original_wrapper = list.into_struct_value();
let index_1 = load_symbol(scope, &args[1]);
let index_2 = load_symbol(scope, &args[2]);
let index_1 = scope.load_symbol(&args[1]);
let index_2 = scope.load_symbol(&args[2]);
let element_layout = list_element_layout!(layout_interner, list_layout);
list_swap(
@ -768,8 +768,8 @@ pub(crate) fn run_low_level<'a, 'ctx>(
let (list, list_layout) = load_symbol_and_layout(scope, &args[0]);
let original_wrapper = list.into_struct_value();
let start = load_symbol(scope, &args[1]);
let len = load_symbol(scope, &args[2]);
let start = scope.load_symbol(&args[1]);
let len = scope.load_symbol(&args[2]);
let element_layout = list_element_layout!(layout_interner, list_layout);
list_sublist(
@ -789,7 +789,7 @@ pub(crate) fn run_low_level<'a, 'ctx>(
let (list, list_layout) = load_symbol_and_layout(scope, &args[0]);
let original_wrapper = list.into_struct_value();
let count = load_symbol(scope, &args[1]);
let count = scope.load_symbol(&args[1]);
let element_layout = list_element_layout!(layout_interner, list_layout);
list_drop_at(

View file

@ -24,6 +24,17 @@ impl<'a, 'ctx> Scope<'a, 'ctx> {
self.symbols.get(symbol)
}
pub fn load_symbol(&self, symbol: &Symbol) -> BasicValueEnum<'ctx> {
match self.get(symbol) {
Some((_, ptr)) => *ptr,
None => panic!(
"There was no entry for {:?} {} in scope {:?}",
symbol, symbol, self
),
}
}
pub fn insert(&mut self, symbol: Symbol, value: (InLayout<'a>, BasicValueEnum<'ctx>)) {
self.symbols.insert(symbol, value);
}