mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-07-31 19:30:03 +00:00
merge
This commit is contained in:
+6
-1
@@ -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
@@ -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;
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -93,7 +93,9 @@ typedef U64 E_SpaceKind;
|
||||
enum
|
||||
{
|
||||
E_SpaceKind_Null,
|
||||
E_SpaceKind_File,
|
||||
E_SpaceKind_FileSystem,
|
||||
E_SpaceKind_HashStoreKey,
|
||||
E_SpaceKind_FirstUserDefined,
|
||||
};
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -11,6 +11,7 @@ typedef struct E_Interpretation E_Interpretation;
|
||||
struct E_Interpretation
|
||||
{
|
||||
E_Value value;
|
||||
E_Space space;
|
||||
E_InterpretationCode code;
|
||||
};
|
||||
|
||||
|
||||
+1856
-317
File diff suppressed because it is too large
Load Diff
+362
-6
@@ -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
File diff suppressed because it is too large
Load Diff
+69
-14
@@ -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
@@ -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
@@ -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);
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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];
|
||||
|
||||
|
||||
Reference in New Issue
Block a user