diff --git a/src/eval/eval_ir.c b/src/eval/eval_ir.c index 9cd4ff86..73d0d69c 100644 --- a/src/eval/eval_ir.c +++ b/src/eval/eval_ir.c @@ -1065,7 +1065,8 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *root_expr) // rjf: unpack operands E_Expr *cast_type_expr = expr->first; 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); 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); @@ -1123,22 +1124,9 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *root_expr) E_Expr *r_expr = expr->first; E_TypeKey r_type = zero_struct; E_Space space = r_expr->space; - switch(r_expr->kind) - { - case E_ExprKind_TypeIdent: - 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; - } + 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; // rjf: bad conditions? -> error if applicable, exit 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.mode = E_Mode_Null; }break; - - //- rjf: (unexpected) type expressions 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: + { + 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: { - 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; //- rjf: definitions diff --git a/src/eval/eval_parse.c b/src/eval/eval_parse.c index 247e85c6..ddafb9b7 100644 --- a/src/eval/eval_parse.c +++ b/src/eval/eval_parse.c @@ -663,58 +663,6 @@ e_leaf_type_from_name(String8 name) 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 e_parse_type_from_text_tokens(Arena *arena, String8 text, E_TokenArray tokens) { diff --git a/src/eval/eval_parse.h b/src/eval/eval_parse.h index 657320b9..2c7554c4 100644 --- a/src/eval/eval_parse.h +++ b/src/eval/eval_parse.h @@ -66,8 +66,6 @@ internal String8 e_string_from_expr(Arena *arena, E_Expr *expr, String8 parent_e //~ rjf: Parsing Functions 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, U64 max_chain_count); internal E_Parse e_parse_expr_from_text_tokens(Arena *arena, String8 text, E_TokenArray tokens); diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 13ae1c1e..81caf7b4 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -11934,7 +11934,40 @@ rd_frame(void) { 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; + } + } } } }