Skip to content

Commit 5bbd9f1

Browse files
committed
eliminate expr resolution hook in eval visualization layer; now succeeded by irgen hook
1 parent 07c9268 commit 5bbd9f1

File tree

7 files changed

+21
-327
lines changed

7 files changed

+21
-327
lines changed

src/eval_visualization/eval_visualization.mdesk

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,13 +115,12 @@ EV_ViewRuleTable:
115115

116116
@gen
117117
{
118-
@expand(EV_ViewRuleTable a) `$(a.xr == "x" -> "EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF(" .. a.name_lower .. ");")`;
119118
@expand(EV_ViewRuleTable a) `$(a.xe == "x" -> "EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(" .. a.name_lower .. ");")`;
120119
@expand(EV_ViewRuleTable a) `$(a.xe == "x" -> "EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(" .. a.name_lower .. ");")`;
121120
}
122121

123122
@data(EV_ViewRuleInfo) @c_file ev_builtin_view_rule_info_table:
124123
{
125124
@expand(EV_ViewRuleTable a)
126-
```{str8_lit_comp("$(a.string)"), (EV_ViewRuleInfoFlag_Inherited*$(a.ih == "x"))|(EV_ViewRuleInfoFlag_Expandable*$(a.ex == "x")), $(a.xr == "x" -> "EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME("..a.name_lower..")") $(a.xr != "x" -> "EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME(identity)"), $(a.xe == "x" -> "EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME("..a.name_lower..")") $(a.xe != "x" -> "EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil)"), $(a.xe == "x" -> "EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME("..a.name_lower..")") $(a.xe != "x" -> "EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(nil)"), EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(identity), EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(identity) }```;
125+
```{str8_lit_comp("$(a.string)"), (EV_ViewRuleInfoFlag_Inherited*$(a.ih == "x"))|(EV_ViewRuleInfoFlag_Expandable*$(a.ex == "x")), $(a.xe == "x" -> "EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME("..a.name_lower..")") $(a.xe != "x" -> "EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil)"), $(a.xe == "x" -> "EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME("..a.name_lower..")") $(a.xe != "x" -> "EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(nil)"), EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(identity), EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(identity) }```;
127126
}

src/eval_visualization/eval_visualization_builtin_view_rules.c

