This commit is contained in:
Ryan Fleury
2025-03-25 16:21:51 -07:00
107 changed files with 25559 additions and 24722 deletions
+6 -1
View File
@@ -71,7 +71,7 @@ E_TypeKindTable:
{IncompleteEnum "enum" 0 }
{Bitfield "bitfield" 0 }
{Variadic "variadic" 0 }
{Collection "collection" 0 }
{Set "set" 0 }
}
@table(name op_kind precedence string op_pre op_sep op_pos)
@@ -116,6 +116,8 @@ E_ExprKindTable:
{ Ternary Null 0 "? " "" "?" ":"}
{ Call Null 0 "()" "(" "," ")"}
{ LeafBytecode Null 0 "bytecode" "" "" "" }
{ LeafMember Null 0 "member" "" "" "" }
{ LeafStringLiteral Null 0 "string_literal" "" "" "" }
@@ -125,6 +127,7 @@ E_ExprKindTable:
{ LeafF32 Null 0 "F32" "" "" "" }
{ LeafIdent Null 0 "leaf_ident" "" "" "" }
{ LeafOffset Null 0 "leaf_offset" "" "" "" }
{ LeafValue Null 0 "leaf_value" "" "" "" }
{ LeafFilePath Null 0 "leaf_filepath" "" "" "" }
{ TypeIdent Null 0 "type_ident" "" "" "" }
@@ -133,6 +136,8 @@ E_ExprKindTable:
{ Func Null 0 "function" "" "" "" }
{ Define Binary 13 "=" "" "=" "" }
{ Tag Null 0 "=>" "=>" "," "" }
}
@table(name display_string)
+80 -86
View File
@@ -7,26 +7,35 @@
internal E_Eval
e_eval_from_expr(Arena *arena, E_Expr *expr)
{
E_IRTreeAndType irtree = e_irtree_and_type_from_expr(arena, expr);
E_OpList oplist = e_oplist_from_irtree(arena, irtree.root);
String8 bytecode = e_bytecode_from_oplist(arena, &oplist);
E_Interpretation interp = e_interpret(bytecode);
E_Space zero_space = {0};
E_Space space = (MemoryMatchStruct(&zero_space, &irtree.space) ? e_interpret_ctx->primary_space : irtree.space);
E_ExprChain exprs = {expr, expr};
E_Eval result = e_eval_from_exprs(arena, exprs);
return result;
}
internal E_Eval
e_eval_from_exprs(Arena *arena, E_ExprChain exprs)
{
ProfBeginFunction();
E_IRTreeAndType irtree = e_irtree_and_type_from_expr(arena, exprs.last);
E_LookupRuleTagPair lookup = e_lookup_rule_tag_pair_from_expr_irtree(exprs.last, &irtree);
E_OpList oplist = e_oplist_from_irtree(arena, irtree.root);
String8 bytecode = e_bytecode_from_oplist(arena, &oplist);
E_Interpretation interp = e_interpret(bytecode);
E_Eval eval =
{
.value = interp.value,
.mode = irtree.mode,
.space = space,
.expr = expr,
.type_key = irtree.type_key,
.code = interp.code,
.value = interp.value,
.space = interp.space,
.exprs = exprs,
.irtree = irtree,
.lookup_rule_tag = lookup,
.code = interp.code,
};
e_msg_list_concat_in_place(&eval.msgs, &irtree.msgs);
if(E_InterpretationCode_Good < eval.code && eval.code < E_InterpretationCode_COUNT)
{
e_msg(arena, &eval.msgs, E_MsgKind_InterpretationError, 0, e_interpretation_code_display_strings[eval.code]);
}
ProfEnd();
return eval;
}
@@ -35,26 +44,39 @@ e_eval_from_string(Arena *arena, String8 string)
{
E_TokenArray tokens = e_token_array_from_text(arena, string);
E_Parse parse = e_parse_expr_from_text_tokens(arena, string, &tokens);
E_Eval eval = e_eval_from_expr(arena, parse.expr);
E_Eval eval = e_eval_from_exprs(arena, parse.exprs);
e_msg_list_concat_in_place(&eval.msgs, &parse.msgs);
return eval;
}
internal E_Eval
e_eval_from_stringf(Arena *arena, char *fmt, ...)
{
Temp scratch = scratch_begin(&arena, 1);
va_list args;
va_start(args, fmt);
String8 string = push_str8fv(scratch.arena, fmt, args);
E_Eval eval = e_eval_from_string(arena, string);
va_end(args);
scratch_end(scratch);
return eval;
}
internal E_Eval
e_autoresolved_eval_from_eval(E_Eval eval)
{
if(e_parse_ctx &&
if(e_parse_state &&
e_interpret_ctx &&
e_parse_ctx->modules_count > 0 &&
e_parse_state->ctx->modules_count > 0 &&
e_interpret_ctx->module_base != 0 &&
(e_type_key_match(eval.type_key, e_type_key_basic(E_TypeKind_S64)) ||
e_type_key_match(eval.type_key, e_type_key_basic(E_TypeKind_U64)) ||
e_type_key_match(eval.type_key, e_type_key_basic(E_TypeKind_S32)) ||
e_type_key_match(eval.type_key, e_type_key_basic(E_TypeKind_U32))))
(e_type_key_match(eval.irtree.type_key, e_type_key_basic(E_TypeKind_S64)) ||
e_type_key_match(eval.irtree.type_key, e_type_key_basic(E_TypeKind_U64)) ||
e_type_key_match(eval.irtree.type_key, e_type_key_basic(E_TypeKind_S32)) ||
e_type_key_match(eval.irtree.type_key, e_type_key_basic(E_TypeKind_U32))))
{
U64 vaddr = eval.value.u64;
U64 voff = vaddr - e_interpret_ctx->module_base[0];
RDI_Parsed *rdi = e_parse_ctx->primary_module->rdi;
RDI_Parsed *rdi = e_parse_state->ctx->primary_module->rdi;
RDI_Scope *scope = rdi_scope_from_voff(rdi, voff);
RDI_Procedure *procedure = rdi_procedure_from_voff(rdi, voff);
RDI_GlobalVariable *gvar = rdi_global_variable_from_voff(rdi, voff);
@@ -63,7 +85,7 @@ e_autoresolved_eval_from_eval(E_Eval eval)
if(string_idx == 0) { string_idx = gvar->name_string_idx; }
if(string_idx != 0)
{
eval.type_key = e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, e_type_key_basic(E_TypeKind_Void), 0);
eval.irtree.type_key = e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, e_type_key_basic(E_TypeKind_Void), 1, 0);
}
}
return eval;
@@ -72,7 +94,7 @@ e_autoresolved_eval_from_eval(E_Eval eval)
internal E_Eval
e_dynamically_typed_eval_from_eval(E_Eval eval)
{
E_TypeKey type_key = eval.type_key;
E_TypeKey type_key = eval.irtree.type_key;
E_TypeKind type_kind = e_type_kind_from_key(type_key);
if(e_type_state != 0 &&
e_interpret_ctx != 0 &&
@@ -85,7 +107,7 @@ e_dynamically_typed_eval_from_eval(E_Eval eval)
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)
{
E_Type *ptee_type = e_type_from_key(scratch.arena, ptee_type_key);
E_Type *ptee_type = e_type_from_key__cached(ptee_type_key);
B32 has_vtable = 0;
for(U64 idx = 0; idx < ptee_type->count; idx += 1)
{
@@ -129,8 +151,8 @@ e_dynamically_typed_eval_from_eval(E_Eval eval)
RDI_UDT *udt = rdi_element_from_name_idx(rdi, UDTs, global_var->container_idx);
RDI_TypeNode *type = rdi_element_from_name_idx(rdi, TypeNodes, udt->self_type_idx);
E_TypeKey derived_type_key = e_type_key_ext(e_type_kind_from_rdi(type->kind), udt->self_type_idx, rdi_idx);
E_TypeKey ptr_to_derived_type_key = e_type_key_cons_ptr(arch, derived_type_key, 0);
eval.type_key = ptr_to_derived_type_key;
E_TypeKey ptr_to_derived_type_key = e_type_key_cons_ptr(arch, derived_type_key, 1, 0);
eval.irtree.type_key = ptr_to_derived_type_key;
}
}
}
@@ -145,13 +167,13 @@ internal E_Eval
e_value_eval_from_eval(E_Eval eval)
{
ProfBeginFunction();
if(eval.mode == E_Mode_Offset)
if(eval.irtree.mode == E_Mode_Offset)
{
E_TypeKey type_key = e_type_unwrap(eval.type_key);
E_TypeKey type_key = e_type_unwrap(eval.irtree.type_key);
E_TypeKind type_kind = e_type_kind_from_key(type_key);
if(type_kind == E_TypeKind_Array)
{
eval.mode = E_Mode_Value;
eval.irtree.mode = E_Mode_Value;
}
else
{
@@ -162,13 +184,13 @@ e_value_eval_from_eval(E_Eval eval)
type_byte_size <= sizeof(E_Value) &&
e_space_read(eval.space, &eval.value, value_vaddr_range))
{
eval.mode = E_Mode_Value;
eval.irtree.mode = E_Mode_Value;
// rjf: mask&shift, for bitfields
if(type_kind == E_TypeKind_Bitfield && type_byte_size <= sizeof(U64))
{
Temp scratch = scratch_begin(0, 0);
E_Type *type = e_type_from_key(scratch.arena, type_key);
E_Type *type = e_type_from_key__cached(type_key);
U64 valid_bits_mask = 0;
for(U64 idx = 0; idx < type->count; idx += 1)
{
@@ -176,7 +198,7 @@ e_value_eval_from_eval(E_Eval eval)
}
eval.value.u64 = eval.value.u64 >> type->off;
eval.value.u64 = eval.value.u64 & valid_bits_mask;
eval.type_key = type->direct_type_key;
eval.irtree.type_key = type->direct_type_key;
scratch_end(scratch);
}
@@ -198,65 +220,37 @@ e_value_eval_from_eval(E_Eval eval)
return eval;
}
internal E_Eval
e_element_eval_from_array_eval_index(E_Eval eval, U64 index)
internal E_Value
e_value_from_string(String8 string)
{
E_Eval result = {0};
result.mode = eval.mode;
result.space = eval.space;
result.type_key = e_type_direct_from_key(eval.type_key);
result.code = eval.code;
result.msgs = eval.msgs;
U64 element_size = e_type_byte_size_from_key(result.type_key);
switch(eval.mode)
{
default:{}break;
case E_Mode_Value:
if(element_size <= sizeof(E_Value) &&
index < sizeof(E_Value)/element_size)
{
MemoryCopy((U8 *)(&result.value.u512[0]),
(U8 *)(&eval.value.u512[0]) + index*element_size,
element_size);
}break;
case E_Mode_Offset:
{
result.value.u64 = eval.value.u64 + element_size*index;
}break;
}
Temp scratch = scratch_begin(0, 0);
E_Eval eval = e_eval_from_string(scratch.arena, string);
E_Eval value_eval = e_value_eval_from_eval(eval);
E_Value result = value_eval.value;
scratch_end(scratch);
return result;
}
internal E_Eval
e_member_eval_from_eval_member_name(E_Eval eval, String8 member_name)
internal E_Value
e_value_from_stringf(char *fmt, ...)
{
E_Eval result = {0};
{
E_Member member = e_type_member_from_key_name__cached(eval.type_key, member_name);
if(member.kind != E_MemberKind_Null)
{
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))
{
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;
}
}
}
Temp scratch = scratch_begin(0, 0);
va_list args;
va_start(args, fmt);
String8 string = push_str8fv(scratch.arena, fmt, args);
E_Value result = e_value_from_string(string);
va_end(args);
scratch_end(scratch);
return result;
}
internal E_Value
e_value_from_expr(E_Expr *expr)
{
Temp scratch = scratch_begin(0, 0);
E_Eval eval = e_eval_from_expr(scratch.arena, expr);
E_Eval value_eval = e_value_eval_from_eval(eval);
E_Value result = value_eval.value;
scratch_end(scratch);
return result;
}
+8 -5
View File
@@ -11,10 +11,10 @@ typedef struct E_Eval E_Eval;
struct E_Eval
{
E_Value value;
E_Mode mode;
E_Space space;
E_Expr *expr;
E_TypeKey type_key;
E_ExprChain exprs;
E_IRTreeAndType irtree;
E_LookupRuleTagPair lookup_rule_tag;
E_InterpretationCode code;
E_MsgList msgs;
};
@@ -23,11 +23,14 @@ struct E_Eval
//~ rjf: Bundled Evaluation Functions
internal E_Eval e_eval_from_expr(Arena *arena, E_Expr *expr);
internal E_Eval e_eval_from_exprs(Arena *arena, E_ExprChain exprs);
internal E_Eval e_eval_from_string(Arena *arena, String8 string);
internal E_Eval e_eval_from_stringf(Arena *arena, char *fmt, ...);
internal E_Eval e_autoresolved_eval_from_eval(E_Eval eval);
internal E_Eval e_dynamically_typed_eval_from_eval(E_Eval eval);
internal E_Eval e_value_eval_from_eval(E_Eval eval);
internal E_Eval e_element_eval_from_array_eval_index(E_Eval eval, U64 index);
internal E_Eval e_member_eval_from_eval_member_name(E_Eval eval, String8 member_name);
internal E_Value e_value_from_string(String8 string);
internal E_Value e_value_from_stringf(char *fmt, ...);
internal E_Value e_value_from_expr(E_Expr *expr);
#endif // EVAL_BUNDLES_H
+7 -5
View File
@@ -9,14 +9,16 @@
////////////////////////////////
//~ rjf: Basic Helper Functions
#if !defined(XXH_IMPLEMENTATION)
# define XXH_IMPLEMENTATION
# define XXH_STATIC_LINKING_ONLY
# include "third_party/xxHash/xxhash.h"
#endif
internal U64
e_hash_from_string(U64 seed, String8 string)
{
U64 result = seed;
for(U64 i = 0; i < string.size; i += 1)
{
result = ((result << 5) + result) + string.str[i];
}
U64 result = XXH3_64bits_withSeed(string.str, string.size, seed);
return result;
}
+2
View File
@@ -93,7 +93,9 @@ typedef U64 E_SpaceKind;
enum
{
E_SpaceKind_Null,
E_SpaceKind_File,
E_SpaceKind_FileSystem,
E_SpaceKind_HashStoreKey,
E_SpaceKind_FirstUserDefined,
};
+7 -2
View File
@@ -99,7 +99,11 @@ e_interpret(String8 bytecode)
U64 stack_cap = 128; // TODO(rjf): scan bytecode; determine maximum stack depth
E_Value *stack = push_array_no_zero(scratch.arena, E_Value, stack_cap);
U64 stack_count = 0;
E_Space selected_space = e_interpret_ctx->primary_space;
E_Space selected_space = {0};
if(bytecode.size != 0)
{
selected_space = e_interpret_ctx->primary_space;
}
//- rjf: iterate bytecode & perform ops
U8 *ptr = bytecode.str;
@@ -115,7 +119,7 @@ e_interpret(String8 bytecode)
}
else switch(op)
{
case E_IRExtKind_SetSpace:{ctrlbits = RDI_EVAL_CTRLBITS(32, 0, 0);}break;
case E_IRExtKind_SetSpace: {ctrlbits = RDI_EVAL_CTRLBITS(32, 0, 0);}break;
default:
{
result.code = E_InterpretationCode_BadOp;
@@ -853,6 +857,7 @@ e_interpret(String8 bytecode)
{
result.value = stack[0];
}
result.space = selected_space;
scratch_end(scratch);
return result;
}
+1
View File
@@ -11,6 +11,7 @@ typedef struct E_Interpretation E_Interpretation;
struct E_Interpretation
{
E_Value value;
E_Space space;
E_InterpretationCode code;
};
+1856 -317
View File
File diff suppressed because it is too large Load Diff
+362 -6
View File
@@ -42,6 +42,7 @@ struct E_IRNode
E_IRNode *last;
E_IRNode *next;
RDI_EvalOp op;
E_Space space;
String8 string;
E_Value value;
};
@@ -51,25 +52,325 @@ struct E_IRTreeAndType
{
E_IRNode *root;
E_TypeKey type_key;
E_Member member;
E_Mode mode;
E_Space space;
E_MsgList msgs;
};
////////////////////////////////
//~ rjf: Parse Context
//~ rjf: Member/Index Lookup Hooks
typedef struct E_LookupInfo E_LookupInfo;
struct E_LookupInfo
{
void *user_data;
U64 named_expr_count;
U64 idxed_expr_count;
};
typedef struct E_LookupAccess E_LookupAccess;
struct E_LookupAccess
{
E_IRTreeAndType irtree_and_type;
};
#define E_LOOKUP_INFO_FUNCTION_SIG(name) E_LookupInfo name(Arena *arena, E_IRTreeAndType *lhs, E_Expr *tag, String8 filter)
#define E_LOOKUP_INFO_FUNCTION_NAME(name) e_lookup_info_##name
#define E_LOOKUP_INFO_FUNCTION_DEF(name) internal E_LOOKUP_INFO_FUNCTION_SIG(E_LOOKUP_INFO_FUNCTION_NAME(name))
typedef E_LOOKUP_INFO_FUNCTION_SIG(E_LookupInfoFunctionType);
E_LOOKUP_INFO_FUNCTION_DEF(default);
#define E_LOOKUP_ACCESS_FUNCTION_SIG(name) E_LookupAccess name(Arena *arena, E_ExprKind kind, E_Expr *lhs, E_Expr *rhs, E_Expr *tag, void *user_data)
#define E_LOOKUP_ACCESS_FUNCTION_NAME(name) e_lookup_access_##name
#define E_LOOKUP_ACCESS_FUNCTION_DEF(name) internal E_LOOKUP_ACCESS_FUNCTION_SIG(E_LOOKUP_ACCESS_FUNCTION_NAME(name))
typedef E_LOOKUP_ACCESS_FUNCTION_SIG(E_LookupAccessFunctionType);
E_LOOKUP_ACCESS_FUNCTION_DEF(default);
#define E_LOOKUP_RANGE_FUNCTION_SIG(name) void name(Arena *arena, E_Expr *lhs, E_Expr *tag, String8 filter, Rng1U64 idx_range, E_Expr **exprs, String8 *exprs_strings, void *user_data)
#define E_LOOKUP_RANGE_FUNCTION_NAME(name) e_lookup_range_##name
#define E_LOOKUP_RANGE_FUNCTION_DEF(name) internal E_LOOKUP_RANGE_FUNCTION_SIG(E_LOOKUP_RANGE_FUNCTION_NAME(name))
typedef E_LOOKUP_RANGE_FUNCTION_SIG(E_LookupRangeFunctionType);
E_LOOKUP_RANGE_FUNCTION_DEF(default);
#define E_LOOKUP_ID_FROM_NUM_FUNCTION_SIG(name) U64 name(U64 num, void *user_data)
#define E_LOOKUP_ID_FROM_NUM_FUNCTION_NAME(name) e_lookup_id_from_num_##name
#define E_LOOKUP_ID_FROM_NUM_FUNCTION_DEF(name) internal E_LOOKUP_ID_FROM_NUM_FUNCTION_SIG(E_LOOKUP_ID_FROM_NUM_FUNCTION_NAME(name))
typedef E_LOOKUP_ID_FROM_NUM_FUNCTION_SIG(E_LookupIDFromNumFunctionType);
E_LOOKUP_ID_FROM_NUM_FUNCTION_DEF(default);
#define E_LOOKUP_NUM_FROM_ID_FUNCTION_SIG(name) U64 name(U64 id, void *user_data)
#define E_LOOKUP_NUM_FROM_ID_FUNCTION_NAME(name) e_lookup_num_from_id_##name
#define E_LOOKUP_NUM_FROM_ID_FUNCTION_DEF(name) internal E_LOOKUP_NUM_FROM_ID_FUNCTION_SIG(E_LOOKUP_NUM_FROM_ID_FUNCTION_NAME(name))
typedef E_LOOKUP_NUM_FROM_ID_FUNCTION_SIG(E_LookupNumFromIDFunctionType);
E_LOOKUP_NUM_FROM_ID_FUNCTION_DEF(default);
typedef struct E_LookupRule E_LookupRule;
struct E_LookupRule
{
String8 name;
E_LookupInfoFunctionType *info;
E_LookupAccessFunctionType *access;
E_LookupRangeFunctionType *range;
E_LookupIDFromNumFunctionType *id_from_num;
E_LookupNumFromIDFunctionType *num_from_id;
};
typedef struct E_LookupRuleNode E_LookupRuleNode;
struct E_LookupRuleNode
{
E_LookupRuleNode *next;
E_LookupRule v;
};
typedef struct E_LookupRuleSlot E_LookupRuleSlot;
struct E_LookupRuleSlot
{
E_LookupRuleNode *first;
E_LookupRuleNode *last;
};
typedef struct E_LookupRuleMap E_LookupRuleMap;
struct E_LookupRuleMap
{
E_LookupRuleSlot *slots;
U64 slots_count;
};
typedef struct E_LookupRuleTagPair E_LookupRuleTagPair;
struct E_LookupRuleTagPair
{
E_LookupRule *rule;
E_Expr *tag;
};
////////////////////////////////
//~ rjf: IR Generation Hooks
#define E_IRGEN_FUNCTION_SIG(name) E_IRTreeAndType name(Arena *arena, E_Expr *expr, E_Expr *tag)
#define E_IRGEN_FUNCTION_NAME(name) e_irgen_##name
#define E_IRGEN_FUNCTION_DEF(name) internal E_IRGEN_FUNCTION_SIG(E_IRGEN_FUNCTION_NAME(name))
typedef E_IRGEN_FUNCTION_SIG(E_IRGenFunctionType);
E_IRGEN_FUNCTION_DEF(default);
typedef struct E_IRGenRule E_IRGenRule;
struct E_IRGenRule
{
String8 name;
E_IRGenFunctionType *irgen;
};
typedef struct E_IRGenRuleNode E_IRGenRuleNode;
struct E_IRGenRuleNode
{
E_IRGenRuleNode *next;
E_IRGenRule v;
};
typedef struct E_IRGenRuleSlot E_IRGenRuleSlot;
struct E_IRGenRuleSlot
{
E_IRGenRuleNode *first;
E_IRGenRuleNode *last;
};
typedef struct E_IRGenRuleMap E_IRGenRuleMap;
struct E_IRGenRuleMap
{
U64 slots_count;
E_IRGenRuleSlot *slots;
};
////////////////////////////////
//~ rjf: Type Pattern -> Hook Key Data Structure (Auto View Rules)
typedef struct E_AutoHookNode E_AutoHookNode;
struct E_AutoHookNode
{
E_AutoHookNode *hash_next;
E_AutoHookNode *pattern_order_next;
E_TypeKey type_key;
String8List type_pattern_parts;
E_ExprChain tag_exprs;
};
typedef struct E_AutoHookSlot E_AutoHookSlot;
struct E_AutoHookSlot
{
E_AutoHookNode *first;
E_AutoHookNode *last;
};
typedef struct E_AutoHookMap E_AutoHookMap;
struct E_AutoHookMap
{
U64 slots_count;
E_AutoHookSlot *slots;
E_AutoHookNode *first_pattern;
E_AutoHookNode *last_pattern;
};
typedef struct E_AutoHookParams E_AutoHookParams;
struct E_AutoHookParams
{
E_TypeKey type_key;
String8 type_pattern;
String8 tag_expr_string;
};
////////////////////////////////
//~ rjf: Used Tag Map Data Structure
typedef struct E_UsedTagNode E_UsedTagNode;
struct E_UsedTagNode
{
E_UsedTagNode *next;
E_UsedTagNode *prev;
E_Expr *tag;
};
typedef struct E_UsedTagSlot E_UsedTagSlot;
struct E_UsedTagSlot
{
E_UsedTagNode *first;
E_UsedTagNode *last;
};
typedef struct E_UsedTagMap E_UsedTagMap;
struct E_UsedTagMap
{
U64 slots_count;
E_UsedTagSlot *slots;
};
////////////////////////////////
//~ rjf: Type Key -> Auto Hook Expr List Cache
typedef struct E_TypeAutoHookCacheNode E_TypeAutoHookCacheNode;
struct E_TypeAutoHookCacheNode
{
E_TypeAutoHookCacheNode *next;
E_TypeKey key;
E_ExprList exprs;
};
typedef struct E_TypeAutoHookCacheSlot E_TypeAutoHookCacheSlot;
struct E_TypeAutoHookCacheSlot
{
E_TypeAutoHookCacheNode *first;
E_TypeAutoHookCacheNode *last;
};
typedef struct E_TypeAutoHookCacheMap E_TypeAutoHookCacheMap;
struct E_TypeAutoHookCacheMap
{
U64 slots_count;
E_TypeAutoHookCacheSlot *slots;
};
////////////////////////////////
//~ rjf: Evaluated String ID Map
typedef struct E_StringIDNode E_StringIDNode;
struct E_StringIDNode
{
E_StringIDNode *hash_next;
E_StringIDNode *id_next;
U64 id;
String8 string;
};
typedef struct E_StringIDSlot E_StringIDSlot;
struct E_StringIDSlot
{
E_StringIDNode *first;
E_StringIDNode *last;
};
typedef struct E_StringIDMap E_StringIDMap;
struct E_StringIDMap
{
U64 id_slots_count;
E_StringIDSlot *id_slots;
U64 hash_slots_count;
E_StringIDSlot *hash_slots;
};
////////////////////////////////
//~ rjf: IR Context
typedef struct E_IRCtx E_IRCtx;
struct E_IRCtx
{
E_String2ExprMap *macro_map;
E_LookupRuleMap *lookup_rule_map;
E_IRGenRuleMap *irgen_rule_map;
E_AutoHookMap *auto_hook_map;
};
////////////////////////////////
//~ rjf: IR State
typedef struct E_IRTreeAndTypeCacheNode E_IRTreeAndTypeCacheNode;
struct E_IRTreeAndTypeCacheNode
{
E_IRTreeAndTypeCacheNode *next;
E_Expr *expr;
E_IRTreeAndType irtree_and_type;
};
typedef struct E_IRTreeAndTypeCacheSlot E_IRTreeAndTypeCacheSlot;
struct E_IRTreeAndTypeCacheSlot
{
E_IRTreeAndTypeCacheNode *first;
E_IRTreeAndTypeCacheNode *last;
};
typedef struct E_IRState E_IRState;
struct E_IRState
{
Arena *arena;
U64 arena_eval_start_pos;
// rjf: ir context
E_IRCtx *ctx;
// rjf: caches
E_UsedTagMap *used_tag_map;
E_TypeAutoHookCacheMap *type_auto_hook_cache_map;
U64 irtree_and_type_cache_slots_count;
E_IRTreeAndTypeCacheSlot *irtree_and_type_cache_slots;
U64 string_id_gen;
E_StringIDMap *string_id_map;
};
////////////////////////////////
//~ rjf: Globals
local_persist read_only E_LookupRule e_lookup_rule__nil =
{
str8_lit_comp("nil"),
E_LOOKUP_INFO_FUNCTION_NAME(default),
E_LOOKUP_ACCESS_FUNCTION_NAME(default),
E_LOOKUP_RANGE_FUNCTION_NAME(default),
E_LOOKUP_ID_FROM_NUM_FUNCTION_NAME(default),
E_LOOKUP_NUM_FROM_ID_FUNCTION_NAME(default),
};
local_persist read_only E_LookupRule e_lookup_rule__default =
{
str8_lit_comp("default"),
E_LOOKUP_INFO_FUNCTION_NAME(default),
E_LOOKUP_ACCESS_FUNCTION_NAME(default),
E_LOOKUP_RANGE_FUNCTION_NAME(default),
E_LOOKUP_ID_FROM_NUM_FUNCTION_NAME(default),
E_LOOKUP_NUM_FROM_ID_FUNCTION_NAME(default),
};
local_persist read_only E_IRGenRule e_irgen_rule__default =
{
str8_lit_comp("default"),
E_IRGEN_FUNCTION_NAME(default),
};
global read_only E_IRNode e_irnode_nil = {&e_irnode_nil, &e_irnode_nil, &e_irnode_nil};
thread_static E_IRCtx *e_ir_ctx = 0;
thread_static E_IRState *e_ir_state = 0;
////////////////////////////////
//~ rjf: Expr Kind Enum Functions
@@ -83,6 +384,39 @@ internal B32 e_expr_kind_is_comparison(E_ExprKind kind);
internal E_IRCtx *e_selected_ir_ctx(void);
internal void e_select_ir_ctx(E_IRCtx *ctx);
////////////////////////////////
//~ rjf: Lookups
internal E_LookupRuleMap e_lookup_rule_map_make(Arena *arena, U64 slots_count);
internal void e_lookup_rule_map_insert(Arena *arena, E_LookupRuleMap *map, E_LookupRule *rule);
#define e_lookup_rule_map_insert_new(arena, map, name_, ...) e_lookup_rule_map_insert((arena), (map), &(E_LookupRule){.name = (name_), __VA_ARGS__})
internal E_LookupRule *e_lookup_rule_from_string(String8 string);
////////////////////////////////
//~ rjf: IR Gen Rules
internal E_IRGenRuleMap e_irgen_rule_map_make(Arena *arena, U64 slots_count);
internal void e_irgen_rule_map_insert(Arena *arena, E_IRGenRuleMap *map, E_IRGenRule *rule);
#define e_irgen_rule_map_insert_new(arena, map, name_, ...) e_irgen_rule_map_insert((arena), (map), &(E_IRGenRule){.name = (name_), __VA_ARGS__})
internal E_IRGenRule *e_irgen_rule_from_string(String8 string);
////////////////////////////////
//~ rjf: Auto Hooks
internal E_AutoHookMap e_auto_hook_map_make(Arena *arena, U64 slots_count);
internal void e_auto_hook_map_insert_new_(Arena *arena, E_AutoHookMap *map, E_AutoHookParams *params);
#define e_auto_hook_map_insert_new(arena, map, ...) e_auto_hook_map_insert_new_((arena), (map), &(E_AutoHookParams){.type_key = zero_struct, __VA_ARGS__})
internal E_ExprList e_auto_hook_tag_exprs_from_type_key(Arena *arena, E_TypeKey type_key);
internal E_ExprList e_auto_hook_tag_exprs_from_type_key__cached(E_TypeKey type_key);
////////////////////////////////
//~ rjf: Evaluated String IDs
internal U64 e_id_from_string(String8 string);
internal String8 e_string_from_id(U64 id);
////////////////////////////////
//~ rjf: IR-ization Functions
@@ -101,6 +435,7 @@ internal void e_irnode_push_child(E_IRNode *parent, E_IRNode *child);
//- rjf: ir subtree building helpers
internal E_IRNode *e_irtree_const_u(Arena *arena, U64 v);
internal E_IRNode *e_irtree_leaf_u128(Arena *arena, U128 u128);
internal E_IRNode *e_irtree_unary_op(Arena *arena, RDI_EvalOp op, RDI_EvalTypeGroup group, E_IRNode *c);
internal E_IRNode *e_irtree_binary_op(Arena *arena, RDI_EvalOp op, RDI_EvalTypeGroup group, E_IRNode *l, E_IRNode *r);
internal E_IRNode *e_irtree_binary_op_u(Arena *arena, RDI_EvalOp op, E_IRNode *l, E_IRNode *r);
@@ -108,18 +443,39 @@ internal E_IRNode *e_irtree_conditional(Arena *arena, E_IRNode *c, E_IRNode *l,
internal E_IRNode *e_irtree_bytecode_no_copy(Arena *arena, String8 bytecode);
internal E_IRNode *e_irtree_string_literal(Arena *arena, String8 string);
internal E_IRNode *e_irtree_set_space(Arena *arena, E_Space space, E_IRNode *c);
internal E_IRNode *e_irtree_mem_read_type(Arena *arena, E_Space space, E_IRNode *c, E_TypeKey type_key);
internal E_IRNode *e_irtree_mem_read_type(Arena *arena, E_IRNode *c, E_TypeKey type_key);
internal E_IRNode *e_irtree_convert_lo(Arena *arena, E_IRNode *c, RDI_EvalTypeGroup out, RDI_EvalTypeGroup in);
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_Space from_space, E_Mode from_mode, E_IRNode *tree, E_TypeKey type_key);
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);
//- rjf: irtree -> linear ops/bytecode
internal void e_append_oplist_from_irtree(Arena *arena, E_IRNode *root, E_OpList *out);
internal void e_append_oplist_from_irtree(Arena *arena, E_IRNode *root, E_Space *current_space, E_OpList *out);
internal E_OpList e_oplist_from_irtree(Arena *arena, E_IRNode *root);
internal String8 e_bytecode_from_oplist(Arena *arena, E_OpList *oplist);
//- rjf: leaf-bytecode expression extensions
internal E_Expr *e_expr_irext_member_access(Arena *arena, E_Expr *lhs, E_IRTreeAndType *lhs_irtree, String8 member_name);
internal E_Expr *e_expr_irext_array_index(Arena *arena, E_Expr *lhs, E_IRTreeAndType *lhs_irtree, U64 index);
internal E_Expr *e_expr_irext_deref(Arena *arena, E_Expr *rhs, E_IRTreeAndType *rhs_irtree);
internal E_Expr *e_expr_irext_cast(Arena *arena, E_Expr *rhs, E_IRTreeAndType *rhs_irtree, E_TypeKey type_key);
////////////////////////////////
//~ rjf: IRified Expression Cache
internal E_IRTreeAndType e_irtree_and_type_from_expr__cached(E_Expr *expr);
////////////////////////////////
//~ rjf: Expression & IR-Tree => Lookup Rule
internal E_LookupRuleTagPair e_lookup_rule_tag_pair_from_expr_irtree(E_Expr *expr, E_IRTreeAndType *irtree);
#endif // EVAL_IR_H
+1193 -988
View File
File diff suppressed because it is too large Load Diff
+69 -14
View File
@@ -52,6 +52,8 @@ struct E_Expr
{
E_Expr *first;
E_Expr *last;
E_Expr *first_tag;
E_Expr *last_tag;
E_Expr *next;
E_Expr *prev;
E_Expr *ref;
@@ -62,9 +64,32 @@ struct E_Expr
E_TypeKey type_key;
E_Value value;
String8 string;
String8 qualifier;
String8 bytecode;
};
typedef struct E_ExprChain E_ExprChain;
struct E_ExprChain
{
E_Expr *first;
E_Expr *last;
};
typedef struct E_ExprNode E_ExprNode;
struct E_ExprNode
{
E_ExprNode *next;
E_Expr *v;
};
typedef struct E_ExprList E_ExprList;
struct E_ExprList
{
E_ExprNode *first;
E_ExprNode *last;
U64 count;
};
////////////////////////////////
//~ rjf: Map Types
@@ -128,6 +153,17 @@ struct E_String2ExprMap
E_String2ExprMapSlot *slots;
};
////////////////////////////////
//~ rjf: Parse Results
typedef struct E_Parse E_Parse;
struct E_Parse
{
E_Token *last_token;
E_ExprChain exprs;
E_MsgList msgs;
};
////////////////////////////////
//~ rjf: Parse Context
@@ -152,14 +188,33 @@ struct E_ParseCtx
};
////////////////////////////////
//~ rjf: Parse Results
//~ rjf: Parse State (stateful thread-local caching mechanisms, not provided by user)
typedef struct E_Parse E_Parse;
struct E_Parse
typedef struct E_ParseCacheNode E_ParseCacheNode;
struct E_ParseCacheNode
{
E_Token *last_token;
E_Expr *expr;
E_MsgList msgs;
E_ParseCacheNode *next;
String8 string;
E_Parse parse;
};
typedef struct E_ParseCacheSlot E_ParseCacheSlot;
struct E_ParseCacheSlot
{
E_ParseCacheNode *first;
E_ParseCacheNode *last;
};
typedef struct E_ParseState E_ParseState;
struct E_ParseState
{
Arena *arena;
U64 arena_eval_start_pos;
E_ParseCtx *ctx;
// rjf: string -> parse cache
E_ParseCacheSlot *parse_cache_slots;
U64 parse_cache_slots_count;
};
////////////////////////////////
@@ -167,8 +222,8 @@ struct E_Parse
global read_only E_String2NumMap e_string2num_map_nil = {0};
global read_only E_String2ExprMap e_string2expr_map_nil = {0};
global read_only E_Expr e_expr_nil = {&e_expr_nil, &e_expr_nil, &e_expr_nil};
thread_static E_ParseCtx *e_parse_ctx = 0;
global read_only E_Expr e_expr_nil = {&e_expr_nil, &e_expr_nil, &e_expr_nil, &e_expr_nil, &e_expr_nil};
thread_static E_ParseState *e_parse_state = 0;
////////////////////////////////
//~ rjf: Basic Map Functions
@@ -218,13 +273,12 @@ internal E_Expr *e_push_expr(Arena *arena, E_ExprKind kind, void *location);
internal void e_expr_insert_child(E_Expr *parent, E_Expr *prev, E_Expr *child);
internal void e_expr_push_child(E_Expr *parent, E_Expr *child);
internal void e_expr_remove_child(E_Expr *parent, E_Expr *child);
internal void e_expr_push_tag(E_Expr *parent, E_Expr *child);
internal E_Expr *e_expr_ref(Arena *arena, E_Expr *ref);
internal E_Expr *e_expr_ref_addr(Arena *arena, E_Expr *rhs);
internal E_Expr *e_expr_ref_member_access(Arena *arena, E_Expr *lhs, String8 member_name);
internal E_Expr *e_expr_ref_array_index(Arena *arena, E_Expr *lhs, U64 index);
internal E_Expr *e_expr_ref_deref(Arena *arena, E_Expr *rhs);
internal E_Expr *e_expr_ref_cast(Arena *arena, E_TypeKey type_key, E_Expr *rhs);
internal E_Expr *e_expr_ref_bswap(Arena *arena, E_Expr *rhs);
internal E_Expr *e_expr_copy(Arena *arena, E_Expr *src);
internal void e_expr_list_push(Arena *arena, E_ExprList *list, E_Expr *expr);
////////////////////////////////
//~ rjf: Expression Tree -> String Conversions
@@ -239,8 +293,9 @@ internal E_TypeKey e_leaf_type_from_name(String8 name);
internal E_TypeKey e_type_from_expr(E_Expr *expr);
internal void e_push_leaf_ident_exprs_from_expr__in_place(Arena *arena, E_String2ExprMap *map, E_Expr *expr);
internal E_Parse e_parse_type_from_text_tokens(Arena *arena, String8 text, E_TokenArray *tokens);
internal E_Parse e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *tokens, S64 max_precedence);
internal E_Parse e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *tokens, S64 max_precedence, U64 max_chain_count);
internal E_Parse e_parse_expr_from_text_tokens(Arena *arena, String8 text, E_TokenArray *tokens);
internal E_Expr *e_parse_expr_from_text(Arena *arena, String8 text);
internal E_Parse e_parse_expr_from_text(Arena *arena, String8 text);
internal E_Parse e_parse_expr_from_text__cached(String8 text);
#endif // EVAL_PARSE_H
+179 -65
View File
@@ -250,6 +250,8 @@ e_select_type_ctx(E_TypeCtx *ctx)
e_type_state->cons_key_slots = push_array(e_type_state->arena, E_ConsTypeSlot, e_type_state->cons_key_slots_count);
e_type_state->member_cache_slots_count = 256;
e_type_state->member_cache_slots = push_array(e_type_state->arena, E_MemberCacheSlot, e_type_state->member_cache_slots_count);
e_type_state->type_cache_slots_count = 1024;
e_type_state->type_cache_slots = push_array(e_type_state->arena, E_TypeCacheSlot, e_type_state->type_cache_slots_count);
}
////////////////////////////////
@@ -321,6 +323,8 @@ e_hash_from_cons_type_params(E_ConsTypeParams *params)
params->direct_key.u32[2],
(U32)((params->count & 0x00000000ffffffffull)>> 0),
(U32)((params->count & 0xffffffff00000000ull)>> 32),
(U32)((params->depth & 0x00000000ffffffffull)>> 0),
(U32)((params->depth & 0xffffffff00000000ull)>> 32),
};
U64 hash = e_hash_from_string(5381, str8((U8 *)buffer, sizeof(buffer)));
hash = e_hash_from_string(hash, params->name);
@@ -334,7 +338,8 @@ e_cons_type_params_match(E_ConsTypeParams *l, E_ConsTypeParams *r)
l->flags == r->flags &&
str8_match(l->name, r->name, 0) &&
e_type_key_match(l->direct_key, r->direct_key) &&
l->count == r->count);
l->count == r->count &&
l->depth == r->depth);
if(result && l->members != 0 && r->members != 0)
{
for(U64 idx = 0; idx < l->count; idx += 1)
@@ -445,16 +450,16 @@ e_type_key_cons_(E_ConsTypeParams *params)
//- rjf: constructed type helpers
internal E_TypeKey
e_type_key_cons_array(E_TypeKey element_type_key, U64 count)
e_type_key_cons_array(E_TypeKey element_type_key, U64 count, E_TypeFlags flags)
{
E_TypeKey key = e_type_key_cons(.kind = E_TypeKind_Array, .direct_key = element_type_key, .count = count);
E_TypeKey key = e_type_key_cons(.kind = E_TypeKind_Array, .direct_key = element_type_key, .count = count, .flags = flags);
return key;
}
internal E_TypeKey
e_type_key_cons_ptr(Arch arch, E_TypeKey element_type_key, E_TypeFlags flags)
e_type_key_cons_ptr(Arch arch, E_TypeKey element_type_key, U64 count, E_TypeFlags flags)
{
E_TypeKey key = e_type_key_cons(.arch = arch, .kind = E_TypeKind_Ptr, .flags = flags, .direct_key = element_type_key);
E_TypeKey key = e_type_key_cons(.arch = arch, .kind = E_TypeKind_Ptr, .flags = flags, .direct_key = element_type_key, .count = count);
return key;
}
@@ -478,12 +483,12 @@ e_type_key_cons_base(Type *type)
if(type->flags & TypeFlag_IsPlainText){ flags |= E_TypeFlag_IsPlainText; }
if(type->flags & TypeFlag_IsCodeText) { flags |= E_TypeFlag_IsCodeText; }
if(type->flags & TypeFlag_IsPathText) { flags |= E_TypeFlag_IsPathText; }
result = e_type_key_cons_ptr(arch_from_context(), direct_type, flags);
result = e_type_key_cons_ptr(arch_from_context(), direct_type, 1, flags);
}break;
case TypeKind_Array:
{
E_TypeKey direct_type = e_type_key_cons_base(type->direct);
result = e_type_key_cons_array(direct_type, type->count);
result = e_type_key_cons_array(direct_type, type->count, 0);
}break;
case TypeKind_Struct:
{
@@ -492,7 +497,7 @@ e_type_key_cons_base(Type *type)
for(U64 idx = 0; idx < type->count; idx += 1)
{
E_TypeKey member_type_key = e_type_key_cons_base(type->members[idx].type);
e_member_list_push_new(scratch.arena, &members, .name = type->members[idx].name, .off = type->members[idx].value, .type_key = member_type_key, .pretty_name = type->members[idx].pretty_name);
e_member_list_push_new(scratch.arena, &members, .name = type->members[idx].name, .off = type->members[idx].value, .type_key = member_type_key);
}
E_MemberArray members_array = e_member_array_from_list(scratch.arena, &members);
result = e_type_key_cons(.arch = arch_from_context(),
@@ -518,13 +523,12 @@ e_type_key_match(E_TypeKey l, E_TypeKey r)
//- rjf: key -> info extraction
internal U64
e_hash_from_type_key(E_TypeKey key)
e_hash_from_type(E_Type *type)
{
U64 hash = 0;
if(!e_type_key_match(e_type_key_zero(), key))
if(type != &e_type_nil)
{
Temp scratch = scratch_begin(0, 0);
E_Type *type = e_type_from_key(scratch.arena, key);
String8List strings = {0};
str8_serial_begin(scratch.arena, &strings);
str8_serial_push_struct(scratch.arena, &strings, &type->kind);
@@ -623,9 +627,12 @@ e_type_from_key(Arena *arena, E_TypeKey key)
type->name = push_str8_copy(arena, node->params.name);
type->direct_type_key = node->params.direct_key;
type->count = node->params.count;
type->depth = node->params.depth;
type->arch = node->params.arch;
type->byte_size = node->byte_size;
switch(type->kind)
{
default:{}break;
case E_TypeKind_Struct:
case E_TypeKind_Union:
case E_TypeKind_Class:
@@ -700,6 +707,7 @@ e_type_from_key(Arena *arena, E_TypeKey key)
type->name = push_str8_copy(arena, name);
type->byte_size = (U64)rdi_type->byte_size;
type->count = members_count;
type->arch = e_type_state->ctx->modules[rdi_idx].arch;
type->members = members;
}
@@ -744,6 +752,7 @@ e_type_from_key(Arena *arena, E_TypeKey key)
type->name = push_str8_copy(arena, name);
type->byte_size = (U64)rdi_type->byte_size;
type->count = enum_vals_count;
type->arch = e_type_state->ctx->modules[rdi_idx].arch;
type->enum_vals = enum_vals;
type->direct_type_key = direct_type_key;
}
@@ -783,6 +792,7 @@ e_type_from_key(Arena *arena, E_TypeKey key)
type->direct_type_key = direct_type_key;
type->byte_size = direct_type_byte_size;
type->flags = flags;
type->arch = e_type_state->ctx->modules[rdi_idx].arch;
}break;
case RDI_TypeKind_Ptr:
case RDI_TypeKind_LRef:
@@ -792,6 +802,8 @@ e_type_from_key(Arena *arena, E_TypeKey key)
type->kind = kind;
type->direct_type_key = direct_type_key;
type->byte_size = bit_size_from_arch(e_type_state->ctx->modules[rdi_idx].arch)/8;
type->count = 1;
type->arch = e_type_state->ctx->modules[rdi_idx].arch;
}break;
case RDI_TypeKind_Array:
@@ -801,6 +813,7 @@ e_type_from_key(Arena *arena, E_TypeKey key)
type->direct_type_key = direct_type_key;
type->count = rdi_type->constructed.count;
type->byte_size = direct_type_byte_size * type->count;
type->arch = e_type_state->ctx->modules[rdi_idx].arch;
}break;
case RDI_TypeKind_Function:
{
@@ -816,6 +829,7 @@ e_type_from_key(Arena *arena, E_TypeKey key)
type->direct_type_key = direct_type_key;
type->count = count;
type->param_type_keys = push_array_no_zero(arena, E_TypeKey, type->count);
type->arch = e_type_state->ctx->modules[rdi_idx].arch;
for(U32 idx = 0; idx < type->count; idx += 1)
{
U32 param_type_idx = idx_run[idx];
@@ -849,6 +863,7 @@ e_type_from_key(Arena *arena, E_TypeKey key)
type->owner_type_key = direct_type_key;
type->count = count;
type->param_type_keys = push_array_no_zero(arena, E_TypeKey, type->count);
type->arch = e_type_state->ctx->modules[rdi_idx].arch;
for(U32 idx = 0; idx < type->count; idx += 1)
{
U32 param_type_idx = idx_run[idx];
@@ -886,6 +901,7 @@ e_type_from_key(Arena *arena, E_TypeKey key)
type->byte_size = bit_size_from_arch(e_type_state->ctx->modules[rdi_idx].arch)/8;
type->owner_type_key = owner_type_key;
type->direct_type_key = direct_type_key;
type->arch = e_type_state->ctx->modules[rdi_idx].arch;
}break;
}
}
@@ -914,6 +930,7 @@ e_type_from_key(Arena *arena, E_TypeKey key)
type->name = push_str8_copy(arena, name);
type->byte_size = direct_type_byte_size;
type->direct_type_key = direct_type_key;
type->arch = e_type_state->ctx->modules[rdi_idx].arch;
}
//- rjf: bitfields
@@ -937,6 +954,7 @@ e_type_from_key(Arena *arena, E_TypeKey key)
type->direct_type_key = direct_type_key;
type->off = (U32)rdi_type->bitfield.off;
type->count = (U64)rdi_type->bitfield.size;
type->arch = e_type_state->ctx->modules[rdi_idx].arch;
}
//- rjf: incomplete types
@@ -950,6 +968,7 @@ e_type_from_key(Arena *arena, E_TypeKey key)
type = push_array(arena, E_Type, 1);
type->kind = kind;
type->name = push_str8_copy(arena, name);
type->arch = e_type_state->ctx->modules[rdi_idx].arch;
}
}
@@ -977,6 +996,7 @@ e_type_from_key(Arena *arena, E_TypeKey key)
type->kind = E_TypeKind_Union;
type->name = push_str8f(arena, "reg_%I64u_bit", reg_byte_count*8);
type->byte_size = (U64)reg_byte_count;
type->arch = (Arch)key.u32[0];
// rjf: build register type members
E_MemberList members = {0};
@@ -1045,7 +1065,7 @@ e_type_from_key(Arena *arena, E_TypeKey key)
E_Member *mem = &n->v;
mem->kind = E_MemberKind_DataField;
mem->name = str8_lit("u128s");
mem->type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_U128), reg_byte_count/16);
mem->type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_U128), reg_byte_count/16, 0);
}
if(type->byte_size > 8 && type->byte_size%8 == 0)
{
@@ -1055,7 +1075,7 @@ e_type_from_key(Arena *arena, E_TypeKey key)
E_Member *mem = &n->v;
mem->kind = E_MemberKind_DataField;
mem->name = str8_lit("u64s");
mem->type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_U64), reg_byte_count/8);
mem->type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_U64), reg_byte_count/8, 0);
}
if(type->byte_size > 4 && type->byte_size%4 == 0)
{
@@ -1065,7 +1085,7 @@ e_type_from_key(Arena *arena, E_TypeKey key)
E_Member *mem = &n->v;
mem->kind = E_MemberKind_DataField;
mem->name = str8_lit("u32s");
mem->type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_U32), reg_byte_count/4);
mem->type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_U32), reg_byte_count/4, 0);
}
if(type->byte_size > 2 && type->byte_size%2 == 0)
{
@@ -1075,7 +1095,7 @@ e_type_from_key(Arena *arena, E_TypeKey key)
E_Member *mem = &n->v;
mem->kind = E_MemberKind_DataField;
mem->name = str8_lit("u16s");
mem->type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_U16), reg_byte_count/2);
mem->type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_U16), reg_byte_count/2, 0);
}
if(type->byte_size > 1)
{
@@ -1085,7 +1105,7 @@ e_type_from_key(Arena *arena, E_TypeKey key)
E_Member *mem = &n->v;
mem->kind = E_MemberKind_DataField;
mem->name = str8_lit("u8s");
mem->type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_U8), reg_byte_count);
mem->type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_U8), reg_byte_count, 0);
}
if(type->byte_size > 4 && type->byte_size%4 == 0)
{
@@ -1095,7 +1115,7 @@ e_type_from_key(Arena *arena, E_TypeKey key)
E_Member *mem = &n->v;
mem->kind = E_MemberKind_DataField;
mem->name = str8_lit("f32s");
mem->type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_F32), reg_byte_count/4);
mem->type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_F32), reg_byte_count/4, 0);
}
if(type->byte_size > 8 && type->byte_size%8 == 0)
{
@@ -1105,7 +1125,7 @@ e_type_from_key(Arena *arena, E_TypeKey key)
E_Member *mem = &n->v;
mem->kind = E_MemberKind_DataField;
mem->name = str8_lit("f64s");
mem->type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_F64), reg_byte_count/8);
mem->type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_F64), reg_byte_count/8, 0);
}
}
}
@@ -1179,10 +1199,8 @@ e_type_direct_from_key(E_TypeKey key)
case E_TypeKeyKind_Ext:
case E_TypeKeyKind_Cons:
{
Temp scratch = scratch_begin(0, 0);
E_Type *type = e_type_from_key(scratch.arena, key);
E_Type *type = e_type_from_key__cached(key);
result = type->direct_type_key;
scratch_end(scratch);
}break;
}
return result;
@@ -1198,10 +1216,8 @@ e_type_owner_from_key(E_TypeKey key)
case E_TypeKeyKind_Ext:
case E_TypeKeyKind_Cons:
{
Temp scratch = scratch_begin(0, 0);
E_Type *type = e_type_from_key(scratch.arena, key);
E_Type *type = e_type_from_key__cached(key);
result = type->owner_type_key;
scratch_end(scratch);
}break;
}
return result;
@@ -1340,21 +1356,18 @@ e_type_match(E_TypeKey l, E_TypeKey r)
case E_TypeKind_Array:
{
Temp scratch = scratch_begin(0, 0);
E_Type *lt = e_type_from_key(scratch.arena, l);
E_Type *rt = e_type_from_key(scratch.arena, r);
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;
}
scratch_end(scratch);
}break;
case E_TypeKind_Function:
{
Temp scratch = scratch_begin(0, 0);
E_Type *lt = e_type_from_key(scratch.arena, l);
E_Type *rt = e_type_from_key(scratch.arena, r);
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;
@@ -1371,14 +1384,12 @@ e_type_match(E_TypeKey l, E_TypeKey r)
}
result = params_match;
}
scratch_end(scratch);
}break;
case E_TypeKind_Method:
{
Temp scratch = scratch_begin(0, 0);
E_Type *lt = e_type_from_key(scratch.arena, l);
E_Type *rt = e_type_from_key(scratch.arena, r);
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))
@@ -1397,7 +1408,6 @@ e_type_match(E_TypeKey l, E_TypeKey r)
}
result = params_match;
}
scratch_end(scratch);
}break;
}
}
@@ -1412,7 +1422,6 @@ 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->pretty_name = push_str8_copy(arena, src->pretty_name);
dst->inheritance_key_chain = e_type_key_list_copy(arena, &src->inheritance_key_chain);
return dst;
}
@@ -1442,7 +1451,7 @@ e_type_data_members_from_key(Arena *arena, E_TypeKey key)
E_MemberList members_list = {0};
B32 members_need_offset_sort = 0;
{
E_Type *root_type = e_type_from_key(scratch.arena, key);
E_Type *root_type = e_type_from_key__cached(key);
typedef struct Task Task;
struct Task
{
@@ -1481,7 +1490,7 @@ e_type_data_members_from_key(Arena *arena, E_TypeKey key)
t->inheritance_chain = e_type_key_list_copy(scratch.arena, &task->inheritance_chain);
e_type_key_list_push(scratch.arena, &t->inheritance_chain, type->members[member_idx].type_key);
t->type_key = type->members[member_idx].type_key;
t->type = e_type_from_key(scratch.arena, type->members[member_idx].type_key);
t->type = e_type_from_key__cached(type->members[member_idx].type_key);
SLLQueuePush(first_task, last_task, t);
members_need_offset_sort = 1;
}
@@ -1564,7 +1573,7 @@ e_type_data_members_from_key(Arena *arena, E_TypeKey key)
E_Member *padding_member = &new_members.v[n->prev_member_idx+padding_idx+1];
MemoryZeroStruct(padding_member);
padding_member->kind = E_MemberKind_Padding;
padding_member->type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_U8), n->size);
padding_member->type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_U8), n->size, 0);
padding_member->off = n->off;
padding_member->name = push_str8f(arena, "[padding %I64u]", padding_idx);
padding_idx += 1;
@@ -1602,26 +1611,21 @@ e_type_lhs_string_from_key(Arena *arena, E_TypeKey key, String8List *out, U32 pr
{
default:
{
Temp scratch = scratch_begin(&arena, 1);
E_Type *type = e_type_from_key(scratch.arena, key);
E_Type *type = e_type_from_key__cached(key);
str8_list_push(arena, out, push_str8_copy(arena, type->name));
str8_list_push(arena, out, str8_lit(" "));
scratch_end(scratch);
}break;
case E_TypeKind_Bitfield:
{
Temp scratch = scratch_begin(&arena, 1);
E_Type *type = e_type_from_key(scratch.arena, key);
E_Type *type = e_type_from_key__cached(key);
e_type_lhs_string_from_key(arena, type->direct_type_key, out, prec, skip_return);
str8_list_pushf(arena, out, ": %I64u", type->count);
scratch_end(scratch);
}break;
case E_TypeKind_Modifier:
{
Temp scratch = scratch_begin(&arena, 1);
E_Type *type = e_type_from_key(scratch.arena, key);
E_Type *type = e_type_from_key__cached(key);
E_TypeKey direct = type->direct_type_key;
e_type_lhs_string_from_key(arena, direct, out, 1, skip_return);
if(type->flags & E_TypeFlag_Const)
@@ -1632,7 +1636,6 @@ e_type_lhs_string_from_key(Arena *arena, E_TypeKey key, String8List *out, U32 pr
{
str8_list_push(arena, out, str8_lit("volatile "));
}
scratch_end(scratch);
}break;
case E_TypeKind_Variadic:
@@ -1646,11 +1649,9 @@ e_type_lhs_string_from_key(Arena *arena, E_TypeKey key, String8List *out, U32 pr
case E_TypeKind_Class:
case E_TypeKind_Alias:
{
Temp scratch = scratch_begin(&arena, 1);
E_Type *type = e_type_from_key(scratch.arena, key);
E_Type *type = e_type_from_key__cached(key);
str8_list_push(arena, out, push_str8_copy(arena, type->name));
str8_list_push(arena, out, str8_lit(" "));
scratch_end(scratch);
}break;
case E_TypeKind_IncompleteStruct: keyword = str8_lit("struct"); goto fwd_udt;
@@ -1659,13 +1660,11 @@ e_type_lhs_string_from_key(Arena *arena, E_TypeKey key, String8List *out, U32 pr
case E_TypeKind_IncompleteClass: keyword = str8_lit("class"); goto fwd_udt;
fwd_udt:;
{
Temp scratch = scratch_begin(&arena, 1);
E_Type *type = e_type_from_key(scratch.arena, key);
E_Type *type = e_type_from_key__cached(key);
str8_list_push(arena, out, keyword);
str8_list_push(arena, out, str8_lit(" "));
str8_list_push(arena, out, push_str8_copy(arena, type->name));
str8_list_push(arena, out, str8_lit(" "));
scratch_end(scratch);
}break;
case E_TypeKind_Array:
@@ -1696,6 +1695,11 @@ e_type_lhs_string_from_key(Arena *arena, E_TypeKey key, String8List *out, U32 pr
E_TypeKey direct = e_type_direct_from_key(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);
if(type->count != 1)
{
str8_list_pushf(arena, out, ".%I64u", type->count);
}
}break;
case E_TypeKind_LRef:
@@ -1714,11 +1718,10 @@ e_type_lhs_string_from_key(Arena *arena, E_TypeKey key, String8List *out, U32 pr
case E_TypeKind_MemberPtr:
{
Temp scratch = scratch_begin(&arena, 1);
E_Type *type = e_type_from_key(scratch.arena, key);
E_Type *type = e_type_from_key__cached(key);
E_TypeKey direct = type->direct_type_key;
e_type_lhs_string_from_key(arena, direct, out, 1, skip_return);
E_Type *container = e_type_from_key(scratch.arena, type->owner_type_key);
E_Type *container = e_type_from_key__cached(type->owner_type_key);
if(container->kind != E_TypeKind_Null)
{
str8_list_push(arena, out, push_str8_copy(arena, container->name));
@@ -1728,7 +1731,6 @@ e_type_lhs_string_from_key(Arena *arena, E_TypeKey key, String8List *out, U32 pr
str8_list_push(arena, out, str8_lit("<unknown-class>"));
}
str8_list_push(arena, out, str8_lit("::*"));
scratch_end(scratch);
}break;
}
}
@@ -1759,8 +1761,7 @@ e_type_rhs_string_from_key(Arena *arena, E_TypeKey key, String8List *out, U32 pr
case E_TypeKind_Array:
{
Temp scratch = scratch_begin(&arena, 1);
E_Type *type = e_type_from_key(scratch.arena, key);
E_Type *type = e_type_from_key__cached(key);
if(prec == 1)
{
str8_list_push(arena, out, str8_lit(")"));
@@ -1771,13 +1772,11 @@ 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_type_rhs_string_from_key(arena, direct, out, 2);
scratch_end(scratch);
}break;
case E_TypeKind_Function:
{
Temp scratch = scratch_begin(&arena, 1);
E_Type *type = e_type_from_key(scratch.arena, key);
E_Type *type = e_type_from_key__cached(key);
if(prec == 1)
{
str8_list_push(arena, out, str8_lit(")"));
@@ -1806,7 +1805,6 @@ e_type_rhs_string_from_key(Arena *arena, E_TypeKey key, String8List *out, U32 pr
}
E_TypeKey direct = e_type_direct_from_key(key);
e_type_rhs_string_from_key(arena, direct, out, 2);
scratch_end(scratch);
}break;
}
}
@@ -1846,9 +1844,74 @@ e_type_key_list_copy(Arena *arena, E_TypeKeyList *src)
return dst;
}
internal E_String2TypeKeyMap
e_string2typekey_map_make(Arena *arena, U64 slots_count)
{
E_String2TypeKeyMap map = {0};
map.slots_count = slots_count;
map.slots = push_array(arena, E_String2TypeKeySlot, map.slots_count);
return map;
}
internal void
e_string2typekey_map_insert(Arena *arena, E_String2TypeKeyMap *map, String8 string, E_TypeKey key)
{
E_String2TypeKeyNode *n = push_array(arena, E_String2TypeKeyNode, 1);
U64 hash = e_hash_from_string(5381, string);
U64 slot_idx = hash%map->slots_count;
SLLQueuePush(map->slots[slot_idx].first, map->slots[slot_idx].last, n);
n->string = push_str8_copy(arena, string);
n->key = key;
}
internal E_TypeKey
e_string2typekey_map_lookup(E_String2TypeKeyMap *map, String8 string)
{
E_TypeKey key = zero_struct;
U64 hash = e_hash_from_string(5381, string);
U64 slot_idx = hash%map->slots_count;
for(E_String2TypeKeyNode *n = map->slots[slot_idx].first; n != 0; n = n->next)
{
if(str8_match(n->string, string, 0))
{
key = n->key;
break;
}
}
return key;
}
////////////////////////////////
//~ rjf: Cache Lookups
internal E_Type *
e_type_from_key__cached(E_TypeKey key)
{
E_Type *type = &e_type_nil;
{
U64 hash = e_hash_from_string(5381, str8_struct(&key));
U64 slot_idx = hash%e_type_state->type_cache_slots_count;
E_TypeCacheNode *node = 0;
for(E_TypeCacheNode *n = e_type_state->type_cache_slots[slot_idx].first; n != 0; n = n->next)
{
if(e_type_key_match(key, n->key))
{
node = n;
break;
}
}
if(node == 0)
{
node = push_array(e_type_state->arena, E_TypeCacheNode, 1);
node->key = key;
node->type = e_type_from_key(e_type_state->arena, key);
SLLQueuePush(e_type_state->type_cache_slots[slot_idx].first, e_type_state->type_cache_slots[slot_idx].last, node);
}
type = node->type;
}
return type;
}
internal E_MemberCacheNode *
e_member_cache_node_from_type_key(E_TypeKey key)
{
@@ -1872,6 +1935,8 @@ e_member_cache_node_from_type_key(E_TypeKey key)
node->members = e_type_data_members_from_key(e_type_state->arena, key);
node->member_hash_slots_count = node->members.count;
node->member_hash_slots = push_array(e_type_state->arena, E_MemberHashSlot, node->member_hash_slots_count);
node->member_filter_slots_count = 16;
node->member_filter_slots = push_array(e_type_state->arena, E_MemberFilterSlot, node->member_filter_slots_count);
for EachIndex(idx, node->members.count)
{
U64 hash = e_hash_from_string(5381, node->members.v[idx].name);
@@ -1884,6 +1949,55 @@ e_member_cache_node_from_type_key(E_TypeKey key)
return node;
}
internal E_MemberArray
e_type_data_members_from_key_filter__cached(E_TypeKey key, String8 filter)
{
E_MemberArray members = {0};
E_MemberCacheNode *node = e_member_cache_node_from_type_key(key);
if(node != 0)
{
if(filter.size == 0)
{
members = node->members;
}
else
{
U64 hash = e_hash_from_string(5381, filter);
U64 slot_idx = hash%node->member_filter_slots_count;
E_MemberFilterSlot *slot = &node->member_filter_slots[slot_idx];
E_MemberFilterNode *filter_node = 0;
for(E_MemberFilterNode *n = slot->first; n != 0; n = n->next)
{
if(str8_match(n->filter, filter, 0))
{
filter_node = n;
break;
}
}
if(filter_node == 0)
{
Temp scratch = scratch_begin(0, 0);
filter_node = push_array(e_type_state->arena, E_MemberFilterNode, 1);
filter_node->filter = push_str8_copy(e_type_state->arena, filter);
E_MemberList member_list__filtered = {0};
for EachIndex(idx, node->members.count)
{
E_Member *member = &node->members.v[idx];
FuzzyMatchRangeList matches = fuzzy_match_find(scratch.arena, filter, member->name);
if(matches.count == matches.needle_part_count)
{
e_member_list_push(scratch.arena, &member_list__filtered, member);
}
}
filter_node->members_filtered = e_member_array_from_list(e_type_state->arena, &member_list__filtered);
scratch_end(scratch);
}
members = filter_node->members_filtered;
}
}
return members;
}
internal E_MemberArray
e_type_data_members_from_key__cached(E_TypeKey key)
{
+82 -10
View File
@@ -59,6 +59,7 @@ typedef enum E_MemberKind
E_MemberKind_VirtualBase,
E_MemberKind_NestedType,
E_MemberKind_Padding,
E_MemberKind_Query,
E_MemberKind_COUNT
}
E_MemberKind;
@@ -66,12 +67,13 @@ E_MemberKind;
typedef U32 E_TypeFlags;
enum
{
E_TypeFlag_Const = (1<<0),
E_TypeFlag_Volatile = (1<<1),
E_TypeFlag_External = (1<<2),
E_TypeFlag_IsPlainText= (1<<3),
E_TypeFlag_IsCodeText = (1<<4),
E_TypeFlag_IsPathText = (1<<5),
E_TypeFlag_Const = (1<<0),
E_TypeFlag_Volatile = (1<<1),
E_TypeFlag_External = (1<<2),
E_TypeFlag_IsPlainText = (1<<3),
E_TypeFlag_IsCodeText = (1<<4),
E_TypeFlag_IsPathText = (1<<5),
E_TypeFlag_EditableChildren = (1<<6),
};
typedef struct E_Member E_Member;
@@ -80,7 +82,6 @@ struct E_Member
E_MemberKind kind;
E_TypeKey type_key;
String8 name;
String8 pretty_name;
U64 off;
E_TypeKeyList inheritance_key_chain;
};
@@ -129,7 +130,9 @@ struct E_Type
String8 name;
U64 byte_size;
U64 count;
U64 depth;
U32 off;
Arch arch;
E_TypeKey direct_type_key;
E_TypeKey owner_type_key;
E_TypeKey *param_type_keys;
@@ -137,6 +140,31 @@ struct E_Type
E_EnumVal *enum_vals;
};
////////////////////////////////
//~ rjf: String -> Type Key Map Data Structure
typedef struct E_String2TypeKeyNode E_String2TypeKeyNode;
struct E_String2TypeKeyNode
{
E_String2TypeKeyNode *next;
String8 string;
E_TypeKey key;
};
typedef struct E_String2TypeKeySlot E_String2TypeKeySlot;
struct E_String2TypeKeySlot
{
E_String2TypeKeyNode *first;
E_String2TypeKeyNode *last;
};
typedef struct E_String2TypeKeyMap E_String2TypeKeyMap;
struct E_String2TypeKeyMap
{
U64 slots_count;
E_String2TypeKeySlot *slots;
};
////////////////////////////////
//~ rjf: Evaluation Context
@@ -151,6 +179,7 @@ struct E_ConsTypeParams
String8 name;
E_TypeKey direct_key;
U64 count;
U64 depth;
E_Member *members;
E_EnumVal *enum_vals;
};
@@ -172,6 +201,23 @@ struct E_ConsTypeSlot
E_ConsTypeNode *last;
};
//- rjf: unpacked type cache
typedef struct E_TypeCacheNode E_TypeCacheNode;
struct E_TypeCacheNode
{
E_TypeCacheNode *next;
E_TypeKey key;
E_Type *type;
};
typedef struct E_TypeCacheSlot E_TypeCacheSlot;
struct E_TypeCacheSlot
{
E_TypeCacheNode *first;
E_TypeCacheNode *last;
};
//- rjf: member lookup cache types
typedef struct E_MemberHashNode E_MemberHashNode;
@@ -188,6 +234,21 @@ struct E_MemberHashSlot
E_MemberHashNode *last;
};
typedef struct E_MemberFilterNode E_MemberFilterNode;
struct E_MemberFilterNode
{
E_MemberFilterNode *next;
String8 filter;
E_MemberArray members_filtered;
};
typedef struct E_MemberFilterSlot E_MemberFilterSlot;
struct E_MemberFilterSlot
{
E_MemberFilterNode *first;
E_MemberFilterNode *last;
};
typedef struct E_MemberCacheNode E_MemberCacheNode;
struct E_MemberCacheNode
{
@@ -196,6 +257,8 @@ struct E_MemberCacheNode
E_MemberArray members;
U64 member_hash_slots_count;
E_MemberHashSlot *member_hash_slots;
U64 member_filter_slots_count;
E_MemberFilterSlot *member_filter_slots;
};
typedef struct E_MemberCacheSlot E_MemberCacheSlot;
@@ -241,6 +304,10 @@ struct E_TypeState
// rjf: member cache table
U64 member_cache_slots_count;
E_MemberCacheSlot *member_cache_slots;
// rjf: unpacked type cache
U64 type_cache_slots_count;
E_TypeCacheSlot *type_cache_slots;
};
////////////////////////////////
@@ -292,15 +359,15 @@ internal E_TypeKey e_type_key_cons_(E_ConsTypeParams *params);
#define e_type_key_cons(...) e_type_key_cons_(&(E_ConsTypeParams){.kind = E_TypeKind_Null, __VA_ARGS__})
//- rjf: constructed type construction helpers
internal E_TypeKey e_type_key_cons_array(E_TypeKey element_type_key, U64 count);
internal E_TypeKey e_type_key_cons_ptr(Arch arch, E_TypeKey element_type_key, E_TypeFlags flags);
internal E_TypeKey e_type_key_cons_array(E_TypeKey element_type_key, U64 count, E_TypeFlags flags);
internal E_TypeKey e_type_key_cons_ptr(Arch arch, E_TypeKey element_type_key, U64 count, E_TypeFlags flags);
internal E_TypeKey e_type_key_cons_base(Type *type);
//- rjf: basic type key functions
internal B32 e_type_key_match(E_TypeKey l, E_TypeKey r);
//- rjf: key -> info extraction
internal U64 e_hash_from_type_key(E_TypeKey key);
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);
@@ -322,11 +389,16 @@ internal String8 e_type_string_from_key(Arena *arena, E_TypeKey key);
//- rjf: type key data structures
internal void e_type_key_list_push(Arena *arena, E_TypeKeyList *list, E_TypeKey key);
internal E_TypeKeyList e_type_key_list_copy(Arena *arena, E_TypeKeyList *src);
internal E_String2TypeKeyMap e_string2typekey_map_make(Arena *arena, U64 slots_count);
internal void e_string2typekey_map_insert(Arena *arena, E_String2TypeKeyMap *map, String8 string, E_TypeKey key);
internal E_TypeKey e_string2typekey_map_lookup(E_String2TypeKeyMap *map, String8 string);
////////////////////////////////
//~ rjf: Cache Lookups
internal E_Type *e_type_from_key__cached(E_TypeKey key);
internal E_MemberCacheNode *e_member_cache_node_from_type_key(E_TypeKey key);
internal E_MemberArray e_type_data_members_from_key_filter__cached(E_TypeKey key, String8 filter);
internal E_MemberArray e_type_data_members_from_key__cached(E_TypeKey key);
internal E_Member e_type_member_from_key_name__cached(E_TypeKey key, String8 name);
+9 -3
View File
@@ -14,7 +14,7 @@ str8_lit_comp("CharLiteral"),
str8_lit_comp("Symbol"),
};
String8 e_expr_kind_strings[48] =
String8 e_expr_kind_strings[51] =
{
str8_lit_comp("Nil"),
str8_lit_comp("Ref"),
@@ -49,6 +49,7 @@ str8_lit_comp("BitOr"),
str8_lit_comp("LogAnd"),
str8_lit_comp("LogOr"),
str8_lit_comp("Ternary"),
str8_lit_comp("Call"),
str8_lit_comp("LeafBytecode"),
str8_lit_comp("LeafMember"),
str8_lit_comp("LeafStringLiteral"),
@@ -58,12 +59,14 @@ str8_lit_comp("LeafF64"),
str8_lit_comp("LeafF32"),
str8_lit_comp("LeafIdent"),
str8_lit_comp("LeafOffset"),
str8_lit_comp("LeafValue"),
str8_lit_comp("LeafFilePath"),
str8_lit_comp("TypeIdent"),
str8_lit_comp("Ptr"),
str8_lit_comp("Array"),
str8_lit_comp("Func"),
str8_lit_comp("Define"),
str8_lit_comp("Tag"),
};
String8 e_interpretation_code_display_strings[11] =
@@ -81,7 +84,7 @@ str8_lit_comp("Insufficient evaluation machine stack space."),
str8_lit_comp("Malformed bytecode."),
};
E_OpInfo e_expr_kind_op_info_table[48] =
E_OpInfo e_expr_kind_op_info_table[51] =
{
{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") },
{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") },
@@ -116,6 +119,8 @@ E_OpInfo e_expr_kind_op_info_table[48] =
{ E_OpKind_Binary, 11, str8_lit_comp(""), str8_lit_comp("&&"), str8_lit_comp("") },
{ E_OpKind_Binary, 12, str8_lit_comp(""), str8_lit_comp("||"), str8_lit_comp("") },
{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp("?"), str8_lit_comp(":") },
{ E_OpKind_Null, 0, str8_lit_comp("("), str8_lit_comp(","), str8_lit_comp(")") },
{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") },
{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") },
{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") },
{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") },
@@ -131,6 +136,7 @@ E_OpInfo e_expr_kind_op_info_table[48] =
{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") },
{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") },
{ E_OpKind_Binary, 13, str8_lit_comp(""), str8_lit_comp("="), str8_lit_comp("") },
{ E_OpKind_Null, 0, str8_lit_comp("=>"), str8_lit_comp(","), str8_lit_comp("") },
};
U8 e_kind_basic_byte_size_table[56] =
@@ -250,7 +256,7 @@ str8_lit_comp("class"),
str8_lit_comp("enum"),
str8_lit_comp("bitfield"),
str8_lit_comp("variadic"),
str8_lit_comp("collection"),
str8_lit_comp("set"),
};
C_LINKAGE_END
+6 -3
View File
@@ -74,7 +74,7 @@ E_TypeKind_IncompleteClass,
E_TypeKind_IncompleteEnum,
E_TypeKind_Bitfield,
E_TypeKind_Variadic,
E_TypeKind_Collection,
E_TypeKind_Set,
E_TypeKind_COUNT,
E_TypeKind_FirstBasic = E_TypeKind_Void,
E_TypeKind_LastBasic = E_TypeKind_ComplexF128,
@@ -124,6 +124,7 @@ E_ExprKind_BitOr,
E_ExprKind_LogAnd,
E_ExprKind_LogOr,
E_ExprKind_Ternary,
E_ExprKind_Call,
E_ExprKind_LeafBytecode,
E_ExprKind_LeafMember,
E_ExprKind_LeafStringLiteral,
@@ -133,12 +134,14 @@ E_ExprKind_LeafF64,
E_ExprKind_LeafF32,
E_ExprKind_LeafIdent,
E_ExprKind_LeafOffset,
E_ExprKind_LeafValue,
E_ExprKind_LeafFilePath,
E_ExprKind_TypeIdent,
E_ExprKind_Ptr,
E_ExprKind_Array,
E_ExprKind_Func,
E_ExprKind_Define,
E_ExprKind_Tag,
E_ExprKind_COUNT,
} E_ExprKindEnum;
@@ -160,9 +163,9 @@ E_InterpretationCode_COUNT,
C_LINKAGE_BEGIN
extern String8 e_token_kind_strings[6];
extern String8 e_expr_kind_strings[48];
extern String8 e_expr_kind_strings[51];
extern String8 e_interpretation_code_display_strings[11];
extern E_OpInfo e_expr_kind_op_info_table[48];
extern E_OpInfo e_expr_kind_op_info_table[51];
extern U8 e_kind_basic_byte_size_table[56];
extern String8 e_kind_basic_string_table[56];