mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-08-03 04:28:12 +00:00
dead code deletion, begin extending eval/eval-viz to work on expr-chains rather than single expressions; fixes / convergence for watch window
This commit is contained in:
+11
-3
@@ -6,9 +6,17 @@
|
||||
|
||||
internal E_Eval
|
||||
e_eval_from_expr(Arena *arena, E_Expr *expr)
|
||||
{
|
||||
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, expr);
|
||||
E_IRTreeAndType irtree = e_irtree_and_type_from_expr(arena, exprs.last);
|
||||
E_OpList oplist = e_oplist_from_irtree(arena, irtree.root);
|
||||
String8 bytecode = e_bytecode_from_oplist(arena, &oplist);
|
||||
E_Interpretation interp = e_interpret(bytecode);
|
||||
@@ -17,7 +25,7 @@ e_eval_from_expr(Arena *arena, E_Expr *expr)
|
||||
.value = interp.value,
|
||||
.mode = irtree.mode,
|
||||
.space = interp.space,
|
||||
.expr = expr,
|
||||
.exprs = exprs,
|
||||
.type_key = irtree.type_key,
|
||||
.code = interp.code,
|
||||
};
|
||||
@@ -35,7 +43,7 @@ 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.last_expr);
|
||||
E_Eval eval = e_eval_from_exprs(arena, parse.exprs);
|
||||
e_msg_list_concat_in_place(&eval.msgs, &parse.msgs);
|
||||
return eval;
|
||||
}
|
||||
|
||||
@@ -13,7 +13,7 @@ struct E_Eval
|
||||
E_Value value;
|
||||
E_Mode mode;
|
||||
E_Space space;
|
||||
E_Expr *expr;
|
||||
E_ExprChain exprs;
|
||||
E_TypeKey type_key;
|
||||
E_InterpretationCode code;
|
||||
E_MsgList msgs;
|
||||
@@ -23,6 +23,7 @@ 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);
|
||||
|
||||
+22
-15
@@ -166,11 +166,15 @@ E_LOOKUP_INFO_FUNCTION_DEF(default)
|
||||
}
|
||||
else if(lhs_type_kind == E_TypeKind_Struct ||
|
||||
lhs_type_kind == E_TypeKind_Class ||
|
||||
lhs_type_kind == E_TypeKind_Union ||
|
||||
lhs_type_kind == E_TypeKind_Enum)
|
||||
lhs_type_kind == E_TypeKind_Union)
|
||||
{
|
||||
E_Type *lhs_type = e_type_from_key__cached(lhs_type_key);
|
||||
lookup_info.named_expr_count = lhs_type->count;
|
||||
E_MemberArray data_members = e_type_data_members_from_key__cached(lhs_type_key);
|
||||
lookup_info.named_expr_count = data_members.count;
|
||||
}
|
||||
else if(lhs_type_kind == E_TypeKind_Enum)
|
||||
{
|
||||
E_Type *direct_type = e_type_from_key__cached(lhs_type_key);
|
||||
lookup_info.named_expr_count = direct_type->count;
|
||||
}
|
||||
else if(lhs_type_kind == E_TypeKind_Array)
|
||||
{
|
||||
@@ -570,12 +574,10 @@ E_IRGEN_FUNCTION_DEF(array)
|
||||
E_TypeKind type_kind = e_type_kind_from_key(type_key);
|
||||
if(e_type_kind_is_pointer_or_ref(type_kind))
|
||||
{
|
||||
Temp scratch = scratch_begin(&arena, 1);
|
||||
E_Eval count_eval = e_eval_from_expr(scratch.arena, tag->first->next);
|
||||
E_Value count_value = e_value_from_expr(tag->first->next);
|
||||
E_TypeKey element_type_key = e_type_ptee_from_key(type_key);
|
||||
E_TypeKey ptr_type_key = e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, element_type_key, count_eval.value.u64, 0);
|
||||
E_TypeKey ptr_type_key = e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, element_type_key, count_value.u64, 0);
|
||||
irtree.type_key = ptr_type_key;
|
||||
scratch_end(scratch);
|
||||
}
|
||||
return irtree;
|
||||
}
|
||||
@@ -617,9 +619,8 @@ E_IRGEN_FUNCTION_DEF(slice)
|
||||
if(count_member != 0)
|
||||
{
|
||||
E_Expr *count_member_expr = e_expr_irext_member_access(arena, expr, &irtree, count_member->name);
|
||||
E_Eval count_member_eval = e_eval_from_expr(scratch.arena, count_member_expr);
|
||||
E_Eval count_member_value_eval = e_value_eval_from_eval(count_member_eval);
|
||||
count = count_member_value_eval.value.u64;
|
||||
E_Value count_member_value = e_value_from_expr(count_member_expr);
|
||||
count = count_member_value.u64;
|
||||
}
|
||||
|
||||
// rjf: generate new struct slice type
|
||||
@@ -760,14 +761,14 @@ e_auto_hook_map_insert_new_(Arena *arena, E_AutoHookMap *map, E_AutoHookParams *
|
||||
{
|
||||
E_TokenArray tokens = e_token_array_from_text(scratch.arena, params->type_pattern);
|
||||
E_Parse parse = e_parse_type_from_text_tokens(scratch.arena, params->type_pattern, &tokens);
|
||||
E_IRTreeAndType irtree = e_irtree_and_type_from_expr(scratch.arena, parse.last_expr);
|
||||
E_IRTreeAndType irtree = e_irtree_and_type_from_expr(scratch.arena, parse.exprs.last);
|
||||
type_key = irtree.type_key;
|
||||
}
|
||||
E_AutoHookNode *node = push_array(arena, E_AutoHookNode, 1);
|
||||
node->type_key = type_key;
|
||||
U8 pattern_split = '?';
|
||||
node->type_pattern_parts = str8_split(arena, params->type_pattern, &pattern_split, 1, 0);
|
||||
node->tag_expr = e_parse_expr_from_text(arena, push_str8_copy(arena, params->tag_expr_string));
|
||||
node->tag_exprs = e_parse_expr_from_text(arena, push_str8_copy(arena, params->tag_expr_string)).exprs;
|
||||
if(!e_type_key_match(e_type_key_zero(), type_key))
|
||||
{
|
||||
U64 hash = e_hash_from_string(5381, str8_struct(&type_key));
|
||||
@@ -800,7 +801,10 @@ e_auto_hook_tag_exprs_from_type_key(Arena *arena, E_TypeKey type_key)
|
||||
{
|
||||
if(e_type_key_match(n->type_key, type_key))
|
||||
{
|
||||
e_expr_list_push(arena, &exprs, n->tag_expr);
|
||||
for(E_Expr *e = n->tag_exprs.first; e != &e_expr_nil; e = e->next)
|
||||
{
|
||||
e_expr_list_push(arena, &exprs, e);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -829,7 +833,10 @@ e_auto_hook_tag_exprs_from_type_key(Arena *arena, E_TypeKey type_key)
|
||||
}
|
||||
if(fits_this_type_string)
|
||||
{
|
||||
e_expr_list_push(arena, &exprs, auto_hook_node->tag_expr);
|
||||
for(E_Expr *e = auto_hook_node->tag_exprs.first; e != &e_expr_nil; e = e->next)
|
||||
{
|
||||
e_expr_list_push(arena, &exprs, e);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -189,7 +189,7 @@ struct E_AutoHookNode
|
||||
E_AutoHookNode *pattern_order_next;
|
||||
E_TypeKey type_key;
|
||||
String8List type_pattern_parts;
|
||||
E_Expr *tag_expr;
|
||||
E_ExprChain tag_exprs;
|
||||
};
|
||||
|
||||
typedef struct E_AutoHookSlot E_AutoHookSlot;
|
||||
|
||||
+30
-30
@@ -660,7 +660,7 @@ internal E_Expr *
|
||||
e_push_expr(Arena *arena, E_ExprKind kind, void *location)
|
||||
{
|
||||
E_Expr *e = push_array(arena, E_Expr, 1);
|
||||
e->first = e->last = e->next = e->ref = e->first_tag = e->last_tag = &e_expr_nil;
|
||||
e->first = e->last = e->next = e->prev = e->ref = e->first_tag = e->last_tag = &e_expr_nil;
|
||||
e->location = location;
|
||||
e->kind = kind;
|
||||
return e;
|
||||
@@ -1110,14 +1110,14 @@ e_parse_type_from_text_tokens(Arena *arena, String8 text, E_TokenArray *tokens)
|
||||
}
|
||||
|
||||
// rjf: construct leaf type
|
||||
parse.first_expr = parse.last_expr = e_push_expr(arena, E_ExprKind_TypeIdent, token_string.str);
|
||||
parse.first_expr->type_key = type_key;
|
||||
parse.exprs.first = parse.exprs.last = e_push_expr(arena, E_ExprKind_TypeIdent, token_string.str);
|
||||
parse.exprs.first->type_key = type_key;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//- rjf: parse extensions
|
||||
if(parse.first_expr != &e_expr_nil)
|
||||
if(parse.exprs.first != &e_expr_nil)
|
||||
{
|
||||
for(;;)
|
||||
{
|
||||
@@ -1130,9 +1130,9 @@ e_parse_type_from_text_tokens(Arena *arena, String8 text, E_TokenArray *tokens)
|
||||
if(str8_match(token_string, str8_lit("*"), 0))
|
||||
{
|
||||
token_it += 1;
|
||||
E_Expr *ptee = parse.first_expr;
|
||||
parse.first_expr = parse.last_expr = e_push_expr(arena, E_ExprKind_Ptr, token_string.str);
|
||||
e_expr_push_child(parse.first_expr, ptee);
|
||||
E_Expr *ptee = parse.exprs.first;
|
||||
parse.exprs.first = parse.exprs.last = e_push_expr(arena, E_ExprKind_Ptr, token_string.str);
|
||||
e_expr_push_child(parse.exprs.first, ptee);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -1246,7 +1246,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to
|
||||
// rjf: parse type expr
|
||||
E_TokenArray type_parse_tokens = e_token_array_make_first_opl(it, it_opl);
|
||||
E_Parse type_parse = e_parse_type_from_text_tokens(arena, text, &type_parse_tokens);
|
||||
E_Expr *type = type_parse.last_expr;
|
||||
E_Expr *type = type_parse.exprs.last;
|
||||
e_msg_list_concat_in_place(&result.msgs, &type_parse.msgs);
|
||||
it = type_parse.last_token;
|
||||
location = token_string.str;
|
||||
@@ -1329,7 +1329,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to
|
||||
E_TokenArray nested_parse_tokens = e_token_array_make_first_opl(it, it_opl);
|
||||
E_Parse nested_parse = e_parse_expr_from_text_tokens__prec(arena, text, &nested_parse_tokens, e_max_precedence, 1);
|
||||
e_msg_list_concat_in_place(&result.msgs, &nested_parse.msgs);
|
||||
atom = nested_parse.last_expr;
|
||||
atom = nested_parse.exprs.last;
|
||||
it = nested_parse.last_token;
|
||||
|
||||
// rjf: expect )
|
||||
@@ -1357,11 +1357,11 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to
|
||||
E_TokenArray nested_parse_tokens = e_token_array_make_first_opl(it, it_opl);
|
||||
E_Parse nested_parse = e_parse_expr_from_text_tokens__prec(arena, text, &nested_parse_tokens, e_max_precedence, 1);
|
||||
e_msg_list_concat_in_place(&result.msgs, &nested_parse.msgs);
|
||||
atom = nested_parse.last_expr;
|
||||
atom = nested_parse.exprs.last;
|
||||
it = nested_parse.last_token;
|
||||
|
||||
// rjf: build cast-to-U64*, and dereference operators
|
||||
if(nested_parse.last_expr == &e_expr_nil)
|
||||
if(nested_parse.exprs.last == &e_expr_nil)
|
||||
{
|
||||
e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, token_string.str, "Expected expression following `[`.");
|
||||
}
|
||||
@@ -1737,7 +1737,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to
|
||||
{
|
||||
E_TokenArray type_parse_tokens = e_token_array_make_first_opl(it-1, it_opl);
|
||||
E_Parse type_parse = e_parse_type_from_text_tokens(arena, text, &type_parse_tokens);
|
||||
E_Expr *type = type_parse.last_expr;
|
||||
E_Expr *type = type_parse.exprs.last;
|
||||
e_msg_list_concat_in_place(&result.msgs, &type_parse.msgs);
|
||||
it = type_parse.last_token;
|
||||
atom = type;
|
||||
@@ -2015,10 +2015,10 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to
|
||||
it = idx_expr_parse.last_token;
|
||||
|
||||
// rjf: valid indexing expression => produce index expr
|
||||
if(idx_expr_parse.last_expr != &e_expr_nil)
|
||||
if(idx_expr_parse.exprs.last != &e_expr_nil)
|
||||
{
|
||||
E_Expr *array_expr = atom;
|
||||
E_Expr *index_expr = idx_expr_parse.last_expr;
|
||||
E_Expr *index_expr = idx_expr_parse.exprs.last;
|
||||
atom = e_push_expr(arena, E_ExprKind_ArrayIndex, token_string.str);
|
||||
e_expr_push_child(atom, array_expr);
|
||||
e_expr_push_child(atom, index_expr);
|
||||
@@ -2055,11 +2055,11 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to
|
||||
E_Parse args_parse = e_parse_expr_from_text_tokens__prec(arena, text, &args_parse_tokens, e_max_precedence, max_U64);
|
||||
e_msg_list_concat_in_place(&result.msgs, &args_parse.msgs);
|
||||
it = args_parse.last_token;
|
||||
if(args_parse.first_expr != &e_expr_nil)
|
||||
if(args_parse.exprs.first != &e_expr_nil)
|
||||
{
|
||||
call_expr->last->next = args_parse.first_expr;
|
||||
args_parse.first_expr->prev = call_expr->last;
|
||||
call_expr->last = args_parse.last_expr;
|
||||
call_expr->last->next = args_parse.exprs.first;
|
||||
args_parse.exprs.first->prev = call_expr->last;
|
||||
call_expr->last = args_parse.exprs.last;
|
||||
}
|
||||
atom = call_expr;
|
||||
|
||||
@@ -2153,7 +2153,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to
|
||||
E_TokenArray rhs_expr_parse_tokens = e_token_array_make_first_opl(it+1, it_opl);
|
||||
E_Parse rhs_expr_parse = e_parse_expr_from_text_tokens__prec(arena, text, &rhs_expr_parse_tokens, binary_precedence-1, 1);
|
||||
e_msg_list_concat_in_place(&result.msgs, &rhs_expr_parse.msgs);
|
||||
E_Expr *rhs = rhs_expr_parse.last_expr;
|
||||
E_Expr *rhs = rhs_expr_parse.exprs.last;
|
||||
it = rhs_expr_parse.last_token;
|
||||
if(rhs == &e_expr_nil)
|
||||
{
|
||||
@@ -2179,9 +2179,9 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to
|
||||
E_TokenArray middle_expr_tokens = e_token_array_make_first_opl(it, it_opl);
|
||||
E_Parse middle_expr_parse = e_parse_expr_from_text_tokens__prec(arena, text, &middle_expr_tokens, e_max_precedence, 1);
|
||||
it = middle_expr_parse.last_token;
|
||||
E_Expr *middle_expr = middle_expr_parse.last_expr;
|
||||
E_Expr *middle_expr = middle_expr_parse.exprs.last;
|
||||
e_msg_list_concat_in_place(&result.msgs, &middle_expr_parse.msgs);
|
||||
if(middle_expr_parse.last_expr == &e_expr_nil)
|
||||
if(middle_expr_parse.exprs.last == &e_expr_nil)
|
||||
{
|
||||
e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, token_string.str, "Expected expression after `?`.");
|
||||
}
|
||||
@@ -2213,7 +2213,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to
|
||||
{
|
||||
it = rhs_expr_parse.last_token;
|
||||
e_msg_list_concat_in_place(&result.msgs, &rhs_expr_parse.msgs);
|
||||
if(rhs_expr_parse.last_expr == &e_expr_nil)
|
||||
if(rhs_expr_parse.exprs.last == &e_expr_nil)
|
||||
{
|
||||
e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, colon_token_string.str, "Expected expression after `:`.");
|
||||
}
|
||||
@@ -2221,12 +2221,12 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to
|
||||
|
||||
// rjf: build ternary
|
||||
if(atom != &e_expr_nil &&
|
||||
middle_expr_parse.last_expr != &e_expr_nil &&
|
||||
rhs_expr_parse.last_expr != &e_expr_nil)
|
||||
middle_expr_parse.exprs.last != &e_expr_nil &&
|
||||
rhs_expr_parse.exprs.last != &e_expr_nil)
|
||||
{
|
||||
E_Expr *lhs = atom;
|
||||
E_Expr *mhs = middle_expr_parse.last_expr;
|
||||
E_Expr *rhs = rhs_expr_parse.last_expr;
|
||||
E_Expr *mhs = middle_expr_parse.exprs.last;
|
||||
E_Expr *rhs = rhs_expr_parse.exprs.last;
|
||||
atom = e_push_expr(arena, E_ExprKind_Ternary, token_string.str);
|
||||
e_expr_push_child(atom, lhs);
|
||||
e_expr_push_child(atom, mhs);
|
||||
@@ -2244,7 +2244,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to
|
||||
E_Parse tags_parse = e_parse_expr_from_text_tokens__prec(arena, text, &tags_tokens, e_max_precedence, max_U64);
|
||||
e_msg_list_concat_in_place(&result.msgs, &tags_parse.msgs);
|
||||
it = tags_parse.last_token;
|
||||
for(E_Expr *tag = tags_parse.first_expr, *next = &e_expr_nil; tag != &e_expr_nil; tag = next)
|
||||
for(E_Expr *tag = tags_parse.exprs.first, *next = &e_expr_nil; tag != &e_expr_nil; tag = next)
|
||||
{
|
||||
next = tag->next;
|
||||
e_expr_push_tag(atom, tag);
|
||||
@@ -2262,7 +2262,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to
|
||||
//- rjf: store parsed atom to expression chain - if we didn't get an expression, break
|
||||
if(atom != &e_expr_nil)
|
||||
{
|
||||
DLLPushBack_NPZ(&e_expr_nil, result.first_expr, result.last_expr, atom, next, prev);
|
||||
DLLPushBack_NPZ(&e_expr_nil, result.exprs.first, result.exprs.last, atom, next, prev);
|
||||
chain_count += 1;
|
||||
}
|
||||
else
|
||||
@@ -2287,14 +2287,14 @@ e_parse_expr_from_text_tokens(Arena *arena, String8 text, E_TokenArray *tokens)
|
||||
return parse;
|
||||
}
|
||||
|
||||
internal E_Expr *
|
||||
internal E_Parse
|
||||
e_parse_expr_from_text(Arena *arena, String8 text)
|
||||
{
|
||||
Temp scratch = scratch_begin(&arena, 1);
|
||||
E_TokenArray tokens = e_token_array_from_text(scratch.arena, text);
|
||||
E_Parse parse = e_parse_expr_from_text_tokens(arena, text, &tokens);
|
||||
scratch_end(scratch);
|
||||
return parse.last_expr;
|
||||
return parse;
|
||||
}
|
||||
|
||||
internal E_Parse
|
||||
|
||||
@@ -68,6 +68,13 @@ struct E_Expr
|
||||
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
|
||||
{
|
||||
@@ -153,8 +160,7 @@ typedef struct E_Parse E_Parse;
|
||||
struct E_Parse
|
||||
{
|
||||
E_Token *last_token;
|
||||
E_Expr *first_expr;
|
||||
E_Expr *last_expr;
|
||||
E_ExprChain exprs;
|
||||
E_MsgList msgs;
|
||||
};
|
||||
|
||||
@@ -289,7 +295,7 @@ internal void e_push_leaf_ident_exprs_from_expr__in_place(Arena *arena, E_String
|
||||
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, 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
|
||||
|
||||
Reference in New Issue
Block a user