Lines changed: 6 additions & 281 deletions
Original file line numberDiff line numberDiff line change
@@ -282,13 +282,13 @@ EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(default)
282282
//- rjf: fill with lookups
283283
//
284284
else if(accel->lookup_rule != 0)
285-
{
286-
E_LookupRange lookup_range = accel->lookup_rule->range(arena, expr, idx_range, accel->lookup_user_data);
287-
result.row_exprs_count = lookup_range.exprs_count;
288-
result.row_exprs = lookup_range.exprs;
289-
result.row_strings = lookup_range.exprs_strings;
285+
{
286+
E_LookupRange lookup_range = accel->lookup_rule->range(arena, expr, idx_range, accel->lookup_user_data);
287+
result.row_exprs_count = lookup_range.exprs_count;
288+
result.row_exprs = lookup_range.exprs;
289+
result.row_strings = lookup_range.exprs_strings;
290290
result.row_view_rules = push_array(arena, String8, result.row_exprs_count);
291-
result.row_members = push_array(arena, E_Member *, result.row_exprs_count);
291+
result.row_members = push_array(arena, E_Member *, result.row_exprs_count);
292292
for EachIndex(row_expr_idx, result.row_exprs_count)
293293
{
294294
result.row_members[row_expr_idx] = &e_member_nil;
@@ -298,27 +298,6 @@ EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(default)
298298
return result;
299299
}
300300

301-
////////////////////////////////
302-
//~ rjf: "array"
303-
304-
EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF(array)
305-
{
306-
Temp scratch = scratch_begin(&arena, 1);
307-
E_IRTreeAndType irtree = e_irtree_and_type_from_expr(scratch.arena, expr);
308-
E_TypeKey type_key = irtree.type_key;
309-
E_TypeKind type_kind = e_type_kind_from_key(type_key);
310-
if(e_type_kind_is_pointer_or_ref(type_kind))
311-
{
312-
E_Value count = ev_value_from_params(params);
313-
E_TypeKey element_type_key = e_type_ptee_from_key(type_key);
314-
E_TypeKey array_type_key = e_type_key_cons_array(element_type_key, count.u64);
315-
E_TypeKey ptr_type_key = e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, array_type_key, 0);
316-
expr = e_expr_ref_cast(arena, ptr_type_key, expr);
317-
}
318-
scratch_end(scratch);
319-
return expr;
320-
}
321-
322301
////////////////////////////////
323302
//~ rjf: "list"
324303

@@ -333,257 +312,3 @@ EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(list)
333312
EV_ExpandRangeInfo info = {0};
334313
return info;
335314
}
336-
337-
////////////////////////////////
338-
//~ rjf: "slice"
339-
340-
EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF(slice)
341-
{
342-
Temp scratch = scratch_begin(&arena, 1);
343-
E_IRTreeAndType irtree = e_irtree_and_type_from_expr(scratch.arena, expr);
344-
E_TypeKind type_kind = e_type_kind_from_key(irtree.type_key);
345-
if(type_kind == E_TypeKind_Struct || type_kind == E_TypeKind_Class)
346-
{
347-
// rjf: unpack members
348-
E_MemberArray members = e_type_data_members_from_key__cached(irtree.type_key);
349-
350-
// rjf: choose base pointer & count members
351-
E_Member *base_ptr_member = 0;
352-
E_Member *count_member = 0;
353-
for(U64 idx = 0; idx < members.count; idx += 1)
354-
{
355-
E_Member *member = &members.v[idx];
356-
E_TypeKey member_type = e_type_unwrap(member->type_key);
357-
E_TypeKind member_type_kind = e_type_kind_from_key(member_type);
358-
if(count_member == 0 && e_type_kind_is_integer(member_type_kind))
359-
{
360-
count_member = member;
361-
}
362-
if(base_ptr_member == 0 && e_type_kind_is_pointer_or_ref(member_type_kind))
363-
{
364-
base_ptr_member = &members.v[idx];
365-
}
366-
if(count_member != 0 && base_ptr_member != 0)
367-
{
368-
break;
369-
}
370-
}
371-
372-
// rjf: evaluate count member, determine count
373-
U64 count = 0;
374-
if(count_member != 0)
375-
{
376-
E_Expr *count_member_expr = e_expr_ref_member_access(scratch.arena, expr, count_member->name);
377-
E_Eval count_member_eval = e_eval_from_expr(scratch.arena, count_member_expr);
378-
E_Eval count_member_value_eval = e_value_eval_from_eval(count_member_eval);
379-
count = count_member_value_eval.value.u64;
380-
}
381-
382-
// rjf: generate new struct slice type
383-
E_TypeKey slice_type_key = zero_struct;
384-
if(base_ptr_member != 0 && count_member != 0)
385-
{
386-
String8 struct_name = e_type_string_from_key(scratch.arena, irtree.type_key);
387-
E_TypeKey element_type_key = e_type_ptee_from_key(base_ptr_member->type_key);
388-
E_TypeKey array_type_key = e_type_key_cons_array(element_type_key, count);
389-
E_TypeKey sized_base_ptr_type_key = e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, array_type_key, 0);
390-
E_MemberList slice_type_members = {0};
391-
e_member_list_push(scratch.arena, &slice_type_members, count_member);
392-
e_member_list_push(scratch.arena, &slice_type_members, &(E_Member){.kind = E_MemberKind_DataField, .type_key = sized_base_ptr_type_key, .name = base_ptr_member->name, .pretty_name = base_ptr_member->pretty_name, .off = base_ptr_member->off});
393-
E_MemberArray slice_type_members_array = e_member_array_from_list(scratch.arena, &slice_type_members);
394-
slice_type_key = e_type_key_cons(.arch = e_type_state->ctx->primary_module->arch,
395-
.kind = E_TypeKind_Struct,
396-
.name = struct_name,
397-
.members = slice_type_members_array.v,
398-
.count = slice_type_members_array.count);
399-
}
400-
401-
// rjf: generate new expression tree - addr of struct, cast-to-ptr, deref
402-
if(base_ptr_member != 0 && count_member != 0)
403-
{
404-
expr = e_expr_ref_addr(arena, expr);
405-
expr = e_expr_ref_cast(arena, e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, slice_type_key, 0), expr);
406-
expr = e_expr_ref_deref(arena, expr);
407-
}
408-
}
409-
scratch_end(scratch);
410-
return expr;
411-
}
412-
413-
////////////////////////////////
414-
//~ rjf: "bswap"
415-
416-
EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF(bswap)
417-
{
418-
expr = e_expr_ref_bswap(arena, expr);
419-
return expr;
420-
}
421-
422-
////////////////////////////////
423-
//~ rjf: "cast"
424-
425-
EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF(cast)
426-
{
427-
E_TypeKey type_key = ev_type_key_from_params(params);
428-
expr = e_expr_ref_cast(arena, type_key, expr);
429-
return expr;
430-
}
431-
432-
////////////////////////////////
433-
//~ rjf: "wrap"
434-
435-
EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF(wrap)
436-
{
437-
String8 wrap_string = md_string_from_children(arena, params);
438-
E_Expr *wrap_expr = e_parse_expr_from_text(arena, wrap_string);
439-
E_Expr *new_root_expr = wrap_expr;
440-
if(wrap_expr != &e_expr_nil)
441-
{
442-
Temp scratch = scratch_begin(&arena, 1);
443-
typedef struct Task Task;
444-
struct Task
445-
{
446-
Task *next;
447-
E_Expr *parent;
448-
E_Expr *expr;
449-
};
450-
Task start_task = {0, &e_expr_nil, wrap_expr};
451-
Task *first_task = &start_task;
452-
Task *last_task = first_task;
453-
for(Task *t = first_task; t != 0; t = t->next)
454-
{
455-
if(t->expr->kind == E_ExprKind_LeafIdent && str8_match(t->expr->string, str8_lit("$expr"), 0))
456-
{
457-
E_Expr *original_expr_ref = e_expr_ref(arena, expr);
458-
if(t->parent != &e_expr_nil)
459-
{
460-
e_expr_insert_child(t->parent, t->expr, original_expr_ref);
461-
e_expr_remove_child(t->parent, t->expr);
462-
}
463-
else
464-
{
465-
new_root_expr = original_expr_ref;
466-
}
467-
}
468-
else for(E_Expr *child = t->expr->first; child != &e_expr_nil; child = child->next)
469-
{
470-
Task *task = push_array(scratch.arena, Task, 1);
471-
SLLQueuePush(first_task, last_task, task);
472-
task->parent = t->expr;
473-
task->expr = child;
474-
}
475-
}
476-
scratch_end(scratch);
477-
}
478-
return new_root_expr;
479-
}
480-
481-
////////////////////////////////
482-
//~ rjf: "only"
483-
484-
EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF(only)
485-
{
486-
Temp scratch = scratch_begin(&arena, 1);
487-
E_IRTreeAndType irtree = e_irtree_and_type_from_expr(scratch.arena, expr);
488-
E_TypeKey type_key = irtree.type_key;
489-
E_TypeKind type_kind = e_type_kind_from_key(type_key);
490-
E_TypeKey direct_type_key = e_type_direct_from_key(type_key);
491-
E_TypeKind direct_type_kind = e_type_kind_from_key(direct_type_key);
492-
B32 is_ptr = e_type_kind_is_pointer_or_ref(type_kind);
493-
E_TypeKey struct_type_key = is_ptr ? direct_type_key : type_key;
494-
E_TypeKind struct_type_kind = is_ptr ? direct_type_kind : type_kind;
495-
if(struct_type_kind == E_TypeKind_Struct ||
496-
struct_type_kind == E_TypeKind_Union ||
497-
struct_type_kind == E_TypeKind_Class)
498-
{
499-
E_MemberArray current_members = e_type_data_members_from_key__cached(struct_type_key);
500-
E_MemberList new_members = {0};
501-
for MD_EachNode(node, params->first)
502-
{
503-
for EachIndex(idx, current_members.count)
504-
{
505-
if(str8_match(node->string, current_members.v[idx].name, 0))
506-
{
507-
e_member_list_push(scratch.arena, &new_members, &current_members.v[idx]);
508-
break;
509-
}
510-
}
511-
}
512-
E_MemberArray new_members_array = e_member_array_from_list(scratch.arena, &new_members);
513-
E_TypeKey new_type = {0};
514-
if(new_members_array.count == 1 && new_members_array.v[0].off == 0)
515-
{
516-
new_type = new_members_array.v[0].type_key;
517-
}
518-
else
519-
{
520-
String8 struct_name = e_type_string_from_key(scratch.arena, struct_type_key);
521-
new_type = e_type_key_cons(.kind = E_TypeKind_Struct, .name = struct_name, .members = new_members_array.v, .count = new_members_array.count);
522-
}
523-
if(!is_ptr)
524-
{
525-
expr = e_expr_ref_addr(arena, expr);
526-
}
527-
expr = e_expr_ref_cast(arena, e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, new_type, 0), expr);
528-
if(!is_ptr)
529-
{
530-
expr = e_expr_ref_deref(arena, expr);
531-
}
532-
}
533-
scratch_end(scratch);
534-
return expr;
535-
}
536-
537-
////////////////////////////////
538-
//~ rjf: "omit"
539-
540-
EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF(omit)
541-
{
542-
Temp scratch = scratch_begin(&arena, 1);
543-
E_IRTreeAndType irtree = e_irtree_and_type_from_expr(scratch.arena, expr);
544-
E_TypeKey type_key = irtree.type_key;
545-
E_TypeKind type_kind = e_type_kind_from_key(type_key);
546-
E_TypeKey direct_type_key = e_type_direct_from_key(type_key);
547-
E_TypeKind direct_type_kind = e_type_kind_from_key(direct_type_key);
548-
B32 is_ptr = e_type_kind_is_pointer_or_ref(type_kind);
549-
E_TypeKey struct_type_key = is_ptr ? direct_type_key : type_key;
550-
E_TypeKind struct_type_kind = is_ptr ? direct_type_kind : type_kind;
551-
if(struct_type_kind == E_TypeKind_Struct ||
552-
struct_type_kind == E_TypeKind_Union ||
553-
struct_type_kind == E_TypeKind_Class)
554-
{
555-
E_MemberArray current_members = e_type_data_members_from_key__cached(struct_type_key);
556-
E_MemberList new_members = {0};
557-
for EachIndex(idx, current_members.count)
558-
{
559-
B32 include = 1;
560-
for MD_EachNode(node, params->first)
561-
{
562-
if(str8_match(node->string, current_members.v[idx].name, 0))
563-
{
564-
include = 0;
565-
break;
566-
}
567-
}
568-
if(include)
569-
{
570-
e_member_list_push(scratch.arena, &new_members, &current_members.v[idx]);
571-
}
572-
}
573-
E_MemberArray new_members_array = e_member_array_from_list(scratch.arena, &new_members);
574-
E_TypeKey new_type = {0};
575-
String8 struct_name = e_type_string_from_key(scratch.arena, struct_type_key);
576-
new_type = e_type_key_cons(.kind = E_TypeKind_Struct, .name = struct_name, .members = new_members_array.v, .count = new_members_array.count);
577-
if(!is_ptr)
578-
{
579-
expr = e_expr_ref_addr(arena, expr);
580-
}
581-
expr = e_expr_ref_cast(arena, e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, new_type, 0), expr);
582-
if(!is_ptr)
583-
{
584-
expr = e_expr_ref_deref(arena, expr);
585-
}
586-
}
587-
scratch_end(scratch);
588-
return expr;
589-
}

