distinguish root block from non-root blocks; in root case, we do not want to do a lookup-range to generate the block's expression (but in all other cases we do)

This commit is contained in:
Ryan Fleury
2025-02-03 10:07:20 -08:00
parent 6f4533d8f5
commit 59fe6c79cb
4 changed files with 22 additions and 5 deletions
+1 -1
View File
@@ -101,7 +101,7 @@ e_lookup_rule_map_insert(Arena *arena, E_LookupRuleMap *map, E_LookupRule *rule)
internal E_LookupRule * internal E_LookupRule *
e_lookup_rule_from_string(String8 string) e_lookup_rule_from_string(String8 string)
{ {
E_LookupRule *result = &e_lookup_rule__default; E_LookupRule *result = &e_lookup_rule__nil;
if(e_ir_ctx->lookup_rule_map != 0 && e_ir_ctx->lookup_rule_map->slots_count != 0) if(e_ir_ctx->lookup_rule_map != 0 && e_ir_ctx->lookup_rule_map->slots_count != 0)
{ {
U64 hash = e_hash_from_string(5381, string); U64 hash = e_hash_from_string(5381, string);
+9
View File
@@ -242,6 +242,15 @@ struct E_IRCtx
//////////////////////////////// ////////////////////////////////
//~ rjf: Globals //~ rjf: Globals
local_persist read_only E_LookupRule e_lookup_rule__nil =
{
str8_lit_comp("nil"),
E_LOOKUP_INFO_FUNCTION_NAME(default),
E_LOOKUP_ACCESS_FUNCTION_NAME(default),
E_LOOKUP_RANGE_FUNCTION_NAME(default),
E_LOOKUP_ID_FROM_NUM_FUNCTION_NAME(default),
E_LOOKUP_NUM_FROM_ID_FUNCTION_NAME(default),
};
local_persist read_only E_LookupRule e_lookup_rule__default = local_persist read_only E_LookupRule e_lookup_rule__default =
{ {
str8_lit_comp("default"), str8_lit_comp("default"),
@@ -508,7 +508,7 @@ ev_block_tree_from_expr(Arena *arena, EV_View *view, String8 filter, String8 str
{ {
E_LookupRule *lookup_rule_candidate = e_lookup_rule_from_string(tag->first->string); E_LookupRule *lookup_rule_candidate = e_lookup_rule_from_string(tag->first->string);
EV_ViewRuleInfo *expand_rule_candidate = ev_view_rule_info_from_string(tag->first->string); EV_ViewRuleInfo *expand_rule_candidate = ev_view_rule_info_from_string(tag->first->string);
if(lookup_rule_candidate != &e_lookup_rule__default) if(lookup_rule_candidate != &e_lookup_rule__nil)
{ {
lookup_rule = lookup_rule_candidate; lookup_rule = lookup_rule_candidate;
lookup_rule_tag = tag; lookup_rule_tag = tag;
@@ -946,6 +946,7 @@ ev_windowed_row_list_from_block_range_list(Arena *arena, EV_View *view, String8
if(block_relative_range__windowed.max > block_relative_range__windowed.min) if(block_relative_range__windowed.max > block_relative_range__windowed.min)
{ {
// rjf: get info about expansion range // rjf: get info about expansion range
B32 is_root = 0;
U64 range_exprs_count = dim_1u64(block_relative_range__windowed); U64 range_exprs_count = dim_1u64(block_relative_range__windowed);
E_Expr **range_exprs = push_array(arena, E_Expr *, range_exprs_count); E_Expr **range_exprs = push_array(arena, E_Expr *, range_exprs_count);
String8 *range_exprs_strings = push_array(arena, String8 ,range_exprs_count); String8 *range_exprs_strings = push_array(arena, String8 ,range_exprs_count);
@@ -953,10 +954,17 @@ ev_windowed_row_list_from_block_range_list(Arena *arena, EV_View *view, String8
{ {
range_exprs[idx] = &e_expr_nil; range_exprs[idx] = &e_expr_nil;
} }
n->v.block->lookup_rule->range(arena, n->v.block->expr, block_relative_range__windowed, range_exprs, range_exprs_strings, n->v.block->lookup_rule_user_data); if(n->v.block->lookup_rule == &e_lookup_rule__nil)
{
is_root = 1;
}
else
{
n->v.block->lookup_rule->range(arena, n->v.block->expr, block_relative_range__windowed, range_exprs, range_exprs_strings, n->v.block->lookup_rule_user_data);
}
// rjf: no expansion operator applied -> push row for block expression; pass through block info // rjf: no expansion operator applied -> push row for block expression; pass through block info
if(range_exprs_count == 0) if(is_root)
{ {
EV_WindowedRowNode *row_node = push_array(arena, EV_WindowedRowNode, 1); EV_WindowedRowNode *row_node = push_array(arena, EV_WindowedRowNode, 1);
SLLQueuePush(rows.first, rows.last, row_node); SLLQueuePush(rows.first, rows.last, row_node);
@@ -283,7 +283,7 @@ global read_only EV_ViewRuleInfo ev_nil_view_rule_info =
}; };
thread_static EV_ViewRuleInfoTable *ev_view_rule_info_table = 0; thread_static EV_ViewRuleInfoTable *ev_view_rule_info_table = 0;
thread_static EV_AutoViewRuleTable *ev_auto_view_rule_table = 0; thread_static EV_AutoViewRuleTable *ev_auto_view_rule_table = 0;
global read_only EV_Block ev_nil_block = {&ev_nil_block, &ev_nil_block, &ev_nil_block, &ev_nil_block, &ev_nil_block, {0}, 0, {0}, &e_expr_nil, &e_expr_nil, &e_expr_nil, &e_lookup_rule__default, &ev_nil_view_rule_info}; global read_only EV_Block ev_nil_block = {&ev_nil_block, &ev_nil_block, &ev_nil_block, &ev_nil_block, &ev_nil_block, {0}, 0, {0}, &e_expr_nil, &e_expr_nil, &e_expr_nil, &e_lookup_rule__nil, &ev_nil_view_rule_info};
//////////////////////////////// ////////////////////////////////
//~ rjf: Key Functions //~ rjf: Key Functions