eval/eval-viz: pull out rules for mapping exprs/irtrees -> lookup/expansion rules; use this path in the single-line value string generator; eliminate old non-view-rulified string generation paths

This commit is contained in:
Ryan Fleury
2025-02-04 13:20:25 -08:00
parent afd113adcc
commit 90c86dc812
7 changed files with 455 additions and 348 deletions
+70 -8
View File
@@ -710,22 +710,26 @@ e_auto_hook_map_make(Arena *arena, U64 slots_count)
}
internal void
e_auto_hook_map_insert_new(Arena *arena, E_AutoHookMap *map, String8 pattern, String8 tag_expr_string)
e_auto_hook_map_insert_new_(Arena *arena, E_AutoHookMap *map, E_AutoHookParams *params)
{
Temp scratch = scratch_begin(&arena, 1);
E_TokenArray tokens = e_token_array_from_text(scratch.arena, pattern);
E_Parse parse = e_parse_type_from_text_tokens(scratch.arena, pattern, &tokens);
E_IRTreeAndType irtree = e_irtree_and_type_from_expr(scratch.arena, parse.expr);
E_TypeKey type_key = irtree.type_key;
E_TypeKey type_key = params->type_key;
if(params->type_pattern.size != 0)
{
E_TokenArray tokens = e_token_array_from_text(scratch.arena, params->type_pattern);
E_Parse parse = e_parse_type_from_text_tokens(scratch.arena, params->type_pattern, &tokens);
E_IRTreeAndType irtree = e_irtree_and_type_from_expr(scratch.arena, parse.expr);
type_key = irtree.type_key;
}
E_AutoHookNode *node = push_array(arena, E_AutoHookNode, 1);
node->type_key = type_key;
U8 pattern_split = '?';
node->type_pattern_parts = str8_split(arena, pattern, &pattern_split, 1, 0);
node->tag_expr = e_parse_expr_from_text(arena, push_str8_copy(arena, tag_expr_string));
node->type_pattern_parts = str8_split(arena, params->type_pattern, &pattern_split, 1, 0);
node->tag_expr = e_parse_expr_from_text(arena, push_str8_copy(arena, params->tag_expr_string));
if(!e_type_key_match(e_type_key_zero(), type_key))
{
U64 hash = e_hash_from_string(5381, str8_struct(&type_key));
U64 slot_idx = map->slots_count;
U64 slot_idx = hash%map->slots_count;
SLLQueuePush_N(map->slots[slot_idx].first, map->slots[slot_idx].last, node, hash_next);
}
else
@@ -2291,3 +2295,61 @@ e_irtree_and_type_from_expr__cached(E_Expr *expr)
}
return result;
}
////////////////////////////////
//~ rjf: Expression & IR-Tree => Lookup Rule
internal E_LookupRuleTagPair
e_lookup_rule_tag_pair_from_expr_irtree(E_Expr *expr, E_IRTreeAndType *irtree)
{
E_LookupRuleTagPair result = {&e_lookup_rule__default, &e_expr_nil};
{
// rjf: first try explicitly-stored tags
if(result.rule == &e_lookup_rule__default)
{
for(E_Expr *tag = expr->first_tag; tag != &e_expr_nil; tag = tag->next)
{
E_LookupRule *candidate = e_lookup_rule_from_string(tag->string);
if(candidate != &e_lookup_rule__nil)
{
result.rule = candidate;
result.tag = tag;
break;
}
}
}
// rjf: next try implicit set name -> rule mapping
if(result.rule == &e_lookup_rule__default)
{
E_TypeKind type_kind = e_type_kind_from_key(irtree->type_key);
if(type_kind == E_TypeKind_Set)
{
E_Type *type = e_type_from_key__cached(irtree->type_key);
String8 name = type->name;
E_LookupRule *candidate = e_lookup_rule_from_string(name);
if(candidate != &e_lookup_rule__nil)
{
result.rule = candidate;
}
}
}
// rjf: next try auto hook map
if(result.rule == &e_lookup_rule__default)
{
E_ExprList tags = e_auto_hook_tag_exprs_from_type_key__cached(irtree->type_key);
for(E_ExprNode *n = tags.first; n != 0; n = n->next)
{
E_LookupRule *candidate = e_lookup_rule_from_string(n->v->string);
if(candidate != &e_lookup_rule__nil)
{
result.rule = candidate;
result.tag = n->v;
break;
}
}
}
}
return result;
}
+22 -1
View File
@@ -135,6 +135,13 @@ struct E_LookupRuleMap
U64 slots_count;
};
typedef struct E_LookupRuleTagPair E_LookupRuleTagPair;
struct E_LookupRuleTagPair
{
E_LookupRule *rule;
E_Expr *tag;
};
////////////////////////////////
//~ rjf: IR Generation Hooks
@@ -201,6 +208,14 @@ struct E_AutoHookMap
E_AutoHookNode *last_pattern;
};
typedef struct E_AutoHookParams E_AutoHookParams;
struct E_AutoHookParams
{
E_TypeKey type_key;
String8 type_pattern;
String8 tag_expr_string;
};
////////////////////////////////
//~ rjf: Used Tag Map Data Structure
@@ -360,7 +375,8 @@ internal E_IRGenRule *e_irgen_rule_from_string(String8 string);
//~ rjf: Auto Hooks
internal E_AutoHookMap e_auto_hook_map_make(Arena *arena, U64 slots_count);
internal void e_auto_hook_map_insert_new(Arena *arena, E_AutoHookMap *map, String8 pattern, String8 tag_expr_string);
internal void e_auto_hook_map_insert_new_(Arena *arena, E_AutoHookMap *map, E_AutoHookParams *params);
#define e_auto_hook_map_insert_new(arena, map, ...) e_auto_hook_map_insert_new_((arena), (map), &(E_AutoHookParams){.type_key = zero_struct, __VA_ARGS__})
internal E_ExprList e_auto_hook_tag_exprs_from_type_key(Arena *arena, E_TypeKey type_key);
internal E_ExprList e_auto_hook_tag_exprs_from_type_key__cached(E_TypeKey type_key);
@@ -408,4 +424,9 @@ internal String8 e_bytecode_from_oplist(Arena *arena, E_OpList *oplist);
internal E_IRTreeAndType e_irtree_and_type_from_expr__cached(E_Expr *expr);
////////////////////////////////
//~ rjf: Expression & IR-Tree => Lookup Rule
internal E_LookupRuleTagPair e_lookup_rule_tag_pair_from_expr_irtree(E_Expr *expr, E_IRTreeAndType *irtree);
#endif // EVAL_IR_H