mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-08-06 13:58:40 +00:00
eliminate separate expr -> type path (this is just done via ir tree generation now), eliminate helper for locating defines & pushing to macro maps
This commit is contained in:
+16
-20
@@ -1065,7 +1065,8 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *root_expr)
|
|||||||
// rjf: unpack operands
|
// rjf: unpack operands
|
||||||
E_Expr *cast_type_expr = expr->first;
|
E_Expr *cast_type_expr = expr->first;
|
||||||
E_Expr *casted_expr = cast_type_expr->next;
|
E_Expr *casted_expr = cast_type_expr->next;
|
||||||
E_TypeKey cast_type = e_type_from_expr(cast_type_expr);
|
E_IRTreeAndType cast_irtree = e_irtree_and_type_from_expr(arena, cast_type_expr);
|
||||||
|
E_TypeKey cast_type = cast_irtree.type_key;
|
||||||
E_TypeKind cast_type_kind = e_type_kind_from_key(cast_type);
|
E_TypeKind cast_type_kind = e_type_kind_from_key(cast_type);
|
||||||
U64 cast_type_byte_size = e_type_byte_size_from_key(cast_type);
|
U64 cast_type_byte_size = e_type_byte_size_from_key(cast_type);
|
||||||
E_IRTreeAndType casted_tree = e_irtree_and_type_from_expr(arena, casted_expr);
|
E_IRTreeAndType casted_tree = e_irtree_and_type_from_expr(arena, casted_expr);
|
||||||
@@ -1123,22 +1124,9 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *root_expr)
|
|||||||
E_Expr *r_expr = expr->first;
|
E_Expr *r_expr = expr->first;
|
||||||
E_TypeKey r_type = zero_struct;
|
E_TypeKey r_type = zero_struct;
|
||||||
E_Space space = r_expr->space;
|
E_Space space = r_expr->space;
|
||||||
switch(r_expr->kind)
|
E_IRTreeAndType r_tree = e_irtree_and_type_from_expr(arena, r_expr);
|
||||||
{
|
e_msg_list_concat_in_place(&result.msgs, &r_tree.msgs);
|
||||||
case E_ExprKind_TypeIdent:
|
r_type = r_tree.type_key;
|
||||||
case E_ExprKind_Ptr:
|
|
||||||
case E_ExprKind_Array:
|
|
||||||
case E_ExprKind_Func:
|
|
||||||
{
|
|
||||||
r_type = e_type_from_expr(r_expr);
|
|
||||||
}break;
|
|
||||||
default:
|
|
||||||
{
|
|
||||||
E_IRTreeAndType r_tree = e_irtree_and_type_from_expr(arena, r_expr);
|
|
||||||
e_msg_list_concat_in_place(&result.msgs, &r_tree.msgs);
|
|
||||||
r_type = r_tree.type_key;
|
|
||||||
}break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// rjf: bad conditions? -> error if applicable, exit
|
// rjf: bad conditions? -> error if applicable, exit
|
||||||
if(e_type_key_match(r_type, e_type_key_zero()))
|
if(e_type_key_match(r_type, e_type_key_zero()))
|
||||||
@@ -2253,13 +2241,21 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *root_expr)
|
|||||||
result.type_key = expr->type_key;
|
result.type_key = expr->type_key;
|
||||||
result.mode = E_Mode_Null;
|
result.mode = E_Mode_Null;
|
||||||
}break;
|
}break;
|
||||||
|
|
||||||
//- rjf: (unexpected) type expressions
|
|
||||||
case E_ExprKind_Ptr:
|
case E_ExprKind_Ptr:
|
||||||
|
{
|
||||||
|
E_IRTreeAndType ptee_irtree = e_irtree_and_type_from_expr(arena, expr->first);
|
||||||
|
result = ptee_irtree;
|
||||||
|
result.type_key = e_type_key_cons_ptr(e_base_ctx->primary_module->arch, result.type_key, 1, 0);
|
||||||
|
}break;
|
||||||
case E_ExprKind_Array:
|
case E_ExprKind_Array:
|
||||||
|
{
|
||||||
|
E_IRTreeAndType element_irtree = e_irtree_and_type_from_expr(arena, expr->first);
|
||||||
|
result = element_irtree;
|
||||||
|
result.type_key = e_type_key_cons_array(result.type_key, expr->value.u64, 0);
|
||||||
|
}break;
|
||||||
case E_ExprKind_Func:
|
case E_ExprKind_Func:
|
||||||
{
|
{
|
||||||
e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, expr->location, "Type expression not expected.");
|
e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, expr->location, "Function type expressions are currently not supported.");
|
||||||
}break;
|
}break;
|
||||||
|
|
||||||
//- rjf: definitions
|
//- rjf: definitions
|
||||||
|
|||||||
@@ -663,58 +663,6 @@ e_leaf_type_from_name(String8 name)
|
|||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal E_TypeKey
|
|
||||||
e_type_from_expr(E_Expr *expr)
|
|
||||||
{
|
|
||||||
E_TypeKey result = zero_struct;
|
|
||||||
E_ExprKind kind = expr->kind;
|
|
||||||
switch(kind)
|
|
||||||
{
|
|
||||||
// TODO(rjf): do we support E_ExprKind_Func here?
|
|
||||||
default:{}break;
|
|
||||||
case E_ExprKind_TypeIdent:
|
|
||||||
{
|
|
||||||
result = expr->type_key;
|
|
||||||
}break;
|
|
||||||
case E_ExprKind_Ptr:
|
|
||||||
{
|
|
||||||
E_TypeKey direct_type_key = e_type_from_expr(expr->first);
|
|
||||||
result = e_type_key_cons_ptr(e_base_ctx->primary_module->arch, direct_type_key, 1, 0);
|
|
||||||
}break;
|
|
||||||
case E_ExprKind_Array:
|
|
||||||
{
|
|
||||||
E_Expr *child_expr = expr->first;
|
|
||||||
E_TypeKey direct_type_key = e_type_from_expr(child_expr);
|
|
||||||
result = e_type_key_cons_array(direct_type_key, expr->value.u64, 0);
|
|
||||||
}break;
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
internal void
|
|
||||||
e_push_leaf_ident_exprs_from_expr__in_place(Arena *arena, E_String2ExprMap *map, E_Expr *expr)
|
|
||||||
{
|
|
||||||
switch(expr->kind)
|
|
||||||
{
|
|
||||||
default:
|
|
||||||
{
|
|
||||||
for(E_Expr *child = expr->first; child != &e_expr_nil; child = child->next)
|
|
||||||
{
|
|
||||||
e_push_leaf_ident_exprs_from_expr__in_place(arena, map, child);
|
|
||||||
}
|
|
||||||
}break;
|
|
||||||
case E_ExprKind_Define:
|
|
||||||
{
|
|
||||||
E_Expr *exprl = expr->first;
|
|
||||||
E_Expr *exprr = exprl->next;
|
|
||||||
if(exprl->kind == E_ExprKind_LeafIdentifier)
|
|
||||||
{
|
|
||||||
e_string2expr_map_insert(arena, map, exprl->string, exprr);
|
|
||||||
}
|
|
||||||
}break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
internal E_Parse
|
internal E_Parse
|
||||||
e_parse_type_from_text_tokens(Arena *arena, String8 text, E_TokenArray tokens)
|
e_parse_type_from_text_tokens(Arena *arena, String8 text, E_TokenArray tokens)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -66,8 +66,6 @@ internal String8 e_string_from_expr(Arena *arena, E_Expr *expr, String8 parent_e
|
|||||||
//~ rjf: Parsing Functions
|
//~ rjf: Parsing Functions
|
||||||
|
|
||||||
internal E_TypeKey e_leaf_type_from_name(String8 name);
|
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_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__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_Parse e_parse_expr_from_text_tokens(Arena *arena, String8 text, E_TokenArray tokens);
|
||||||
|
|||||||
@@ -11934,7 +11934,40 @@ rd_frame(void)
|
|||||||
{
|
{
|
||||||
for(E_Expr *expr = parse.expr; expr != &e_expr_nil; expr = expr->next)
|
for(E_Expr *expr = parse.expr; expr != &e_expr_nil; expr = expr->next)
|
||||||
{
|
{
|
||||||
e_push_leaf_ident_exprs_from_expr__in_place(scratch.arena, macro_map, expr);
|
typedef struct ExprWalkTask ExprWalkTask;
|
||||||
|
struct ExprWalkTask
|
||||||
|
{
|
||||||
|
ExprWalkTask *next;
|
||||||
|
E_Expr *expr;
|
||||||
|
};
|
||||||
|
ExprWalkTask start_task = {0, expr};
|
||||||
|
ExprWalkTask *first_task = &start_task;
|
||||||
|
ExprWalkTask *last_task = first_task;
|
||||||
|
for(ExprWalkTask *t = first_task; t != 0; t = t->next)
|
||||||
|
{
|
||||||
|
switch(t->expr->kind)
|
||||||
|
{
|
||||||
|
case E_ExprKind_Call:{}break;
|
||||||
|
case E_ExprKind_Define:
|
||||||
|
{
|
||||||
|
E_Expr *lhs = t->expr->first;
|
||||||
|
E_Expr *rhs = lhs->next;
|
||||||
|
if(lhs->kind == E_ExprKind_LeafIdentifier)
|
||||||
|
{
|
||||||
|
e_string2expr_map_insert(scratch.arena, macro_map, lhs->string, rhs);
|
||||||
|
}
|
||||||
|
}break;
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
for(E_Expr *child = t->expr->first; child != &e_expr_nil; child = child->next)
|
||||||
|
{
|
||||||
|
ExprWalkTask *task = push_array(scratch.arena, ExprWalkTask, 1);
|
||||||
|
SLLQueuePush(first_task, last_task, task);
|
||||||
|
task->expr = child;
|
||||||
|
}
|
||||||
|
}break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user