src/eval_visualization/eval_visualization_core.c

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,6 @@
99
////////////////////////////////
1010
//~ rjf: Nil/Identity View Rule Hooks
1111

12-
EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF(identity)
13-
{
14-
return expr;
15-
}
16-
1712
EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(nil)
1813
{
1914
EV_ExpandInfo info = {0};
@@ -656,14 +651,6 @@ ev_resolved_from_expr(Arena *arena, E_Expr *expr, EV_ViewRuleList *view_rules)
656651
}
657652
scratch_end(scratch);
658653
}
659-
for(EV_ViewRuleNode *n = view_rules->first; n != 0; n = n->next)
660-
{
661-
EV_ViewRuleInfo *info = ev_view_rule_info_from_string(n->v.root->string);
662-
if(info->expr_resolution != 0)
663-
{
664-
expr = info->expr_resolution(arena, expr, n->v.root);
665-
}
666-
}
667654
ProfEnd();
668655
return expr;
669656
}

src/eval_visualization/eval_visualization_core.h

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -121,10 +121,6 @@ struct EV_ExpandRangeInfo
121121
E_Member **row_members;
122122
};
123123

124-
#define EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_SIG(name) E_Expr *name(Arena *arena, E_Expr *expr, MD_Node *params)
125-
#define EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME(name) ev_view_rule_expr_resolution__##name
126-
#define EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF(name) internal EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_SIG(EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME(name))
127-
128124
#define EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_SIG(name) EV_ExpandInfo name(Arena *arena, EV_View *view, String8 filter, E_Expr *expr, MD_Node *params)
129125
#define EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(name) ev_view_rule_expr_expand_info__##name
130126
#define EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(name) internal EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_SIG(EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(name))
@@ -141,7 +137,6 @@ struct EV_ExpandRangeInfo
141137
#define EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(name) ev_view_rule_expr_expand_num_from_id_##name
142138
#define EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(name) internal EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_SIG(EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(name))
143139

