eval2: type keys checkpoint

This commit is contained in:
Ryan Fleury
2026-06-24 20:39:53 -07:00
parent 296c851272
commit c817d1f136
2 changed files with 46 additions and 83 deletions
+22 -15
View File
@@ -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);
+24 -68
View File
@@ -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);