diff --git a/src/eval/eval_bundles.c b/src/eval/eval_bundles.c index f74fb7f9..98f5c5f7 100644 --- a/src/eval/eval_bundles.c +++ b/src/eval/eval_bundles.c @@ -230,37 +230,31 @@ e_member_eval_from_eval_member_name(E_Eval eval, String8 member_name) { E_Eval result = {0}; { - Temp scratch = scratch_begin(0, 0); - E_MemberArray members = e_type_data_members_from_key(scratch.arena, eval.type_key); - for(U64 member_idx = 0; member_idx < members.count; member_idx += 1) + E_Member member = e_type_member_from_key_name__cached(eval.type_key, member_name); + if(member.kind != E_MemberKind_Null) { - E_Member *member = &members.v[member_idx]; - if(str8_match(member->name, member_name, 0)) + result.mode = eval.mode; + result.space = eval.space; + result.type_key = member.type_key; + result.code = eval.code; + result.msgs = eval.msgs; + switch(eval.mode) { - result.mode = eval.mode; - result.space = eval.space; - result.type_key = member->type_key; - result.code = eval.code; - result.msgs = eval.msgs; - switch(eval.mode) + default:{}break; + case E_Mode_Value: + if(member.off < sizeof(eval.value)) { - default:{}break; - case E_Mode_Value: - if(member->off < sizeof(eval.value)) - { - U64 member_size = e_type_byte_size_from_key(member->type_key); - MemoryCopy((U8 *)(&result.value.u512[0]), - (U8 *)(&eval.value.u512[0]) + member->off, - Min(member_size, sizeof(eval.value) - member->off)); - }break; - case E_Mode_Offset: - { - result.value.u64 = eval.value.u64 + member->off; - }break; - } + U64 member_size = e_type_byte_size_from_key(member.type_key); + MemoryCopy((U8 *)(&result.value.u512[0]), + (U8 *)(&eval.value.u512[0]) + member.off, + Min(member_size, sizeof(eval.value) - member.off)); + }break; + case E_Mode_Offset: + { + result.value.u64 = eval.value.u64 + member.off; + }break; } } - scratch_end(scratch); } return result; } diff --git a/src/eval/eval_ir.c b/src/eval/eval_ir.c index 90111b1f..ec36f57e 100644 --- a/src/eval/eval_ir.c +++ b/src/eval/eval_ir.c @@ -523,28 +523,14 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) B32 r_is_constant_value = 0; { Temp scratch = scratch_begin(&arena, 1); - E_MemberArray check_type_members = e_type_data_members_from_key(scratch.arena, check_type_key); - E_Member *match = 0; - for(U64 member_idx = 0; member_idx < check_type_members.count; member_idx += 1) - { - E_Member *member = &check_type_members.v[member_idx]; - if(str8_match(member->name, exprr->string, 0)) - { - match = member; - break; - } - else if(str8_match(member->name, exprr->string, StringMatchFlag_CaseInsensitive)) - { - match = member; - } - } - if(match != 0) + E_Member match = e_type_member_from_key_name__cached(check_type_key, exprr->string); + if(match.kind != E_MemberKind_Null) { r_found = 1; - r_type = match->type_key; - r_value = match->off; + r_type = match.type_key; + r_value = match.off; } - if(match == 0) + if(match.kind == E_MemberKind_Null) { E_Type *type = e_type_from_key(scratch.arena, check_type_key); if(type->enum_vals != 0) diff --git a/src/eval/eval_types.c b/src/eval/eval_types.c index 734c47b1..592b4cb2 100644 --- a/src/eval/eval_types.c +++ b/src/eval/eval_types.c @@ -1874,7 +1874,7 @@ e_type_member_from_key_name__cached(E_TypeKey key, String8 name) { E_Member result = {0}; E_MemberCacheNode *node = e_member_cache_node_from_type_key(key); - if(node != 0) + if(node != 0 && node->member_hash_slots_count != 0) { U64 hash = e_hash_from_string(5381, name); U64 slot_idx = hash%node->member_hash_slots_count; diff --git a/src/eval_visualization/eval_visualization_builtin_view_rules.c b/src/eval_visualization/eval_visualization_builtin_view_rules.c index 3660a795..713810a1 100644 --- a/src/eval_visualization/eval_visualization_builtin_view_rules.c +++ b/src/eval_visualization/eval_visualization_builtin_view_rules.c @@ -134,7 +134,9 @@ EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(default) direct_type_kind == E_TypeKind_Union || direct_type_kind == E_TypeKind_Class))) { - accel->members = e_type_data_members_from_key__cached(e_type_kind_is_pointer_or_ref(type_kind) ? direct_type_key : type_key); + E_TypeKey struct_type_key = e_type_kind_is_pointer_or_ref(type_kind) ? direct_type_key : type_key; + E_Type *struct_type = e_type_from_key(scratch.arena, struct_type_key); + accel->members = e_type_data_members_from_key__cached(struct_type_key); total_row_count = accel->members.count; } @@ -297,7 +299,7 @@ EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF(slice) if(type_kind == E_TypeKind_Struct || type_kind == E_TypeKind_Class) { // rjf: unpack members - E_MemberArray members = e_type_data_members_from_key(scratch.arena, irtree.type_key); + E_MemberArray members = e_type_data_members_from_key__cached(irtree.type_key); // rjf: choose base pointer & count members E_Member *base_ptr_member = 0; @@ -391,7 +393,7 @@ EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF(only) E_TypeKind type_kind = e_type_kind_from_key(irtree.type_key); if(type_kind == E_TypeKind_Struct || type_kind == E_TypeKind_Union || type_kind == E_TypeKind_Class) { - E_MemberArray current_members = e_type_data_members_from_key(scratch.arena, irtree.type_key); + E_MemberArray current_members = e_type_data_members_from_key__cached(irtree.type_key); E_MemberList new_members = {0}; for MD_EachNode(node, params->first) { @@ -433,7 +435,7 @@ EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF(omit) E_TypeKind type_kind = e_type_kind_from_key(irtree.type_key); if(type_kind == E_TypeKind_Struct || type_kind == E_TypeKind_Union || type_kind == E_TypeKind_Class) { - E_MemberArray current_members = e_type_data_members_from_key(scratch.arena, irtree.type_key); + E_MemberArray current_members = e_type_data_members_from_key__cached(irtree.type_key); E_MemberList new_members = {0}; for EachIndex(idx, current_members.count) { diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 4b79b5c2..7161795d 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -8932,7 +8932,7 @@ rd_append_value_strings_from_eval(Arena *arena, EV_StringFlags flags, U32 defaul // rjf: content if(depth < 4) { - E_MemberArray data_members = e_type_data_members_from_key(scratch.arena, e_type_unwrap(eval.type_key)); + E_MemberArray data_members = e_type_data_members_from_key__cached(e_type_unwrap(eval.type_key)); for(U64 member_idx = 0; member_idx < data_members.count && max_size > space_taken; member_idx += 1) { E_Member *mem = &data_members.v[member_idx];