diff --git a/src/eval/eval_ir.c b/src/eval/eval_ir.c index 6daeb12b..0d9f6a65 100644 --- a/src/eval/eval_ir.c +++ b/src/eval/eval_ir.c @@ -1565,6 +1565,50 @@ e_irtree_resolve_to_value(Arena *arena, E_Mode from_mode, E_IRNode *tree, E_Type return result; } +//- rjf: rule tag poison checking + +internal B32 +e_tag_is_poisoned(E_Expr *tag) +{ + B32 tag_is_poisoned = 0; + U64 hash = e_hash_from_string(5381, str8_struct(&tag)); + U64 slot_idx = hash%e_ir_state->used_tag_map->slots_count; + for(E_UsedTagNode *n = e_ir_state->used_tag_map->slots[slot_idx].first; n != 0; n = n->next) + { + if(n->tag == tag) + { + tag_is_poisoned = 1; + break; + } + } + return tag_is_poisoned; +} + +internal void +e_tag_poison(E_Expr *tag) +{ + U64 hash = e_hash_from_string(5381, str8_struct(&tag)); + U64 slot_idx = hash%e_ir_state->used_tag_map->slots_count; + E_UsedTagNode *n = push_array(e_ir_state->arena, E_UsedTagNode, 1); + n->tag = tag; + DLLPushBack(e_ir_state->used_tag_map->slots[slot_idx].first, e_ir_state->used_tag_map->slots[slot_idx].last, n); +} + +internal void +e_tag_unpoison(E_Expr *tag) +{ + U64 hash = e_hash_from_string(5381, str8_struct(&tag)); + U64 slot_idx = hash%e_ir_state->used_tag_map->slots_count; + for(E_UsedTagNode *n = e_ir_state->used_tag_map->slots[slot_idx].first; n != 0; n = n->next) + { + if(n->tag == tag) + { + DLLRemove(e_ir_state->used_tag_map->slots[slot_idx].first, e_ir_state->used_tag_map->slots[slot_idx].last, n); + break; + } + } +} + //- rjf: top-level irtree/type extraction E_IRGEN_FUNCTION_DEF(default) @@ -1583,55 +1627,14 @@ E_IRGEN_FUNCTION_DEF(default) E_Expr *lhs = expr->first; E_Expr *rhs = lhs->next; E_IRTreeAndType lhs_irtree = e_irtree_and_type_from_expr(scratch.arena, lhs); - - // rjf: determine lookup rule - first check explicitly-specified tags - E_LookupRule *lookup_rule = &e_lookup_rule__default; - for(E_Expr *tag = lhs->first_tag; tag != &e_expr_nil; tag = tag->next) + E_LookupRuleTagPair lhs_lookup_rule_and_tag = e_lookup_rule_tag_pair_from_expr_irtree(lhs, &lhs_irtree); + ProfScope("lookup via rule '%.*s'", str8_varg(lhs_lookup_rule_and_tag.rule->name)) { - E_LookupRule *candidate = e_lookup_rule_from_string(tag->string); - if(candidate != &e_lookup_rule__nil) - { - lookup_rule = candidate; - break; - } - } - - // rjf: if the lookup rule is the default, try to (a) apply set-name hooks, or (b) apply auto-hooks - if(lookup_rule == &e_lookup_rule__default) - { - // rjf: try set name - E_Type *lhs_type = e_type_from_key__cached(lhs_irtree.type_key); - if(lhs_type->kind == E_TypeKind_Set) - { - E_LookupRule *candidate = e_lookup_rule_from_string(lhs_type->name); - if(candidate != &e_lookup_rule__nil) - { - lookup_rule = candidate; - } - } - - // rjf: try auto tags - if(lookup_rule == &e_lookup_rule__default) - { - E_ExprList auto_tags = e_auto_hook_tag_exprs_from_type_key__cached(lhs_irtree.type_key); - for(E_ExprNode *n = auto_tags.first; n != 0; n = n->next) - { - E_LookupRule *candidate = e_lookup_rule_from_string(n->v->string); - if(candidate != &e_lookup_rule__nil) - { - lookup_rule = candidate; - break; - } - } - } - } - - // rjf: use lookup rule to actually do the access - ProfScope("lookup via rule '%.*s'", str8_varg(lookup_rule->name)) - { - E_LookupInfo lookup_info = lookup_rule->info(arena, &lhs_irtree, str8_zero()); - E_LookupAccess lookup_access = lookup_rule->access(arena, expr->kind, lhs, rhs, lookup_info.user_data); + e_tag_poison(lhs_lookup_rule_and_tag.tag); + E_LookupInfo lookup_info = lhs_lookup_rule_and_tag.rule->info(arena, &lhs_irtree, str8_zero()); + E_LookupAccess lookup_access = lhs_lookup_rule_and_tag.rule->access(arena, expr->kind, lhs, rhs, lookup_info.user_data); result = lookup_access.irtree_and_type; + e_tag_unpoison(lhs_lookup_rule_and_tag.tag); } scratch_end(scratch); }break; @@ -2383,17 +2386,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) E_IRGenRule *irgen_rule_candidate = e_irgen_rule_from_string(name); if(irgen_rule_candidate != &e_irgen_rule__default) { - B32 tag_is_poisoned = 0; - U64 hash = e_hash_from_string(5381, str8_struct(&tag)); - U64 slot_idx = hash%e_ir_state->used_tag_map->slots_count; - for(E_UsedTagNode *n = e_ir_state->used_tag_map->slots[slot_idx].first; n != 0; n = n->next) - { - if(n->tag == tag) - { - tag_is_poisoned = 1; - break; - } - } + B32 tag_is_poisoned = e_tag_is_poisoned(tag); if(!tag_is_poisoned) { explicit_irgen_rule = irgen_rule_candidate; @@ -2417,14 +2410,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) for(Task *t = first_task; t != 0; t = t->next) { // rjf: poison the tag we are about to use, so we don't recursively use it - if(t->tag != &e_expr_nil) - { - U64 hash = e_hash_from_string(5381, str8_struct(&t->tag)); - U64 slot_idx = hash%e_ir_state->used_tag_map->slots_count; - E_UsedTagNode *n = push_array(arena, E_UsedTagNode, 1); - n->tag = t->tag; - DLLPushBack(e_ir_state->used_tag_map->slots[slot_idx].first, e_ir_state->used_tag_map->slots[slot_idx].last, n); - } + e_tag_poison(t->tag); // rjf: do this rule's generation ProfScope("irgen rule '%.*s'", str8_varg(t->rule->name)) @@ -2443,17 +2429,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) { for(E_Expr *tag = n->v; tag != &e_expr_nil; tag = tag->next) { - B32 tag_is_poisoned = 0; - U64 hash = e_hash_from_string(5381, str8_struct(&tag)); - U64 slot_idx = hash%e_ir_state->used_tag_map->slots_count; - for(E_UsedTagNode *n = e_ir_state->used_tag_map->slots[slot_idx].first; n != 0; n = n->next) - { - if(n->tag == tag) - { - tag_is_poisoned = 1; - break; - } - } + B32 tag_is_poisoned = e_tag_is_poisoned(tag); if(!tag_is_poisoned) { E_IRGenRule *rule = e_irgen_rule_from_string(tag->string); @@ -2474,19 +2450,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) //- rjf: unpoison the tags we used for(Task *t = first_task; t != 0; t = t->next) { - if(t->tag != &e_expr_nil) - { - U64 hash = e_hash_from_string(5381, str8_struct(&t->tag)); - U64 slot_idx = hash%e_ir_state->used_tag_map->slots_count; - for(E_UsedTagNode *n = e_ir_state->used_tag_map->slots[slot_idx].first; n != 0; n = n->next) - { - if(n->tag == t->tag) - { - DLLRemove(e_ir_state->used_tag_map->slots[slot_idx].first, e_ir_state->used_tag_map->slots[slot_idx].last, n); - break; - } - } - } + e_tag_unpoison(t->tag); } scratch_end(scratch); @@ -2806,6 +2770,7 @@ e_lookup_rule_tag_pair_from_expr_irtree(E_Expr *expr, E_IRTreeAndType *irtree) { for(E_Expr *tag = expr->first_tag; tag != &e_expr_nil; tag = tag->next) { + if(e_tag_is_poisoned(tag)) { continue; } E_LookupRule *candidate = e_lookup_rule_from_string(tag->string); if(candidate != &e_lookup_rule__nil) { @@ -2838,6 +2803,7 @@ e_lookup_rule_tag_pair_from_expr_irtree(E_Expr *expr, E_IRTreeAndType *irtree) 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) { + if(e_tag_is_poisoned(n->v)) { continue; } E_LookupRule *candidate = e_lookup_rule_from_string(n->v->string); if(candidate != &e_lookup_rule__nil) { diff --git a/src/eval/eval_ir.h b/src/eval/eval_ir.h index cfcecfb3..c1cfad6d 100644 --- a/src/eval/eval_ir.h +++ b/src/eval/eval_ir.h @@ -448,6 +448,11 @@ internal E_IRNode *e_irtree_trunc(Arena *arena, E_IRNode *c, E_TypeKey type_key) internal E_IRNode *e_irtree_convert_hi(Arena *arena, E_IRNode *c, E_TypeKey out, E_TypeKey in); internal E_IRNode *e_irtree_resolve_to_value(Arena *arena, E_Mode from_mode, E_IRNode *tree, E_TypeKey type_key); +//- rjf: rule tag poison checking +internal B32 e_tag_is_poisoned(E_Expr *tag); +internal void e_tag_poison(E_Expr *tag); +internal void e_tag_unpoison(E_Expr *tag); + //- rjf: top-level irtree/type extraction internal E_IRTreeAndType e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr); diff --git a/src/eval_visualization/eval_visualization_core.c b/src/eval_visualization/eval_visualization_core.c index ed8ad052..ee6db1d9 100644 --- a/src/eval_visualization/eval_visualization_core.c +++ b/src/eval_visualization/eval_visualization_core.c @@ -498,6 +498,16 @@ ev_keyed_expr_push_tags(Arena *arena, EV_View *view, EV_Block *block, EV_Key key next = tag->next; e_expr_push_tag(expr, tag); } + + // rjf: push tags inferred from the type + { + E_IRTreeAndType irtree = e_irtree_and_type_from_expr(scratch.arena, expr); + 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_expr_push_tag(expr, e_expr_copy(arena, n->v)); + } + } } scratch_end(scratch); } diff --git a/src/raddbg/generated/raddbg.meta.c b/src/raddbg/generated/raddbg.meta.c index 87859791..cfb3a3ff 100644 --- a/src/raddbg/generated/raddbg.meta.c +++ b/src/raddbg/generated/raddbg.meta.c @@ -814,7 +814,7 @@ str8_lit_comp("far_manager"), String8 rd_theme_preset_cfg_string_table[9] = { -str8_lit_comp("theme:\n{\n background: 0x1b1b1bff,\n alt: background: 0x222222ff,\n pop: background: 0x355b6eff,\n fresh: background: 0x31393dff,\n match: background: 0x31393dff,\n border: 0x404040ff,\n text: 0xe5e5e5ff,\n weak: text: 0xa4a4a4ff,\n good: text: 0x32a852ff,\n bad: text: 0xcf5242ff,\n hover: 0xffffffff,\n focus: 0xfda200ff,\n cursor: 0x8aff00ff,\n selection: 0x99ccffff,\n inactive: background: 0x0000002f,\n drop_shadow: 0x0000007f,\n\n good_pop:\n {\n background: 0x2c5b36ff,\n border: 0x568761ff,\n hover: 0xe3f5d3ff,\n weak: text: 0xe3f5d3ff,\n }\n\n bad_pop:\n {\n background: 0x803425ff,\n hover: 0xff825cff,\n }\n\n code_default: 0xcbcbcbff,\n code_symbol: 0x42a2cfff,\n code_type: 0xfec746ff,\n code_local: 0x98bc80ff,\n code_register: 0xb7afd5ff,\n code_keyword: 0xb38d4cff,\n code_delimiter_or_operator: 0x767676ff,\n code_numeric: 0x98abb1ff,\n code_numeric_alt_digit_group: 0x738287ff,\n code_string: 0x98abb1ff,\n code_meta: 0xd96759ff,\n code_comment: 0x717171ff,\n line_info_0: 0x4f3022ff,\n line_info_1: 0x4f3e15ff,\n line_info_2: 0x434e2aff,\n line_info_3: 0x36241fff,\n line_info_4: 0x4f3022ff,\n line_info_5: 0x4f3e15ff,\n line_info_6: 0x434e2aff,\n line_info_7: 0x36241fff,\n thread_0: 0xffcb7fff,\n thread_1: 0xb2ff65ff,\n thread_2: 0xff99e5ff,\n thread_3: 0x6598ffff,\n thread_4: 0x65ffcbff,\n thread_5: 0xff9819ff,\n thread_6: 0x9932ffff,\n thread_7: 0x65ff4cff,\n thread_unwound: 0xb2ccd8ff,\n thread_error: 0xb23219ff,\n breakpoint: 0xa72911ff,\n\n floating:\n {\n background: 0x1b1b1baf,\n background: alt: 0x0000005f,\n background: fresh: 0x31393d5f,\n border: 0xbfbfbf1f,\n scroll_bar:\n {\n background: 0x3b3b3b5f,\n border: 0x5f5f5f5f,\n }\n }\n\n menu_bar:\n {\n background: 0x2b3740ff,\n border: 0x3e4c57ff,\n }\n\n scroll_bar:\n {\n background: 0x2b2b2bff,\n border: 0x3f3f3fff,\n }\n\n implicit:\n {\n background: 0x00000000,\n border: 0x00000000,\n }\n\n hollow:\n {\n background: 0x00000000,\n border: 0xffffff1f,\n }\n\n tab:\n {\n background: 0x6f5135ff,\n border: 0x8a6e54ff,\n inactive:\n {\n background: 0x2b3740ff,\n border: 0x3e4c57ff,\n }\n auto:\n {\n background: 0x693847ff,\n border: 0x9e6274ff,\n inactive:\n {\n background: 0x341f3dff,\n border: 0x685073ff,\n }\n }\n }\n\n drop_site:\n {\n background: 0xffffff05,\n border: 0xffffff0f,\n }\n}\n"), +str8_lit_comp("theme:\n{\n background: 0x1b1b1bff,\n alt: background: 0x222222ff,\n pop: background: 0x355b6eff,\n fresh: background: 0x31393dff,\n match: background: 0x31393dff,\n border: 0x404040ff,\n text: 0xe5e5e5ff,\n weak: text: 0xa4a4a4ff,\n good: text: 0x32a852ff,\n bad: text: 0xcf5242ff,\n hover: 0xffffffff,\n focus: 0xfda200ff,\n cursor: 0x8aff00ff,\n selection: 0x99ccffff,\n inactive: background: 0x0000002f,\n drop_shadow: 0x0000007f,\n\n good_pop:\n {\n background: 0x2c5b36ff,\n border: 0x568761ff,\n hover: 0xe3f5d3ff,\n weak: text: 0xe3f5d3ff,\n }\n\n bad_pop:\n {\n background: 0x803425ff,\n hover: 0xff825cff,\n }\n\n code_default: 0xcbcbcbff,\n code_symbol: 0x42a2cfff,\n code_type: 0xfec746ff,\n code_local: 0x98bc80ff,\n code_register: 0xb7afd5ff,\n code_keyword: 0xb38d4cff,\n code_delimiter_or_operator: 0x767676ff,\n code_numeric: 0x98abb1ff,\n code_numeric_alt_digit_group: 0x738287ff,\n code_string: 0x98abb1ff,\n code_meta: 0xd96759ff,\n code_comment: 0x717171ff,\n line_info_0: 0x4f3022ff,\n line_info_1: 0x4f3e15ff,\n line_info_2: 0x434e2aff,\n line_info_3: 0x36241fff,\n line_info_4: 0x4f3022ff,\n line_info_5: 0x4f3e15ff,\n line_info_6: 0x434e2aff,\n line_info_7: 0x36241fff,\n thread_0: 0xffcb7fff,\n thread_1: 0xb2ff65ff,\n thread_2: 0xff99e5ff,\n thread_3: 0x6598ffff,\n thread_4: 0x65ffcbff,\n thread_5: 0xff9819ff,\n thread_6: 0x9932ffff,\n thread_7: 0x65ff4cff,\n thread_unwound: 0xb2ccd8ff,\n thread_error: 0xb23219ff,\n breakpoint: 0xa72911ff,\n\n floating:\n {\n background: 0x1b1b1baf,\n background: alt: 0x0000005f,\n background: fresh: 0x31393d5f,\n border: 0xbfbfbf1f,\n scroll_bar:\n {\n background: 0x3b3b3b5f,\n border: 0x5f5f5f5f,\n }\n }\n\n menu_bar:\n {\n background: 0x2b3740ff,\n border: 0x3e4c57ff,\n }\n\n scroll_bar:\n {\n background: 0x2b2b2bff,\n border: 0x3f3f3fff,\n }\n\n implicit:\n {\n background: 0x00000000,\n border: 0x00000000,\n }\n\n hollow:\n {\n background: 0x00000000,\n border: 0xffffff1f,\n }\n\n tab:\n {\n background: 0x6f5135ff,\n border: 0x8a6e54ff,\n inactive:\n {\n background: 0x2b3740ff,\n border: 0x3e4c57ff,\n }\n auto:\n {\n background: 0x693847ff,\n border: 0x9e6274ff,\n inactive:\n {\n background: 0x2f2633ff,\n border: 0x685073ff,\n }\n }\n }\n\n drop_site:\n {\n background: 0xffffff05,\n border: 0xffffff0f,\n }\n}\n"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), diff --git a/src/raddbg/raddbg.mdesk b/src/raddbg/raddbg.mdesk index 4294ddd7..e8561041 100644 --- a/src/raddbg/raddbg.mdesk +++ b/src/raddbg/raddbg.mdesk @@ -1118,7 +1118,7 @@ RD_ThemePresetTable: border: 0x9e6274ff, inactive: { - background: 0x341f3dff, + background: 0x2f2633ff, border: 0x685073ff, } } diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 95836e97..2ab193ed 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -7196,8 +7196,8 @@ rd_window_frame(void) UI_Parent(tab_column_box) UI_PrefHeight(ui_px(tab_bar_vheight, 1)) UI_TagF(omit_name ? "hollow" : "") - UI_TagF(!tab_is_selected ? "inactive" : "") - UI_TagF(tab_is_auto ? "auto" : "") + UI_TagF(!omit_name && !tab_is_selected ? "inactive" : "") + UI_TagF(!omit_name && tab_is_auto ? "auto" : "") { if(panel->tab_side == Side_Max) { @@ -8251,6 +8251,13 @@ rd_append_value_strings_from_eval(Arena *arena, String8 filter, EV_StringFlags f } else { + // rjf: unpack + E_IRTreeAndType irtree = e_irtree_and_type_from_expr(scratch.arena, eval.exprs.last); + E_LookupRuleTagPair lookup_rule_and_tag = e_lookup_rule_tag_pair_from_expr_irtree(eval.exprs.last, &irtree); + E_LookupRule *lookup_rule = lookup_rule_and_tag.rule; + E_Expr *lookup_rule_tag = lookup_rule_and_tag.tag; + E_LookupInfo lookup_info = lookup_rule->info(arena, &irtree, filter); + U64 total_possible_child_count = Max(lookup_info.idxed_expr_count, lookup_info.named_expr_count); String8 opener_string = str8_lit("["); String8 closer_string = str8_lit("]"); @@ -8262,12 +8269,6 @@ rd_append_value_strings_from_eval(Arena *arena, String8 filter, EV_StringFlags f // rjf: contents { - E_IRTreeAndType irtree = e_irtree_and_type_from_expr(scratch.arena, eval.exprs.last); - E_LookupRuleTagPair lookup_rule_and_tag = e_lookup_rule_tag_pair_from_expr_irtree(eval.exprs.last, &irtree); - E_LookupRule *lookup_rule = lookup_rule_and_tag.rule; - E_Expr *lookup_rule_tag = lookup_rule_and_tag.tag; - E_LookupInfo lookup_info = lookup_rule->info(arena, &irtree, filter); - U64 total_possible_child_count = Max(lookup_info.idxed_expr_count, lookup_info.named_expr_count); B32 is_first = 1; for(U64 idx = 0; idx < total_possible_child_count && max_size > space_taken; idx += 1) { @@ -8384,9 +8385,16 @@ rd_append_value_strings_from_eval(Arena *arena, String8 filter, EV_StringFlags f case E_TypeKind_Set: arrays_and_sets_and_structs: { + // rjf: unpack + E_IRTreeAndType irtree = e_irtree_and_type_from_expr(scratch.arena, eval.exprs.last); + E_LookupRuleTagPair lookup_rule_and_tag = e_lookup_rule_tag_pair_from_expr_irtree(eval.exprs.last, &irtree); + E_LookupRule *lookup_rule = lookup_rule_and_tag.rule; + E_Expr *lookup_rule_tag = lookup_rule_and_tag.tag; + E_LookupInfo lookup_info = lookup_rule->info(arena, &irtree, filter); + U64 total_possible_child_count = Max(lookup_info.idxed_expr_count, lookup_info.named_expr_count); String8 opener_string = str8_lit("{"); String8 closer_string = str8_lit("}"); - if(kind == E_TypeKind_Array) + if(lookup_info.idxed_expr_count > lookup_info.named_expr_count) { opener_string = str8_lit("["); closer_string = str8_lit("]"); @@ -8401,12 +8409,6 @@ rd_append_value_strings_from_eval(Arena *arena, String8 filter, EV_StringFlags f // rjf: build contents if(depth < 4) { - E_IRTreeAndType irtree = e_irtree_and_type_from_expr(scratch.arena, eval.exprs.last); - E_LookupRuleTagPair lookup_rule_and_tag = e_lookup_rule_tag_pair_from_expr_irtree(eval.exprs.last, &irtree); - E_LookupRule *lookup_rule = lookup_rule_and_tag.rule; - E_Expr *lookup_rule_tag = lookup_rule_and_tag.tag; - E_LookupInfo lookup_info = lookup_rule->info(arena, &irtree, filter); - U64 total_possible_child_count = Max(lookup_info.idxed_expr_count, lookup_info.named_expr_count); B32 is_first = 1; for(U64 idx = 0; idx < total_possible_child_count && max_size > space_taken; idx += 1) { @@ -11969,6 +11971,8 @@ rd_frame(void) }break; //- rjf: code navigation + case RD_CmdKind_Search: + case RD_CmdKind_SearchBackwards: case RD_CmdKind_FindTextForward: case RD_CmdKind_FindTextBackward: { @@ -11978,11 +11982,11 @@ rd_frame(void) //- rjf: find next and find prev case RD_CmdKind_FindNext: { - rd_cmd(RD_CmdKind_FindTextForward, .string = rd_push_search_string(scratch.arena)); + rd_cmd(RD_CmdKind_Search, .string = rd_push_search_string(scratch.arena)); }break; case RD_CmdKind_FindPrev: { - rd_cmd(RD_CmdKind_FindTextBackward, .string = rd_push_search_string(scratch.arena)); + rd_cmd(RD_CmdKind_SearchBackwards, .string = rd_push_search_string(scratch.arena)); }break; //- rjf: font sizes @@ -13769,7 +13773,7 @@ Z(getting_started) }break; #endif - //- rjf: query stack + //- rjf: queries case RD_CmdKind_PushQuery: { String8 cmd_name = rd_regs()->cmd_name;