From e27f31cfa4f6640fdd2110c646d1778785fdc05c Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 15 Apr 2025 11:35:49 -0700 Subject: [PATCH] adjust meta-expr type visualization; unify 'type unwrapping' paths, instead of nest of various 'scanners', we just have one path which we parameterize via bits to skip what each path needs --- src/eval/eval_bundles.c | 18 +- src/eval/eval_ir.c | 59 +- src/eval/eval_types.c | 569 ++++++++---------- src/eval/eval_types.h | 38 +- .../eval_visualization_core.c | 27 +- src/raddbg/raddbg_core.c | 11 +- src/raddbg/raddbg_eval.c | 6 +- src/raddbg/raddbg_views.c | 2 +- 8 files changed, 336 insertions(+), 394 deletions(-) diff --git a/src/eval/eval_bundles.c b/src/eval/eval_bundles.c index 5a35ef78..4e056cb1 100644 --- a/src/eval/eval_bundles.c +++ b/src/eval/eval_bundles.c @@ -94,7 +94,7 @@ e_dynamically_typed_eval_from_eval(E_Eval eval) type_kind == E_TypeKind_Ptr) { Temp scratch = scratch_begin(0, 0); - E_TypeKey ptee_type_key = e_type_unwrap(e_type_direct_from_key(e_type_unwrap(type_key))); + E_TypeKey ptee_type_key = e_type_key_unwrap(type_key, E_TypeUnwrapFlag_AllDecorative); E_TypeKind ptee_type_kind = e_type_kind_from_key(ptee_type_key); if(ptee_type_kind == E_TypeKind_Struct || ptee_type_kind == E_TypeKind_Class) { @@ -111,7 +111,7 @@ e_dynamically_typed_eval_from_eval(E_Eval eval) if(has_vtable) { U64 ptr_vaddr = eval.value.u64; - U64 addr_size = e_type_byte_size_from_key(e_type_unwrap(type_key)); + U64 addr_size = e_type_byte_size_from_key(e_type_key_unwrap(type_key, E_TypeUnwrapFlag_AllDecorative)); U64 class_base_vaddr = 0; U64 vtable_vaddr = 0; if(e_space_read(eval.space, &class_base_vaddr, r1u64(ptr_vaddr, ptr_vaddr+addr_size)) && @@ -160,7 +160,7 @@ e_value_eval_from_eval(E_Eval eval) ProfBeginFunction(); if(eval.irtree.mode == E_Mode_Offset) { - E_TypeKey type_key = e_type_unwrap(eval.irtree.type_key); + E_TypeKey type_key = e_type_key_unwrap(eval.irtree.type_key, E_TypeUnwrapFlag_AllDecorative); E_TypeKind type_kind = e_type_kind_from_key(type_key); if(type_kind == E_TypeKind_Array) { @@ -249,7 +249,7 @@ e_value_from_expr(E_Expr *expr) internal U64 e_base_offset_from_eval(E_Eval eval) { - if(e_type_kind_is_pointer_or_ref(e_type_kind_from_key(e_type_unwrap(eval.irtree.type_key)))) + if(e_type_kind_is_pointer_or_ref(e_type_kind_from_key(e_type_key_unwrap(eval.irtree.type_key, E_TypeUnwrapFlag_AllDecorative)))) { eval = e_value_eval_from_eval(eval); } @@ -273,23 +273,23 @@ e_range_from_eval(E_Eval eval) } } } - E_TypeKey type_key = e_type_unwrap(eval.irtree.type_key); + E_TypeKey type_key = e_type_key_unwrap(eval.irtree.type_key, E_TypeUnwrapFlag_AllDecorative); E_TypeKind type_kind = e_type_kind_from_key(type_key); - E_TypeKey direct_type_key = e_type_unwrap(e_type_direct_from_key(eval.irtree.type_key)); + E_TypeKey direct_type_key = e_type_key_unwrap(type_key, E_TypeUnwrapFlag_All); E_TypeKind direct_type_kind = e_type_kind_from_key(direct_type_key); if(size == 0 && e_type_kind_is_pointer_or_ref(type_kind) && (direct_type_kind == E_TypeKind_Struct || direct_type_kind == E_TypeKind_Union || direct_type_kind == E_TypeKind_Class || direct_type_kind == E_TypeKind_Array)) { - size = e_type_byte_size_from_key(e_type_direct_from_key(e_type_unwrap(eval.irtree.type_key))); + size = e_type_byte_size_from_key(direct_type_key); } if(size == 0 && eval.irtree.mode == E_Mode_Offset && (type_kind == E_TypeKind_Struct || type_kind == E_TypeKind_Union || type_kind == E_TypeKind_Class || type_kind == E_TypeKind_Array)) { - size = e_type_byte_size_from_key(e_type_unwrap(eval.irtree.type_key)); + size = e_type_byte_size_from_key(type_key); } if(size == 0) { @@ -376,7 +376,7 @@ e_debug_log_from_expr_string(Arena *arena, String8 string) S32 indent = 2; for(E_TypeKey type_key = irtree.type_key; !e_type_key_match(e_type_key_zero(), type_key); - type_key = e_type_direct_from_key(type_key), + type_key = e_type_key_direct(type_key), indent += 1) { E_Type *type = e_type_from_key(scratch.arena, type_key); diff --git a/src/eval/eval_ir.c b/src/eval/eval_ir.c index 4eca77d5..9838c363 100644 --- a/src/eval/eval_ir.c +++ b/src/eval/eval_ir.c @@ -658,7 +658,7 @@ E_TYPE_ACCESS_FUNCTION_DEF(default) E_Expr *exprl = expr->first; E_Expr *exprr = exprl->next; E_IRTreeAndType l = *lhs_irtree; - E_TypeKey l_restype = e_type_unwrap(l.type_key); + E_TypeKey l_restype = e_type_key_unwrap(l.type_key, E_TypeUnwrapFlag_AllDecorative); E_TypeKind l_restype_kind = e_type_kind_from_key(l_restype); E_TypeKey check_type_key = l_restype; E_TypeKind check_type_kind = l_restype_kind; @@ -666,7 +666,7 @@ E_TYPE_ACCESS_FUNCTION_DEF(default) l_restype_kind == E_TypeKind_LRef || l_restype_kind == E_TypeKind_RRef) { - check_type_key = e_type_unwrap(e_type_direct_from_key(e_type_unwrap(l_restype))); + check_type_key = e_type_key_unwrap(l.type_key, E_TypeUnwrapFlag_All); check_type_kind = e_type_kind_from_key(check_type_key); } e_msg_list_concat_in_place(&result.msgs, &l.msgs); @@ -783,18 +783,11 @@ E_TYPE_ACCESS_FUNCTION_DEF(default) E_Expr *exprr = exprl->next; E_IRTreeAndType l = *lhs_irtree; E_IRTreeAndType r = e_irtree_and_type_from_expr(arena, exprr); - E_TypeKey l_restype = e_type_unwrap(l.type_key); - E_TypeKey r_restype = e_type_unwrap(r.type_key); + E_TypeKey l_restype = e_type_key_unwrap(l.type_key, E_TypeUnwrapFlag_AllDecorative); + E_TypeKey r_restype = e_type_key_unwrap(r.type_key, E_TypeUnwrapFlag_AllDecorative); E_TypeKind l_restype_kind = e_type_kind_from_key(l_restype); E_TypeKind r_restype_kind = e_type_kind_from_key(r_restype); - if(e_type_kind_is_basic_or_enum(r_restype_kind)) - { - r_restype = e_type_unwrap_enum(r_restype); - r_restype_kind = e_type_kind_from_key(r_restype); - } - E_TypeKey direct_type = e_type_unwrap(l_restype); - direct_type = e_type_direct_from_key(direct_type); - direct_type = e_type_unwrap(direct_type); + E_TypeKey direct_type = e_type_key_unwrap(l_restype, E_TypeUnwrapFlag_All); U64 direct_type_size = e_type_byte_size_from_key(direct_type); e_msg_list_concat_in_place(&result.msgs, &l.msgs); e_msg_list_concat_in_place(&result.msgs, &r.msgs); @@ -951,7 +944,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *root_expr) { e_type_key_list_push_front(scratch.arena, &inherited_lenses, k); } - k = e_type_direct_from_key(k); + k = e_type_key_direct(k); kind = e_type_kind_from_key(k); } } @@ -981,9 +974,9 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *root_expr) // rjf: unpack operand E_Expr *r_expr = expr->first; E_IRTreeAndType r_tree = e_irtree_and_type_from_expr(arena, r_expr); - E_TypeKey r_type = e_type_unwrap(r_tree.type_key); + E_TypeKey r_type = e_type_key_unwrap(r_tree.type_key, E_TypeUnwrapFlag_AllDecorative); E_TypeKind r_type_kind = e_type_kind_from_key(r_type); - E_TypeKey r_type_direct = e_type_unwrap(e_type_direct_from_key(r_type)); + E_TypeKey r_type_direct = e_type_key_unwrap(r_type, E_TypeUnwrapFlag_All); U64 r_type_direct_size = e_type_byte_size_from_key(r_type_direct); e_msg_list_concat_in_place(&result.msgs, &r_tree.msgs); @@ -1037,7 +1030,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *root_expr) E_Expr *r_expr = expr->first; E_IRTreeAndType r_tree = e_irtree_and_type_from_expr(arena, r_expr); E_TypeKey r_type = r_tree.type_key; - E_TypeKey r_type_unwrapped = e_type_unwrap(r_type); + E_TypeKey r_type_unwrapped = e_type_key_unwrap(r_type, E_TypeUnwrapFlag_AllDecorative); E_TypeKind r_type_unwrapped_kind = e_type_kind_from_key(r_type_unwrapped); e_msg_list_concat_in_place(&result.msgs, &r_tree.msgs); @@ -1068,7 +1061,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *root_expr) U64 cast_type_byte_size = e_type_byte_size_from_key(cast_type); E_IRTreeAndType casted_tree = e_irtree_and_type_from_expr(arena, casted_expr); e_msg_list_concat_in_place(&result.msgs, &casted_tree.msgs); - E_TypeKey casted_type = e_type_unwrap(casted_tree.type_key); + E_TypeKey casted_type = e_type_key_unwrap(casted_tree.type_key, E_TypeUnwrapFlag_AllDecorative); E_TypeKind casted_type_kind = e_type_kind_from_key(casted_type); U64 casted_type_byte_size = e_type_byte_size_from_key(casted_type); U8 in_group = e_type_group_from_kind(casted_type_kind); @@ -1178,7 +1171,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *root_expr) E_Expr *r_expr = expr->first; E_IRTreeAndType r_tree = e_irtree_and_type_from_expr(arena, r_expr); e_msg_list_concat_in_place(&result.msgs, &r_tree.msgs); - E_TypeKey r_type = e_type_unwrap(r_tree.type_key); + E_TypeKey r_type = e_type_key_unwrap(r_tree.type_key, E_TypeUnwrapFlag_AllDecorative); E_TypeKind r_type_kind = e_type_kind_from_key(r_type); U64 r_type_size = e_type_byte_size_from_key(r_type); @@ -1212,10 +1205,10 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *root_expr) // rjf: unpack operand E_Expr *r_expr = expr->first; E_IRTreeAndType r_tree = e_irtree_and_type_from_expr(arena, r_expr); - E_TypeKey r_type = e_type_unwrap(r_tree.type_key); + E_TypeKey r_type = e_type_key_unwrap(r_tree.type_key, E_TypeUnwrapFlag_AllDecorative); E_TypeKind r_type_kind = e_type_kind_from_key(r_type); RDI_EvalTypeGroup r_type_group = e_type_group_from_kind(r_type_kind); - E_TypeKey r_type_promoted = e_type_promote(r_type); + E_TypeKey r_type_promoted = e_type_key_promote(r_type); RDI_EvalOp op = e_opcode_from_expr_kind(kind); e_msg_list_concat_in_place(&result.msgs, &r_tree.msgs); @@ -1245,7 +1238,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *root_expr) // rjf: unpack operand E_Expr *r_expr = expr->first; E_IRTreeAndType r_tree = e_irtree_and_type_from_expr(arena, r_expr); - E_TypeKey r_type = e_type_unwrap(r_tree.type_key); + E_TypeKey r_type = e_type_key_unwrap(r_tree.type_key, E_TypeUnwrapFlag_AllDecorative); E_TypeKind r_type_kind = e_type_kind_from_key(r_type); RDI_EvalTypeGroup r_type_group = e_type_group_from_kind(r_type_kind); E_TypeKey r_type_promoted = e_type_key_basic(E_TypeKind_Bool); @@ -1303,8 +1296,8 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *root_expr) E_IRTreeAndType r_tree = e_irtree_and_type_from_expr(arena, r_expr); e_msg_list_concat_in_place(&result.msgs, &l_tree.msgs); e_msg_list_concat_in_place(&result.msgs, &r_tree.msgs); - E_TypeKey l_type = e_type_unwrap_enum(e_type_unwrap(l_tree.type_key)); - E_TypeKey r_type = e_type_unwrap_enum(e_type_unwrap(r_tree.type_key)); + E_TypeKey l_type = e_type_key_unwrap(l_tree.type_key, E_TypeUnwrapFlag_AllDecorative); + E_TypeKey r_type = e_type_key_unwrap(r_tree.type_key, E_TypeUnwrapFlag_AllDecorative); E_TypeKind l_type_kind = e_type_kind_from_key(l_type); E_TypeKind r_type_kind = e_type_kind_from_key(r_type); if(l_type.kind == E_TypeKeyKind_Reg) @@ -1359,8 +1352,8 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *root_expr) } if(l_is_pointer_like && r_is_pointer_like) { - E_TypeKey l_type_direct = e_type_unwrap(e_type_direct_from_key(e_type_unwrap(l_type))); - E_TypeKey r_type_direct = e_type_unwrap(e_type_direct_from_key(e_type_unwrap(r_type))); + E_TypeKey l_type_direct = e_type_key_unwrap(l_type, E_TypeUnwrapFlag_All); + E_TypeKey r_type_direct = e_type_key_unwrap(r_type, E_TypeUnwrapFlag_All); U64 l_type_direct_byte_size = e_type_byte_size_from_key(l_type_direct); U64 r_type_direct_byte_size = e_type_byte_size_from_key(r_type_direct); if(l_type_direct_byte_size == r_type_direct_byte_size) @@ -1424,7 +1417,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *root_expr) } // rjf: unpack type - E_TypeKey direct_type = e_type_unwrap(e_type_direct_from_key(e_type_unwrap(ptr_tree->type_key))); + E_TypeKey direct_type = e_type_key_unwrap(ptr_tree->type_key, E_TypeUnwrapFlag_All); U64 direct_type_size = e_type_byte_size_from_key(direct_type); // rjf: generate @@ -1457,7 +1450,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *root_expr) case E_ArithPath_PtrSub: { // rjf: unpack type - E_TypeKey direct_type = e_type_unwrap(e_type_direct_from_key(e_type_unwrap(l_type))); + E_TypeKey direct_type = e_type_key_unwrap(l_type, E_TypeUnwrapFlag_All); U64 direct_type_size = e_type_byte_size_from_key(direct_type); // rjf: generate @@ -1529,9 +1522,9 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *root_expr) e_msg_list_concat_in_place(&result.msgs, &c_tree.msgs); e_msg_list_concat_in_place(&result.msgs, &l_tree.msgs); e_msg_list_concat_in_place(&result.msgs, &r_tree.msgs); - E_TypeKey c_type = e_type_unwrap(c_tree.type_key); - E_TypeKey l_type = e_type_unwrap(l_tree.type_key); - E_TypeKey r_type = e_type_unwrap(r_tree.type_key); + E_TypeKey c_type = e_type_key_unwrap(c_tree.type_key, E_TypeUnwrapFlag_AllDecorative); + E_TypeKey l_type = e_type_key_unwrap(l_tree.type_key, E_TypeUnwrapFlag_AllDecorative); + E_TypeKey r_type = e_type_key_unwrap(r_tree.type_key, E_TypeUnwrapFlag_AllDecorative); E_TypeKind c_type_kind = e_type_kind_from_key(c_type); E_TypeKind l_type_kind = e_type_kind_from_key(l_type); E_TypeKind r_type_kind = e_type_kind_from_key(r_type); @@ -1603,7 +1596,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *root_expr) } else { - result.type_key = e_type_unwrap(result.type_key); + result.type_key = e_type_key_unwrap(result.type_key, E_TypeUnwrapFlag_Lenses); } } } @@ -1646,7 +1639,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *root_expr) else { result = e_irtree_and_type_from_expr(arena, lhs->next); - result.type_key = e_type_unwrap(result.type_key); + result.type_key = e_type_key_unwrap(result.type_key, E_TypeUnwrapFlag_Lenses); } } @@ -2268,7 +2261,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *root_expr) E_IRTreeAndType irtree_stripped = result; if(type->kind == E_TypeKind_Lens) { - irtree_stripped.type_key = e_type_direct_from_key(irtree_stripped.type_key); + irtree_stripped.type_key = e_type_key_direct(irtree_stripped.type_key); } E_IRExt ext = type->irext(arena, expr, &irtree_stripped); result.user_data = ext.user_data; diff --git a/src/eval/eval_types.c b/src/eval/eval_types.c index a84bf0ef..4db7e20d 100644 --- a/src/eval/eval_types.c +++ b/src/eval/eval_types.c @@ -562,7 +562,7 @@ e_type_key_match(E_TypeKey l, E_TypeKey r) return result; } -//- rjf: key -> info extraction +//- rjf: type key -> info extraction internal U64 e_hash_from_type(E_Type *type) @@ -627,6 +627,48 @@ e_type_kind_from_key(E_TypeKey key) return kind; } +internal U64 +e_type_byte_size_from_key(E_TypeKey key) +{ + ProfBeginFunction(); + U64 result = 0; + switch(key.kind) + { + default:{}break; + case E_TypeKeyKind_Basic: + { + E_TypeKind kind = (E_TypeKind)key.u32[0]; + result = e_type_kind_basic_byte_size_table[kind]; + }break; + case E_TypeKeyKind_Ext: + { + U64 type_node_idx = key.u32[1]; + U32 rdi_idx = key.u32[2]; + RDI_Parsed *rdi = e_type_state->ctx->modules[rdi_idx].rdi; + RDI_TypeNode *rdi_type = rdi_element_from_name_idx(rdi, TypeNodes, type_node_idx); + result = rdi_type->byte_size; + }break; + case E_TypeKeyKind_Cons: + { + U64 key_hash = e_hash_from_string(5381, str8_struct(&key)); + U64 key_slot_idx = key_hash%e_type_state->cons_key_slots_count; + E_ConsTypeSlot *key_slot = &e_type_state->cons_key_slots[key_slot_idx]; + for(E_ConsTypeNode *node = key_slot->first; + node != 0; + node = node->key_next) + { + if(e_type_key_match(node->key, key)) + { + result = node->byte_size; + break; + } + } + }break; + } + ProfEnd(); + return result; +} + internal E_Type * e_type_from_key(Arena *arena, E_TypeKey key) { @@ -1201,287 +1243,6 @@ e_type_from_key(Arena *arena, E_TypeKey key) return type; } -internal U64 -e_type_byte_size_from_key(E_TypeKey key) -{ - ProfBeginFunction(); - U64 result = 0; - switch(key.kind) - { - default:{}break; - case E_TypeKeyKind_Basic: - { - E_TypeKind kind = (E_TypeKind)key.u32[0]; - result = e_type_kind_basic_byte_size_table[kind]; - }break; - case E_TypeKeyKind_Ext: - { - U64 type_node_idx = key.u32[1]; - U32 rdi_idx = key.u32[2]; - RDI_Parsed *rdi = e_type_state->ctx->modules[rdi_idx].rdi; - RDI_TypeNode *rdi_type = rdi_element_from_name_idx(rdi, TypeNodes, type_node_idx); - result = rdi_type->byte_size; - }break; - case E_TypeKeyKind_Cons: - { - U64 key_hash = e_hash_from_string(5381, str8_struct(&key)); - U64 key_slot_idx = key_hash%e_type_state->cons_key_slots_count; - E_ConsTypeSlot *key_slot = &e_type_state->cons_key_slots[key_slot_idx]; - for(E_ConsTypeNode *node = key_slot->first; - node != 0; - node = node->key_next) - { - if(e_type_key_match(node->key, key)) - { - result = node->byte_size; - break; - } - } - }break; - } - ProfEnd(); - return result; -} - -internal E_TypeKey -e_type_direct_from_key(E_TypeKey key) -{ - E_TypeKey result = zero_struct; - switch(key.kind) - { - default:{}break; - case E_TypeKeyKind_Ext: - case E_TypeKeyKind_Cons: - { - E_Type *type = e_type_from_key__cached(key); - result = type->direct_type_key; - }break; - } - return result; -} - -internal E_TypeKey -e_type_owner_from_key(E_TypeKey key) -{ - E_TypeKey result = zero_struct; - switch(key.kind) - { - default:{}break; - case E_TypeKeyKind_Ext: - case E_TypeKeyKind_Cons: - { - E_Type *type = e_type_from_key__cached(key); - result = type->owner_type_key; - }break; - } - return result; -} - -internal E_TypeKey -e_type_ptee_from_key(E_TypeKey key) -{ - E_TypeKey result = key; - B32 passed_ptr = 0; - for(;;) - { - E_TypeKind kind = e_type_kind_from_key(result); - result = e_type_direct_from_key(result); - if(kind == E_TypeKind_Ptr || kind == E_TypeKind_LRef || kind == E_TypeKind_RRef) - { - passed_ptr = 1; - } - E_TypeKind next_kind = e_type_kind_from_key(result); - if(passed_ptr && - next_kind != E_TypeKind_IncompleteStruct && - next_kind != E_TypeKind_IncompleteUnion && - next_kind != E_TypeKind_IncompleteEnum && - next_kind != E_TypeKind_IncompleteClass && - next_kind != E_TypeKind_Alias && - next_kind != E_TypeKind_Modifier) - { - break; - } - if(kind == E_TypeKind_Null) - { - break; - } - } - return result; -} - -internal E_TypeKey -e_type_unwrap_enum(E_TypeKey key) -{ - E_TypeKey result = key; - for(B32 good = 1; good;) - { - E_TypeKind kind = e_type_kind_from_key(result); - if(kind == E_TypeKind_Enum) - { - result = e_type_direct_from_key(result); - } - else - { - good = 0; - } - } - return result; -} - -internal E_TypeKey -e_type_unwrap(E_TypeKey key) -{ - E_TypeKey result = key; - for(B32 good = 1; good;) - { - E_TypeKind kind = e_type_kind_from_key(result); - if((E_TypeKind_FirstIncomplete <= kind && kind <= E_TypeKind_LastIncomplete) || - kind == E_TypeKind_Modifier || - kind == E_TypeKind_Alias || - kind == E_TypeKind_Lens || - kind == E_TypeKind_MetaExpr) - { - result = e_type_direct_from_key(result); - } - else - { - good = 0; - } - } - return result; -} - -internal E_TypeKey -e_type_promote(E_TypeKey key) -{ - E_TypeKey result = key; - E_TypeKind kind = e_type_kind_from_key(key); - if(kind == E_TypeKind_Bool || - kind == E_TypeKind_S8 || - kind == E_TypeKind_S16 || - kind == E_TypeKind_U8 || - kind == E_TypeKind_U16) - { - result = e_type_key_basic(E_TypeKind_S32); - } - return result; -} - -internal B32 -e_type_match(E_TypeKey l, E_TypeKey r) -{ - // rjf: unpack parameters - E_TypeKey lu = e_type_unwrap(l); - E_TypeKey ru = e_type_unwrap(r); - - // rjf: exact key matches -> match - B32 result = e_type_key_match(lu, ru); - - // rjf: if keys don't match, type *contents* could still match, - // so we need to unpack the type info & compare - if(!result) - { - E_TypeKind luk = e_type_kind_from_key(lu); - E_TypeKind ruk = e_type_kind_from_key(ru); - if(luk == ruk) - { - switch(luk) - { - default: - { - result = 1; - }break; - - case E_TypeKind_Ptr: - case E_TypeKind_LRef: - case E_TypeKind_RRef: - { - E_TypeKey lud = e_type_direct_from_key(lu); - E_TypeKey rud = e_type_direct_from_key(ru); - result = e_type_match(lud, rud); - }break; - - case E_TypeKind_MemberPtr: - { - E_TypeKey lud = e_type_direct_from_key(lu); - E_TypeKey rud = e_type_direct_from_key(ru); - E_TypeKey luo = e_type_owner_from_key(lu); - E_TypeKey ruo = e_type_owner_from_key(ru); - result = (e_type_match(lud, rud) && e_type_match(luo, ruo)); - }break; - - case E_TypeKind_Array: - { - E_Type *lt = e_type_from_key__cached(l); - E_Type *rt = e_type_from_key__cached(r); - if(lt->count == rt->count && e_type_match(lt->direct_type_key, rt->direct_type_key)) - { - result = 1; - } - }break; - - case E_TypeKind_Function: - { - E_Type *lt = e_type_from_key__cached(l); - E_Type *rt = e_type_from_key__cached(r); - if(lt->count == rt->count && e_type_match(lt->direct_type_key, rt->direct_type_key)) - { - B32 params_match = 1; - E_TypeKey *lp = lt->param_type_keys; - E_TypeKey *rp = rt->param_type_keys; - U64 count = lt->count; - for(U64 i = 0; i < count; i += 1, lp += 1, rp += 1) - { - if(!e_type_match(*lp, *rp)) - { - params_match = 0; - break; - } - } - result = params_match; - } - }break; - - case E_TypeKind_Method: - { - E_Type *lt = e_type_from_key__cached(l); - E_Type *rt = e_type_from_key__cached(r); - if(lt->count == rt->count && - e_type_match(lt->direct_type_key, rt->direct_type_key) && - e_type_match(lt->owner_type_key, rt->owner_type_key)) - { - B32 params_match = 1; - E_TypeKey *lp = lt->param_type_keys; - E_TypeKey *rp = rt->param_type_keys; - U64 count = lt->count; - for(U64 i = 0; i < count; i += 1, lp += 1, rp += 1) - { - if(!e_type_match(*lp, *rp)) - { - params_match = 0; - break; - } - } - result = params_match; - } - }break; - } - } - } - - return result; -} - -internal E_Member * -e_type_member_copy(Arena *arena, E_Member *src) -{ - E_Member *dst = push_array(arena, E_Member, 1); - MemoryCopyStruct(dst, src); - dst->name = push_str8_copy(arena, src->name); - dst->inheritance_key_chain = e_type_key_list_copy(arena, &src->inheritance_key_chain); - return dst; -} - internal int e_type_qsort_compare_members_offset(E_Member *a, E_Member *b) { @@ -1641,23 +1402,204 @@ e_type_data_members_from_key(Arena *arena, E_TypeKey key) return members; } -internal E_Member * -e_type_member_from_array_name(E_MemberArray *members, String8 name) +//- rjf: type key traversal + +internal E_TypeKey +e_type_key_direct(E_TypeKey key) { - E_Member *member = 0; - for(U64 idx = 0; idx < members->count; idx += 1) + E_TypeKey result = zero_struct; + switch(key.kind) { - if((members->v[idx].kind == E_MemberKind_DataField || - members->v[idx].kind == E_MemberKind_Padding) && - str8_match(members->v[idx].name, name, 0)) + default:{}break; + case E_TypeKeyKind_Ext: + case E_TypeKeyKind_Cons: + { + E_Type *type = e_type_from_key__cached(key); + result = type->direct_type_key; + }break; + } + return result; +} + +internal E_TypeKey +e_type_key_owner(E_TypeKey key) +{ + E_TypeKey result = zero_struct; + switch(key.kind) + { + default:{}break; + case E_TypeKeyKind_Ext: + case E_TypeKeyKind_Cons: + { + E_Type *type = e_type_from_key__cached(key); + result = type->owner_type_key; + }break; + } + return result; +} + +internal E_TypeKey +e_type_key_promote(E_TypeKey key) +{ + E_TypeKey result = key; + E_TypeKind kind = e_type_kind_from_key(key); + if(kind == E_TypeKind_Bool || + kind == E_TypeKind_S8 || + kind == E_TypeKind_S16 || + kind == E_TypeKind_U8 || + kind == E_TypeKind_U16) + { + result = e_type_key_basic(E_TypeKind_S32); + } + return result; +} + +internal E_TypeKey +e_type_key_unwrap(E_TypeKey key, E_TypeUnwrapFlags flags) +{ + E_TypeKey result = key; + E_TypeKind kind = e_type_kind_from_key(result); + B32 did_ptr = 0; + for(;;) + { + B32 done = 0; + switch(kind) + { + default:{done = 1;}break; + case E_TypeKind_Modifier: {done = !(flags & E_TypeUnwrapFlag_Modifiers);}break; + case E_TypeKind_Lens: {done = !(flags & E_TypeUnwrapFlag_Lenses);}break; + case E_TypeKind_MetaExpr: {done = !(flags & E_TypeUnwrapFlag_Meta);}break; + case E_TypeKind_Enum: {done = !(flags & E_TypeUnwrapFlag_Enums);}break; + case E_TypeKind_Alias: {done = !(flags & E_TypeUnwrapFlag_Aliases);}break; + case E_TypeKind_Array: + case E_TypeKind_Ptr: + case E_TypeKind_RRef: + case E_TypeKind_LRef: + case E_TypeKind_MemberPtr: + { + done = (did_ptr || !(flags & E_TypeUnwrapFlag_Pointers)); + did_ptr = 1; + }break; + } + if(done) { - member = &members->v[idx]; break; } + result = e_type_key_direct(result); + kind = e_type_kind_from_key(result); } - return member; + return result; } +//- rjf: type comparisons + +internal B32 +e_type_match(E_TypeKey l, E_TypeKey r) +{ + // rjf: unpack parameters + E_TypeKey lu = e_type_key_unwrap(l, E_TypeUnwrapFlag_AllDecorative); + E_TypeKey ru = e_type_key_unwrap(r, E_TypeUnwrapFlag_AllDecorative); + + // rjf: exact key matches -> match + B32 result = e_type_key_match(lu, ru); + + // rjf: if keys don't match, type *contents* could still match, + // so we need to unpack the type info & compare + if(!result) + { + E_TypeKind luk = e_type_kind_from_key(lu); + E_TypeKind ruk = e_type_kind_from_key(ru); + if(luk == ruk) + { + switch(luk) + { + default: + { + result = 1; + }break; + + case E_TypeKind_Ptr: + case E_TypeKind_LRef: + case E_TypeKind_RRef: + { + E_TypeKey lud = e_type_key_direct(lu); + E_TypeKey rud = e_type_key_direct(ru); + result = e_type_match(lud, rud); + }break; + + case E_TypeKind_MemberPtr: + { + E_TypeKey lud = e_type_key_direct(lu); + E_TypeKey rud = e_type_key_direct(ru); + E_TypeKey luo = e_type_key_owner(lu); + E_TypeKey ruo = e_type_key_owner(ru); + result = (e_type_match(lud, rud) && e_type_match(luo, ruo)); + }break; + + case E_TypeKind_Array: + { + E_Type *lt = e_type_from_key__cached(l); + E_Type *rt = e_type_from_key__cached(r); + if(lt->count == rt->count && e_type_match(lt->direct_type_key, rt->direct_type_key)) + { + result = 1; + } + }break; + + case E_TypeKind_Function: + { + E_Type *lt = e_type_from_key__cached(l); + E_Type *rt = e_type_from_key__cached(r); + if(lt->count == rt->count && e_type_match(lt->direct_type_key, rt->direct_type_key)) + { + B32 params_match = 1; + E_TypeKey *lp = lt->param_type_keys; + E_TypeKey *rp = rt->param_type_keys; + U64 count = lt->count; + for(U64 i = 0; i < count; i += 1, lp += 1, rp += 1) + { + if(!e_type_match(*lp, *rp)) + { + params_match = 0; + break; + } + } + result = params_match; + } + }break; + + case E_TypeKind_Method: + { + E_Type *lt = e_type_from_key__cached(l); + E_Type *rt = e_type_from_key__cached(r); + if(lt->count == rt->count && + e_type_match(lt->direct_type_key, rt->direct_type_key) && + e_type_match(lt->owner_type_key, rt->owner_type_key)) + { + B32 params_match = 1; + E_TypeKey *lp = lt->param_type_keys; + E_TypeKey *rp = rt->param_type_keys; + U64 count = lt->count; + for(U64 i = 0; i < count; i += 1, lp += 1, rp += 1) + { + if(!e_type_match(*lp, *rp)) + { + params_match = 0; + break; + } + } + result = params_match; + } + }break; + } + } + } + + return result; +} + +//- rjf: key -> string + internal void e_type_lhs_string_from_key(Arena *arena, E_TypeKey key, String8List *out, U32 prec, B32 skip_return) { @@ -1722,7 +1664,7 @@ e_type_lhs_string_from_key(Arena *arena, E_TypeKey key, String8List *out, U32 pr case E_TypeKind_Array: { - E_TypeKey direct = e_type_direct_from_key(key); + E_TypeKey direct = e_type_key_direct(key); e_type_lhs_string_from_key(arena, direct, out, 2, skip_return); if(prec == 1) { @@ -1734,7 +1676,7 @@ e_type_lhs_string_from_key(Arena *arena, E_TypeKey key, String8List *out, U32 pr { if(!skip_return) { - E_TypeKey direct = e_type_direct_from_key(key); + E_TypeKey direct = e_type_key_direct(key); e_type_lhs_string_from_key(arena, direct, out, 2, 0); } if(prec == 1) @@ -1747,7 +1689,7 @@ e_type_lhs_string_from_key(Arena *arena, E_TypeKey key, String8List *out, U32 pr { E_Type *type = e_type_from_key__cached(key); str8_list_pushf(arena, out, "%S(", type->name); - E_TypeKey direct = e_type_direct_from_key(key); + E_TypeKey direct = e_type_key_direct(key); String8 direct_string = e_type_string_from_key(arena, direct); str8_list_push(arena, out, direct_string); for EachIndex(idx, type->count) @@ -1761,7 +1703,7 @@ e_type_lhs_string_from_key(Arena *arena, E_TypeKey key, String8List *out, U32 pr case E_TypeKind_Ptr: { - E_TypeKey direct = e_type_direct_from_key(key); + E_TypeKey direct = e_type_key_direct(key); e_type_lhs_string_from_key(arena, direct, out, 1, skip_return); str8_list_push(arena, out, str8_lit("*")); E_Type *type = e_type_from_key__cached(key); @@ -1773,14 +1715,14 @@ e_type_lhs_string_from_key(Arena *arena, E_TypeKey key, String8List *out, U32 pr case E_TypeKind_LRef: { - E_TypeKey direct = e_type_direct_from_key(key); + E_TypeKey direct = e_type_key_direct(key); e_type_lhs_string_from_key(arena, direct, out, 1, skip_return); str8_list_push(arena, out, str8_lit("&")); }break; case E_TypeKind_RRef: { - E_TypeKey direct = e_type_direct_from_key(key); + E_TypeKey direct = e_type_key_direct(key); e_type_lhs_string_from_key(arena, direct, out, 1, skip_return); str8_list_push(arena, out, str8_lit("&&")); }break; @@ -1804,7 +1746,7 @@ e_type_lhs_string_from_key(Arena *arena, E_TypeKey key, String8List *out, U32 pr case E_TypeKind_MetaExpr: { - E_TypeKey direct = e_type_direct_from_key(key); + E_TypeKey direct = e_type_key_direct(key); e_type_lhs_string_from_key(arena, direct, out, prec, skip_return); }break; } @@ -1820,7 +1762,7 @@ e_type_rhs_string_from_key(Arena *arena, E_TypeKey key, String8List *out, U32 pr case E_TypeKind_Bitfield: { - E_TypeKey direct = e_type_direct_from_key(key); + E_TypeKey direct = e_type_key_direct(key); e_type_rhs_string_from_key(arena, direct, out, prec); }break; @@ -1830,7 +1772,7 @@ e_type_rhs_string_from_key(Arena *arena, E_TypeKey key, String8List *out, U32 pr case E_TypeKind_RRef: case E_TypeKind_MemberPtr: { - E_TypeKey direct = e_type_direct_from_key(key); + E_TypeKey direct = e_type_key_direct(key); e_type_rhs_string_from_key(arena, direct, out, 1); }break; @@ -1845,7 +1787,7 @@ e_type_rhs_string_from_key(Arena *arena, E_TypeKey key, String8List *out, U32 pr str8_list_push(arena, out, str8_lit("[")); str8_list_push(arena, out, count_str); str8_list_push(arena, out, str8_lit("]")); - E_TypeKey direct = e_type_direct_from_key(key); + E_TypeKey direct = e_type_key_direct(key); e_type_rhs_string_from_key(arena, direct, out, 2); }break; @@ -1878,13 +1820,13 @@ e_type_rhs_string_from_key(Arena *arena, E_TypeKey key, String8List *out, U32 pr } str8_list_push(arena, out, str8_lit(")")); } - E_TypeKey direct = e_type_direct_from_key(key); + E_TypeKey direct = e_type_key_direct(key); e_type_rhs_string_from_key(arena, direct, out, 2); }break; case E_TypeKind_MetaExpr: { - E_TypeKey direct = e_type_direct_from_key(key); + E_TypeKey direct = e_type_key_direct(key); e_type_rhs_string_from_key(arena, direct, out, prec); }break; } @@ -1910,7 +1852,7 @@ e_default_expansion_type_from_key(E_TypeKey root_key) B32 hit_1ptr = 0; for(E_TypeKey key = root_key; !e_type_key_match(e_type_key_zero(), key); - key = e_type_direct_from_key(key)) + key = e_type_key_direct(key)) { B32 done = 1; E_TypeKind kind = e_type_kind_from_key(key); @@ -2388,21 +2330,8 @@ E_TYPE_IREXT_FUNCTION_DEF(slice) { Temp scratch = scratch_begin(&arena, 1); - // rjf: unpack struct type - E_TypeKey struct_type_key = e_type_unwrap(irtree->type_key); - for(;;) - { - if(e_type_kind_is_pointer_or_ref(e_type_kind_from_key(struct_type_key))) - { - struct_type_key = e_type_unwrap(e_type_direct_from_key(struct_type_key)); - } - else - { - break; - } - } - // rjf: build info from struct type + E_TypeKey struct_type_key = e_type_key_unwrap(irtree->type_key, E_TypeUnwrapFlag_All); E_TypeKind type_kind = e_type_kind_from_key(struct_type_key); if(type_kind == E_TypeKind_Struct || type_kind == E_TypeKind_Class) { @@ -2416,7 +2345,7 @@ E_TYPE_IREXT_FUNCTION_DEF(slice) for(U64 idx = 0; idx < members.count; idx += 1) { E_Member *member = &members.v[idx]; - E_TypeKey member_type = e_type_unwrap(member->type_key); + E_TypeKey member_type = e_type_key_unwrap(member->type_key, E_TypeUnwrapFlag_AllDecorative); E_TypeKind member_type_kind = e_type_kind_from_key(member_type); if(count_member == 0 && e_type_kind_is_integer(member_type_kind)) { @@ -2479,7 +2408,7 @@ E_TYPE_IREXT_FUNCTION_DEF(slice) E_TypeKey element_type_key = zero_struct; if(base_ptr_member != 0) { - element_type_key = e_type_direct_from_key(base_ptr_member->type_key); + element_type_key = e_type_key_direct(base_ptr_member->type_key); } // rjf: if no count, but base/opl, swap base/opl if needed, and measure count diff --git a/src/eval/eval_types.h b/src/eval/eval_types.h index c606c1be..bdc52766 100644 --- a/src/eval/eval_types.h +++ b/src/eval/eval_types.h @@ -29,6 +29,22 @@ struct E_String2TypeKeyMap E_String2TypeKeySlot *slots; }; +//////////////////////////////// +//~ rjf: Type Unwrapping + +typedef U32 E_TypeUnwrapFlags; +enum +{ + E_TypeUnwrapFlag_Modifiers = (1<<0), + E_TypeUnwrapFlag_Pointers = (1<<1), + E_TypeUnwrapFlag_Lenses = (1<<2), + E_TypeUnwrapFlag_Meta = (1<<3), + E_TypeUnwrapFlag_Enums = (1<<4), + E_TypeUnwrapFlag_Aliases = (1<<5), + E_TypeUnwrapFlag_All = 0xffffffff, + E_TypeUnwrapFlag_AllDecorative = (E_TypeUnwrapFlag_All & ~E_TypeUnwrapFlag_Pointers) +}; + //////////////////////////////// //~ rjf: Evaluation Context @@ -245,22 +261,24 @@ internal E_TypeKey e_type_key_folder(void); //- rjf: basic type key functions internal B32 e_type_key_match(E_TypeKey l, E_TypeKey r); -//- rjf: key -> info extraction +//- rjf: type key -> info extraction internal U64 e_hash_from_type(E_Type *type); internal E_TypeKind e_type_kind_from_key(E_TypeKey key); internal U64 e_type_byte_size_from_key(E_TypeKey key); internal E_Type *e_type_from_key(Arena *arena, E_TypeKey key); -internal E_TypeKey e_type_direct_from_key(E_TypeKey key); -internal E_TypeKey e_type_owner_from_key(E_TypeKey key); -internal E_TypeKey e_type_ptee_from_key(E_TypeKey key); -internal E_TypeKey e_type_unwrap_enum(E_TypeKey key); -internal E_TypeKey e_type_unwrap(E_TypeKey key); -internal E_TypeKey e_type_promote(E_TypeKey key); -internal B32 e_type_match(E_TypeKey l, E_TypeKey r); -internal E_Member *e_type_member_copy(Arena *arena, E_Member *src); internal int e_type_qsort_compare_members_offset(E_Member *a, E_Member *b); internal E_MemberArray e_type_data_members_from_key(Arena *arena, E_TypeKey key); -internal E_Member *e_type_member_from_array_name(E_MemberArray *members, String8 name); + +//- rjf: type key traversal +internal E_TypeKey e_type_key_direct(E_TypeKey key); +internal E_TypeKey e_type_key_owner(E_TypeKey key); +internal E_TypeKey e_type_key_promote(E_TypeKey key); +internal E_TypeKey e_type_key_unwrap(E_TypeKey key, E_TypeUnwrapFlags flags); + +//- rjf: type comparisons +internal B32 e_type_match(E_TypeKey l, E_TypeKey r); + +//- rjf: type key -> string internal void e_type_lhs_string_from_key(Arena *arena, E_TypeKey key, String8List *out, U32 prec, B32 skip_return); internal void e_type_rhs_string_from_key(Arena *arena, E_TypeKey key, String8List *out, U32 prec); internal String8 e_type_string_from_key(Arena *arena, E_TypeKey key); diff --git a/src/eval_visualization/eval_visualization_core.c b/src/eval_visualization/eval_visualization_core.c index d22ca1a3..ee581c25 100644 --- a/src/eval_visualization/eval_visualization_core.c +++ b/src/eval_visualization/eval_visualization_core.c @@ -105,7 +105,7 @@ ev_type_key_is_editable(E_TypeKey type_key) { B32 result = 0; B32 done = 0; - for(E_TypeKey t = type_key; !result && !done; t = e_type_direct_from_key(t)) + for(E_TypeKey t = type_key; !result && !done; t = e_type_key_direct(t)) { E_TypeKind kind = e_type_kind_from_key(t); switch(kind) @@ -132,7 +132,7 @@ ev_type_key_is_editable(E_TypeKey type_key) } else { - E_TypeKind element_kind = e_type_kind_from_key(e_type_unwrap(e_type_direct_from_key(e_type_unwrap(t)))); + E_TypeKind element_kind = e_type_kind_from_key(e_type_key_unwrap(t, E_TypeUnwrapFlag_All)); result = (element_kind == E_TypeKind_U8 || element_kind == E_TypeKind_U16 || element_kind == E_TypeKind_U32 || @@ -403,7 +403,7 @@ ev_expand_rule_from_type_key(E_TypeKey type_key) { E_TypeKey k = type_key; E_TypeKind kind = e_type_kind_from_key(k); - for(;kind == E_TypeKind_Lens; k = e_type_direct_from_key(k), kind = e_type_kind_from_key(k)) + for(;kind == E_TypeKind_Lens; k = e_type_key_direct(k), kind = e_type_kind_from_key(k)) { E_Type *type = e_type_from_key__cached(k); EV_ExpandRule *candidate = ev_expand_rule_from_string(type->name); @@ -430,7 +430,7 @@ ev_resolved_from_expr(Arena *arena, E_Expr *expr) E_Eval eval = e_eval_from_expr(scratch.arena, expr); E_TypeKey type_key = eval.type_key; E_TypeKind type_kind = e_type_kind_from_key(type_key); - E_TypeKey ptee_type_key = e_type_unwrap(e_type_direct_from_key(e_type_unwrap(type_key))); + E_TypeKey ptee_type_key = e_type_unwrap(e_type_key_direct(e_type_unwrap(type_key))); E_TypeKind ptee_type_kind = e_type_kind_from_key(ptee_type_key); if(ptee_type_kind == E_TypeKind_Struct || ptee_type_kind == E_TypeKind_Class) { @@ -1287,7 +1287,7 @@ internal String8 ev_string_from_simple_typed_eval(Arena *arena, EV_StringParams *params, E_Eval eval) { String8 result = {0}; - E_TypeKey type_key = e_type_unwrap(eval.irtree.type_key); + E_TypeKey type_key = e_type_key_unwrap(eval.irtree.type_key, E_TypeUnwrapFlag_AllDecorative & ~E_TypeUnwrapFlag_Enums); E_TypeKind type_kind = e_type_kind_from_key(type_key); U64 type_byte_size = e_type_byte_size_from_key(type_key); U8 digit_group_separator = 0; @@ -1598,7 +1598,7 @@ ev_string_iter_next(Arena *arena, EV_StringIter *it, String8 *out_string) need_pop = 1; new_task.params = lens_params; new_task.eval = eval; - new_task.eval.irtree.type_key = e_type_direct_from_key(eval.irtree.type_key); + new_task.eval.irtree.type_key = e_type_key_direct(eval.irtree.type_key); } else if(type->expand.info != 0) { @@ -1614,7 +1614,7 @@ ev_string_iter_next(Arena *arena, EV_StringIter *it, String8 *out_string) need_pop = 1; new_task.params = lens_params; new_task.eval = eval; - new_task.eval.irtree.type_key = e_type_direct_from_key(eval.irtree.type_key); + new_task.eval.irtree.type_key = e_type_key_direct(eval.irtree.type_key); #if 0 // NOTE(rjf): will explicitly visualize lenses in value strings. does not seem useful for now? switch(task_idx) { @@ -1643,7 +1643,7 @@ ev_string_iter_next(Arena *arena, EV_StringIter *it, String8 *out_string) need_pop = 0; new_task.params = *params; new_task.eval = eval; - new_task.eval.irtree.type_key = e_type_direct_from_key(eval.irtree.type_key); + new_task.eval.irtree.type_key = e_type_key_direct(eval.irtree.type_key); scratch_end(scratch); }break; @@ -1669,16 +1669,17 @@ ev_string_iter_next(Arena *arena, EV_StringIter *it, String8 *out_string) default:{}break; case 0: { + E_Type *type = e_type_from_key__cached(type_key); + *out_string = push_str8f(arena, "%S (", type->name); need_pop = 0; need_new_task = 1; new_task.params = *params; new_task.eval = eval; - new_task.eval.irtree.type_key = e_type_direct_from_key(eval.irtree.type_key); + new_task.eval.irtree.type_key = e_type_key_direct(eval.irtree.type_key); }break; case 1: { - E_Type *type = e_type_from_key__cached(type_key); - *out_string = push_str8f(arena, " (%S)", type->name); + *out_string = str8_lit(")"); }break; } } @@ -1698,7 +1699,7 @@ ev_string_iter_next(Arena *arena, EV_StringIter *it, String8 *out_string) need_new_task = 1; new_task.params = *params; new_task.eval = eval; - new_task.eval.irtree.type_key = e_type_direct_from_key(eval.irtree.type_key); + new_task.eval.irtree.type_key = e_type_key_direct(eval.irtree.type_key); }break; ////////////////////////// @@ -1733,7 +1734,7 @@ ev_string_iter_next(Arena *arena, EV_StringIter *it, String8 *out_string) ptr_data = it->top_task->user_data = push_array(arena, EV_StringPtrData, 1); ptr_data->value_eval = e_value_eval_from_eval(eval); ptr_data->type = e_type_from_key__cached(type_key); - ptr_data->direct_type = e_type_from_key__cached(e_type_unwrap(e_type_direct_from_key(e_type_unwrap(type_key)))); + ptr_data->direct_type = e_type_from_key__cached(e_type_key_unwrap(type_key, E_TypeUnwrapFlag_All)); ptr_data->ptee_has_content = (ptr_data->value_eval.value.u64 != 0 && ptr_data->direct_type->kind != E_TypeKind_Null && ptr_data->direct_type->kind != E_TypeKind_Void); ptr_data->ptee_has_string = ((E_TypeKind_Char8 <= ptr_data->direct_type->kind && ptr_data->direct_type->kind <= E_TypeKind_UChar32) || ptr_data->direct_type->kind == E_TypeKind_S8 || diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index e54c48c1..3be74495 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -1915,9 +1915,9 @@ rd_commit_eval_value_string(E_Eval dst_eval, String8 string) Temp scratch = scratch_begin(0, 0); //- rjf: unpack type of destination - E_TypeKey type_key = e_type_unwrap(dst_eval.irtree.type_key); + E_TypeKey type_key = e_type_key_unwrap(dst_eval.irtree.type_key, E_TypeUnwrapFlag_AllDecorative); E_TypeKind type_kind = e_type_kind_from_key(type_key); - E_TypeKey direct_type_key = e_type_unwrap(e_type_direct_from_key(e_type_unwrap(dst_eval.irtree.type_key))); + E_TypeKey direct_type_key = e_type_key_unwrap(dst_eval.irtree.type_key, E_TypeUnwrapFlag_All); E_TypeKind direct_type_kind = e_type_kind_from_key(direct_type_key); //- rjf: determine data we'll write @@ -4001,7 +4001,8 @@ rd_view_ui(Rng2F32 rect) RD_WatchViewTextEditState *cell_edit_state = rd_watch_view_text_edit_state_from_pt(ewv, cell_pt); B32 cell_selected = (row_selected && selection_tbl.min.x <= cell_x && cell_x <= selection_tbl.max.x); RD_WatchRowCellInfo cell_info = rd_info_from_watch_row_cell(scratch.arena, row, string_flags, row_info, cell, ui_top_font(), ui_top_font_size(), row_string_max_size_px); - E_Type *cell_type = e_type_from_key__cached(cell_info.eval.irtree.type_key); + E_TypeKey cell_type_key = cell_info.eval.irtree.type_key; + E_Type *cell_type = e_type_from_key__cached(cell_type_key); E_Eval cell_value_eval = e_value_eval_from_eval(cell_info.eval); F32 cell_width_px = cell->px + cell->pct * (dim_2f32(rect).x - floor_f32(ui_top_font_size()*1.5f)); F32 next_cell_x_px = cell_x_px + cell_width_px; @@ -4022,7 +4023,7 @@ rd_view_ui(Rng2F32 rect) E_IRTreeAndType *prev_overridden_irtree = e_ir_state->overridden_irtree; e_ir_state->overridden_irtree = &cell_info.eval.irtree; { - E_TypeKey slider_value_type = e_type_unwrap(cell_type->direct_type_key); + E_TypeKey slider_value_type = e_type_key_unwrap(cell_type->direct_type_key, E_TypeUnwrapFlag_AllDecorative); slider_value_type_kind = e_type_kind_from_key(slider_value_type); E_Expr *min_casted = e_expr_ref_cast(scratch.arena, slider_value_type, min_expr); E_Expr *max_casted = e_expr_ref_cast(scratch.arena, slider_value_type, max_expr); @@ -10774,7 +10775,7 @@ rd_regs_fill_slot_from_string(RD_RegSlot slot, String8 string) E_Eval eval = e_eval_from_string(scratch.arena, string); if(eval.msgs.max_kind == E_MsgKind_Null) { - E_TypeKind eval_type_kind = e_type_kind_from_key(e_type_unwrap(eval.irtree.type_key)); + E_TypeKind eval_type_kind = e_type_kind_from_key(e_type_key_unwrap(eval.irtree.type_key, E_TypeUnwrapFlag_AllDecorative)); if(eval_type_kind == E_TypeKind_Ptr || eval_type_kind == E_TypeKind_LRef || eval_type_kind == E_TypeKind_RRef) diff --git a/src/raddbg/raddbg_eval.c b/src/raddbg/raddbg_eval.c index bc90f40d..325e00db 100644 --- a/src/raddbg/raddbg_eval.c +++ b/src/raddbg/raddbg_eval.c @@ -370,7 +370,7 @@ E_TYPE_ACCESS_FUNCTION_DEF(schema) Temp scratch = scratch_begin(&arena, 1); child_type_key = e_type_key_basic(E_TypeKind_U64); E_Expr *expr = e_parse_expr_from_text(scratch.arena, child->first->string).exprs.first; - if(expr->kind != E_ExprKind_LeafU64) + if(expr->kind != E_ExprKind_LeafU64 && expr != &e_expr_nil) { child_type_key = e_type_key_cons(.kind = E_TypeKind_MetaExpr, .name = child->first->string, .direct_key = child_type_key); } @@ -381,7 +381,7 @@ E_TYPE_ACCESS_FUNCTION_DEF(schema) Temp scratch = scratch_begin(&arena, 1); child_type_key = e_type_key_basic(E_TypeKind_F32); E_Expr *expr = e_parse_expr_from_text(scratch.arena, child->first->string).exprs.first; - if(expr->kind != E_ExprKind_LeafF32 && expr->kind != E_ExprKind_LeafF64) + if(expr->kind != E_ExprKind_LeafF32 && expr->kind != E_ExprKind_LeafF64 && expr != &e_expr_nil) { child_type_key = e_type_key_cons(.kind = E_TypeKind_MetaExpr, .name = child->first->string, .direct_key = child_type_key); } @@ -392,7 +392,7 @@ E_TYPE_ACCESS_FUNCTION_DEF(schema) Temp scratch = scratch_begin(&arena, 1); child_type_key = e_type_key_basic(E_TypeKind_Bool); E_Expr *expr = e_parse_expr_from_text(scratch.arena, child->first->string).exprs.first; - if(expr->kind != E_ExprKind_LeafU64) + if(expr->kind != E_ExprKind_LeafU64 && expr != &e_expr_nil) { child_type_key = e_type_key_cons(.kind = E_TypeKind_MetaExpr, .name = child->first->string, .direct_key = child_type_key); } diff --git a/src/raddbg/raddbg_views.c b/src/raddbg/raddbg_views.c index d39c9a4d..5c6220ee 100644 --- a/src/raddbg/raddbg_views.c +++ b/src/raddbg/raddbg_views.c @@ -1257,7 +1257,7 @@ rd_watch_row_info_from_row(Arena *arena, EV_Row *row) row->eval.space.kind == E_SpaceKind_File) { if(e_type_kind_from_key(row->eval.irtree.type_key) == E_TypeKind_Array && - e_type_kind_from_key(e_type_direct_from_key(row->eval.irtree.type_key)) == E_TypeKind_U8) + e_type_kind_from_key(e_type_key_direct(row->eval.irtree.type_key)) == E_TypeKind_U8) { info.can_expand = 0; }