From c817d1f13629a98301409bf33aea1a4f886a5c4d Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Wed, 24 Jun 2026 20:39:53 -0700 Subject: [PATCH] eval2: type keys checkpoint --- src/eval2/eval2.c | 37 +++++++++++-------- src/eval2/eval2.h | 92 +++++++++++++---------------------------------- 2 files changed, 46 insertions(+), 83 deletions(-) diff --git a/src/eval2/eval2.c b/src/eval2/eval2.c index c44262d6..2ca4ddee 100644 --- a/src/eval2/eval2.c +++ b/src/eval2/eval2.c @@ -432,7 +432,14 @@ e2_byte_size_from_type_key(E2_TypeKey k) }break; case E2_TypeKeyKind_Reg: { - // TODO(rjf) + Arch arch = (Arch)k.u32[0]; + ARCH_Info *arch_info = arch_info_from_arch(arch); + ARCH_RegCode regcode = k.u32[1]; + if(regcode < arch_info->reg_code_count) + { + Rng1U16 regrng = arch_info->reg_code_rng_table[regcode]; + result = (U64)dim_1u16(regrng); + } }break; } return result; @@ -485,10 +492,7 @@ e2_shift_from_type_key(E2_TypeKey k) RDI_TypeNode *type_node = rdi_element_from_name_idx(dbgi->rdi, TypeNodes, dbgi_type_idx); result = type_node->bitfield.off; }break; - case E2_TypeKeyKind_Cons: - { - // TODO(rjf) - }break; + case E2_TypeKeyKind_Cons:{}break; case E2_TypeKeyKind_Reg:{}break; } } @@ -512,10 +516,7 @@ e2_mask_count_from_type_key(E2_TypeKey k) RDI_TypeNode *type_node = rdi_element_from_name_idx(dbgi->rdi, TypeNodes, dbgi_type_idx); result = type_node->bitfield.size; }break; - case E2_TypeKeyKind_Cons: - { - // TODO(rjf) - }break; + case E2_TypeKeyKind_Cons:{}break; case E2_TypeKeyKind_Reg:{}break; } } @@ -543,7 +544,7 @@ e2_arch_from_type_key(E2_TypeKey k) }break; case E2_TypeKeyKind_Reg: { - arch = k.u32[0]; + arch = (Arch)k.u32[0]; }break; } return arch; @@ -608,10 +609,7 @@ e2_type_key_owner(E2_TypeKey k) U32 owner_type_idx = type_node->constructed.owner_type_idx; result = e2_type_key_dbgi(e2_type_kind_from_rdi(type_node->kind), dbgi_num, owner_type_idx); }break; - case E2_TypeKeyKind_Cons: - { - // TODO(rjf) - }break; + case E2_TypeKeyKind_Cons:{}break; case E2_TypeKeyKind_Reg:{}break; } } @@ -1700,10 +1698,15 @@ e2_parse_from_string(Arena *arena, E2_ParseState *state, E2_ExprMap *expr_map, E } else { + E2_Expr *params_expr = e2_expr(arena); + for(E2_ExprNode *n = completed_task->first_child->next; n != 0; n = n->next) + { + e2_expr_push_child(params_expr, n->v); + } done = 1; parse.status = E2_ParseStatus_Call; parse.expr = lhs; - parse.params_expr = rhs; + parse.params_expr = params_expr; state->caller_info_completes_task = 1; } } @@ -2202,6 +2205,10 @@ e2_parse_from_string(Arena *arena, E2_ParseState *state, E2_ExprMap *expr_map, E { e2_msgf(arena, &parse.msgs, t->src_range, "Couldn't index into this type."); } + else if(t->child_count >= 1 && t->op_kind == E2_OpKind_Call) + { + e2_msgf(arena, &parse.msgs, t->src_range, "Couldn't call into this type."); + } else if(t->child_count == 1 && t->child_count_target == 2 && t->op_kind != E2_OpKind_Null) { e2_msgf(arena, &parse.msgs, t->src_range, "Expected expression after binary operator `%S`.", e2_op_kind_info_table[t->op_kind].sep); diff --git a/src/eval2/eval2.h b/src/eval2/eval2.h index 61ee043b..71459b1f 100644 --- a/src/eval2/eval2.h +++ b/src/eval2/eval2.h @@ -135,69 +135,37 @@ struct E2_TypeKeyList }; //////////////////////////////// -//~ rjf: Unpacked Type Info +//~ rjf: Constructed Type Cache Types -typedef enum E2_MemberKind -{ - E2_MemberKind_Null, - E2_MemberKind_DataField, - E2_MemberKind_StaticData, - E2_MemberKind_Method, - E2_MemberKind_StaticMethod, - E2_MemberKind_VirtualMethod, - E2_MemberKind_VTablePtr, - E2_MemberKind_Base, - E2_MemberKind_VirtualBase, - E2_MemberKind_NestedType, - E2_MemberKind_Padding, - E2_MemberKind_COUNT -} -E2_MemberKind; - -typedef U32 E2_TypeFlags; -enum -{ - E2_TypeFlag_Const = (1<<0), - E2_TypeFlag_Volatile = (1<<1), - E2_TypeFlag_Restrict = (1<<2), -}; - -typedef struct E2_EnumVal E2_EnumVal; -struct E2_EnumVal -{ - String8 name; - U64 val; -}; - -typedef struct E2_Member E2_Member; -struct E2_Member -{ - E2_MemberKind kind; - E2_TypeKey type_key; - String8 name; - U64 off; - E2_TypeKeyList inheritees; -}; - -typedef struct E2_Type E2_Type; -struct E2_Type +typedef struct E2_ConsTypeParams E2_ConsTypeParams; +struct E2_ConsTypeParams { + Arch arch; E2_TypeKind kind; - E2_TypeFlags flags; String8 name; - U64 byte_size; + E2_TypeKey direct; U64 count; U64 depth; - U32 off; - Arch arch; - E2_TypeKey direct_type_key; - E2_TypeKey owner_type_key; - E2_TypeKey *param_type_keys; - E2_Member *members; - E2_EnumVal *enum_vals; struct E2_Expr **args; }; +typedef struct E2_ConsTypeNode E2_ConsTypeNode; +struct E2_ConsTypeNode +{ + E2_ConsTypeNode *key_next; + E2_ConsTypeNode *content_next; + E2_TypeKey key; + E2_ConsTypeParams params; + U64 byte_size; +}; + +typedef struct E2_ConsTypeSlot E2_ConsTypeSlot; +struct E2_ConsTypeSlot +{ + E2_ConsTypeNode *first; + E2_ConsTypeNode *last; +}; + //////////////////////////////// //~ rjf: Evaluation Values @@ -502,24 +470,12 @@ internal E2_TypeKey e2_type_key_dbgi(E2_TypeKind kind, U32 dbg_info_num, U32 typ internal E2_TypeKey e2_type_key_reg(Arch arch, ARCH_RegCode reg_code); //- rjf: constructed type constructor -typedef struct E2_ConsTypeParams E2_ConsTypeParams; -struct E2_ConsTypeParams -{ - Arch arch; - E2_TypeKind kind; - E2_TypeFlags flags; - String8 name; - E2_TypeKey direct_type_key; - U64 count; - U64 depth; - E2_Expr **args; -}; internal E2_TypeKey e2_type_key_cons_(E2_ConsTypeParams *params); #define e2_type_key_cons(k, ...) e2_type_key_cons_(&(E2_ConsTypeParams){.kind = (k), __VA_ARGS__}) //- rjf: constructed type constructor helpers -#define e2_type_key_cons_array(element_type_key, count_, ...) e2_type_key_cons(E2_TypeKind_Array, .direct_type_key = (element_type_key), .count = (count_), __VA_ARGS__) -#define e2_type_key_cons_ptr(arch, ptee_type_key, ...) e2_type_key_cons(E2_TypeKind_Ptr, .direct_type_key = (ptee_type_key), __VA_ARGS__) +#define e2_type_key_cons_array(element_type_key, count_, ...) e2_type_key_cons(E2_TypeKind_Array, .direct = (element_type_key), .count = (count_), __VA_ARGS__) +#define e2_type_key_cons_ptr(arch, ptee_type_key, ...) e2_type_key_cons(E2_TypeKind_Ptr, .direct = (ptee_type_key), __VA_ARGS__) //- rjf: basic type key type functions internal B32 e2_type_key_match(E2_TypeKey a, E2_TypeKey b);