144-
typedef EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_SIG(EV_ViewRuleExprResolutionHookFunctionType);
145140
typedef EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_SIG(EV_ViewRuleExprExpandInfoHookFunctionType);
146141
typedef EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_SIG(EV_ViewRuleExprExpandRangeInfoHookFunctionType);
147142
typedef EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_SIG(EV_ViewRuleExprExpandIDFromNumHookFunctionType);
@@ -159,7 +154,6 @@ struct EV_ViewRuleInfo
159154
{
160155
String8 string;
161156
EV_ViewRuleInfoFlags flags;
162-
EV_ViewRuleExprResolutionHookFunctionType *expr_resolution;
163157
EV_ViewRuleExprExpandInfoHookFunctionType *expr_expand_info;
164158
EV_ViewRuleExprExpandRangeInfoHookFunctionType *expr_expand_range_info;
165159
EV_ViewRuleExprExpandIDFromNumHookFunctionType *expr_expand_id_from_num;
@@ -329,7 +323,6 @@ enum
329323
////////////////////////////////
330324
//~ rjf: Nil/Identity View Rule Hooks
331325

332-
EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF(identity);
333326
EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(nil);
334327
EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(nil);
335328
EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(identity);
@@ -342,7 +335,6 @@ global read_only EV_ViewRuleInfo ev_nil_view_rule_info =
342335
{
343336
{0},
344337
0,
345-
EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME(identity),
346338
EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil),
347339
EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(nil),
348340
EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(identity),

0 commit comments

Comments
 (0)