From 4cccc9cb42f7bced7fc411e6282a058c39bc5392 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 29 Apr 2025 14:53:35 -0700 Subject: [PATCH] proper cast parsing, elimninate chained casts entirely --- src/eval/eval_core.c | 4 +- src/eval/eval_ir.c | 56 ++++++++++++------------- src/eval/eval_ir.h | 2 +- src/eval/eval_parse.c | 97 +++++++++++++++++++++++++++++++------------ src/eval/eval_types.c | 2 +- 5 files changed, 103 insertions(+), 58 deletions(-) diff --git a/src/eval/eval_core.c b/src/eval/eval_core.c index ee4bd038..d7b37120 100644 --- a/src/eval/eval_core.c +++ b/src/eval/eval_core.c @@ -847,7 +847,7 @@ e_irtree_from_bundle(E_CacheBundle *bundle) bundle->flags |= E_CacheBundleFlag_IRTree; E_IRTreeAndType parent = e_irtree_from_key(bundle->parent_key); E_Parse parse = e_parse_from_bundle(bundle); - bundle->irtree = e_push_irtree_and_type_from_expr(e_cache->arena, &parent, 0, 0, 0, parse.expr); + bundle->irtree = e_push_irtree_and_type_from_expr(e_cache->arena, &parent, 0, 0, parse.expr); E_MsgList msgs_copy = e_msg_list_copy(e_cache->arena, &bundle->irtree.msgs); e_msg_list_concat_in_place(&bundle->msgs, &msgs_copy); } @@ -1326,7 +1326,7 @@ e_debug_log_from_expr_string(Arena *arena, String8 string) } //- rjf: type - E_IRTreeAndType irtree = e_push_irtree_and_type_from_expr(scratch.arena, 0, 0, 0, 0, parse.expr); + E_IRTreeAndType irtree = e_push_irtree_and_type_from_expr(scratch.arena, 0, 0, 0, parse.expr); { str8_list_pushf(scratch.arena, &strings, " type:\n"); S32 indent = 2; diff --git a/src/eval/eval_ir.c b/src/eval/eval_ir.c index fc9ee2fc..d62fc929 100644 --- a/src/eval/eval_ir.c +++ b/src/eval/eval_ir.c @@ -492,7 +492,7 @@ E_TYPE_ACCESS_FUNCTION_DEF(default) E_Expr *exprl = expr->first; E_Expr *exprr = exprl->next; E_IRTreeAndType l = *lhs_irtree; - E_IRTreeAndType r = e_push_irtree_and_type_from_expr(arena, overridden, 0, 0, 0, exprr); + E_IRTreeAndType r = e_push_irtree_and_type_from_expr(arena, overridden, 0, 1, exprr); e_msg_list_concat_in_place(&result.msgs, &r.msgs); E_TypeKey l_restype = e_type_key_unwrap(l.type_key, E_TypeUnwrapFlag_AllDecorative); E_TypeKey r_restype = e_type_key_unwrap(r.type_key, E_TypeUnwrapFlag_AllDecorative); @@ -583,7 +583,7 @@ E_TYPE_ACCESS_FUNCTION_DEF(default) } internal E_IRTreeAndType -e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, B32 disallow_autohooks, B32 disallow_chained_fastpaths, B32 disallow_chained_casts, E_Expr *root_expr) +e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, B32 disallow_autohooks, B32 disallow_chained_fastpaths, E_Expr *root_expr) { ProfBeginFunction(); Temp scratch = scratch_begin(&arena, 1); @@ -627,7 +627,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, B32 { // rjf: unpack left-hand-side E_Expr *lhs = expr->first; - E_IRTreeAndType lhs_irtree = e_push_irtree_and_type_from_expr(arena, parent, disallow_autohooks, disallow_chained_fastpaths, disallow_chained_casts, lhs); + E_IRTreeAndType lhs_irtree = e_push_irtree_and_type_from_expr(arena, parent, disallow_autohooks, 1, lhs); e_msg_list_concat_in_place(&result.msgs, &lhs_irtree.msgs); // rjf: try all IR trees in chain @@ -684,7 +684,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, B32 { // rjf: unpack operand E_Expr *r_expr = expr->first; - E_IRTreeAndType r_tree = e_push_irtree_and_type_from_expr(arena, parent, disallow_autohooks, disallow_chained_fastpaths, disallow_chained_casts, r_expr); + E_IRTreeAndType r_tree = e_push_irtree_and_type_from_expr(arena, parent, disallow_autohooks, 1, r_expr); e_msg_list_concat_in_place(&result.msgs, &r_tree.msgs); E_TypeKey r_type = e_type_key_unwrap(r_tree.type_key, E_TypeUnwrapFlag_AllDecorative); E_TypeKind r_type_kind = e_type_kind_from_key(r_type); @@ -743,7 +743,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, B32 { // rjf: unpack operand E_Expr *r_expr = expr->first; - E_IRTreeAndType r_tree = e_push_irtree_and_type_from_expr(arena, parent, disallow_autohooks, disallow_chained_fastpaths, disallow_chained_casts, r_expr); + E_IRTreeAndType r_tree = e_push_irtree_and_type_from_expr(arena, parent, disallow_autohooks, 1, r_expr); e_msg_list_concat_in_place(&result.msgs, &r_tree.msgs); E_TypeKey r_type = r_tree.type_key; E_TypeKey r_type_unwrapped = e_type_key_unwrap(r_type, E_TypeUnwrapFlag_AllDecorative); @@ -771,12 +771,12 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, B32 // rjf: unpack operands E_Expr *cast_type_expr = expr->first; E_Expr *casted_expr = cast_type_expr->next; - E_IRTreeAndType cast_irtree = e_push_irtree_and_type_from_expr(arena, parent, disallow_autohooks, disallow_chained_fastpaths, disallow_chained_casts, cast_type_expr); + E_IRTreeAndType cast_irtree = e_push_irtree_and_type_from_expr(arena, parent, disallow_autohooks, 1, cast_type_expr); e_msg_list_concat_in_place(&result.msgs, &cast_irtree.msgs); 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_push_irtree_and_type_from_expr(arena, parent, disallow_autohooks, disallow_chained_fastpaths, disallow_chained_casts, casted_expr); + E_IRTreeAndType casted_tree = e_push_irtree_and_type_from_expr(arena, parent, disallow_autohooks, 1, casted_expr); e_msg_list_concat_in_place(&result.msgs, &casted_tree.msgs); E_TypeKey casted_type = e_type_key_unwrap(casted_tree.type_key, E_TypeUnwrapFlag_AllDecorative); E_TypeKind casted_type_kind = e_type_kind_from_key(casted_type); @@ -831,7 +831,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, B32 E_Expr *r_expr = expr->first; E_TypeKey r_type = zero_struct; E_Space space = r_expr->space; - E_IRTreeAndType r_tree = e_push_irtree_and_type_from_expr(arena, parent, disallow_autohooks, disallow_chained_fastpaths, disallow_chained_casts, r_expr); + E_IRTreeAndType r_tree = e_push_irtree_and_type_from_expr(arena, parent, disallow_autohooks, 1, r_expr); e_msg_list_concat_in_place(&result.msgs, &r_tree.msgs); r_type = r_tree.type_key; @@ -859,7 +859,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, B32 { // rjf: evaluate operand tree E_Expr *r_expr = expr->first; - E_IRTreeAndType r_tree = e_push_irtree_and_type_from_expr(arena, parent, disallow_autohooks, disallow_chained_fastpaths, disallow_chained_casts, r_expr); + E_IRTreeAndType r_tree = e_push_irtree_and_type_from_expr(arena, parent, disallow_autohooks, 1, r_expr); e_msg_list_concat_in_place(&result.msgs, &r_tree.msgs); // rjf: fill output @@ -873,7 +873,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, B32 { // rjf: unpack operand E_Expr *r_expr = expr->first; - E_IRTreeAndType r_tree = e_push_irtree_and_type_from_expr(arena, parent, disallow_autohooks, disallow_chained_fastpaths, disallow_chained_casts, r_expr); + E_IRTreeAndType r_tree = e_push_irtree_and_type_from_expr(arena, parent, disallow_autohooks, 1, r_expr); e_msg_list_concat_in_place(&result.msgs, &r_tree.msgs); E_TypeKey r_type = e_type_key_unwrap(r_tree.type_key, E_TypeUnwrapFlag_AllDecorative); E_TypeKind r_type_kind = e_type_kind_from_key(r_type); @@ -901,14 +901,14 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, B32 //- rjf: unary operations case E_ExprKind_Pos: { - result = e_push_irtree_and_type_from_expr(arena, parent, disallow_autohooks, disallow_chained_fastpaths, disallow_chained_casts, expr->first); + result = e_push_irtree_and_type_from_expr(arena, parent, disallow_autohooks, 1, expr->first); }break; case E_ExprKind_Neg: case E_ExprKind_BitNot: { // rjf: unpack operand E_Expr *r_expr = expr->first; - E_IRTreeAndType r_tree = e_push_irtree_and_type_from_expr(arena, parent, disallow_autohooks, disallow_chained_fastpaths, disallow_chained_casts, r_expr); + E_IRTreeAndType r_tree = e_push_irtree_and_type_from_expr(arena, parent, disallow_autohooks, 1, r_expr); e_msg_list_concat_in_place(&result.msgs, &r_tree.msgs); E_TypeKey r_type = e_type_key_unwrap(r_tree.type_key, E_TypeUnwrapFlag_AllDecorative); E_TypeKind r_type_kind = e_type_kind_from_key(r_type); @@ -941,7 +941,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, B32 { // rjf: unpack operand E_Expr *r_expr = expr->first; - E_IRTreeAndType r_tree = e_push_irtree_and_type_from_expr(arena, parent, disallow_autohooks, disallow_chained_fastpaths, disallow_chained_casts, r_expr); + E_IRTreeAndType r_tree = e_push_irtree_and_type_from_expr(arena, parent, disallow_autohooks, 1, r_expr); e_msg_list_concat_in_place(&result.msgs, &r_tree.msgs); E_TypeKey r_type = e_type_key_unwrap(r_tree.type_key, E_TypeUnwrapFlag_AllDecorative); E_TypeKind r_type_kind = e_type_kind_from_key(r_type); @@ -996,8 +996,8 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, B32 B32 is_comparison = e_expr_kind_is_comparison(kind); E_Expr *l_expr = expr->first; E_Expr *r_expr = l_expr->next; - E_IRTreeAndType l_tree = e_push_irtree_and_type_from_expr(arena, parent, disallow_autohooks, disallow_chained_fastpaths, disallow_chained_casts, l_expr); - E_IRTreeAndType r_tree = e_push_irtree_and_type_from_expr(arena, parent, disallow_autohooks, disallow_chained_fastpaths, disallow_chained_casts, r_expr); + E_IRTreeAndType l_tree = e_push_irtree_and_type_from_expr(arena, parent, disallow_autohooks, 1, l_expr); + E_IRTreeAndType r_tree = e_push_irtree_and_type_from_expr(arena, parent, disallow_autohooks, 1, r_expr); e_msg_list_concat_in_place(&result.msgs, &l_tree.msgs); e_msg_list_concat_in_place(&result.msgs, &r_tree.msgs); E_TypeKey l_type = e_type_key_unwrap(l_tree.type_key, E_TypeUnwrapFlag_AllDecorative); @@ -1220,9 +1220,9 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, B32 E_Expr *c_expr = expr->first; E_Expr *l_expr = c_expr->next; E_Expr *r_expr = l_expr->next; - E_IRTreeAndType c_tree = e_push_irtree_and_type_from_expr(arena, parent, disallow_autohooks, disallow_chained_fastpaths, disallow_chained_casts, c_expr); - E_IRTreeAndType l_tree = e_push_irtree_and_type_from_expr(arena, parent, disallow_autohooks, disallow_chained_fastpaths, disallow_chained_casts, l_expr); - E_IRTreeAndType r_tree = e_push_irtree_and_type_from_expr(arena, parent, disallow_autohooks, disallow_chained_fastpaths, disallow_chained_casts, r_expr); + E_IRTreeAndType c_tree = e_push_irtree_and_type_from_expr(arena, parent, disallow_autohooks, 1, c_expr); + E_IRTreeAndType l_tree = e_push_irtree_and_type_from_expr(arena, parent, disallow_autohooks, 1, l_expr); + E_IRTreeAndType r_tree = e_push_irtree_and_type_from_expr(arena, parent, disallow_autohooks, 1, r_expr); e_msg_list_concat_in_place(&result.msgs, &c_tree.msgs); e_msg_list_concat_in_place(&result.msgs, &l_tree.msgs); e_msg_list_concat_in_place(&result.msgs, &r_tree.msgs); @@ -1267,7 +1267,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, B32 { B32 strip_lenses = 0; E_Expr *lhs = expr->first; - E_IRTreeAndType lhs_irtree = e_push_irtree_and_type_from_expr(arena, parent, disallow_autohooks, 1, 1, lhs); + E_IRTreeAndType lhs_irtree = e_push_irtree_and_type_from_expr(arena, parent, disallow_autohooks, 1, lhs); e_msg_list_concat_in_place(&result.msgs, &lhs_irtree.msgs); E_TypeKey lhs_type_key = lhs_irtree.type_key; E_Type *lhs_type = e_type_from_key__cached(lhs_type_key); @@ -1275,7 +1275,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, B32 // rjf: calling a type? -> treat as a cast of that type if(lhs_irtree.mode == E_Mode_Null && lhs_type != &e_type_nil && lhs_type->kind != E_TypeKind_Lens && lhs_type->kind != E_TypeKind_LensSpec) { - E_IRTreeAndType casted_tree = e_push_irtree_and_type_from_expr(arena, parent, disallow_autohooks, 1, disallow_chained_casts, expr->first->next); + E_IRTreeAndType casted_tree = e_push_irtree_and_type_from_expr(arena, parent, disallow_autohooks, 1, expr->first->next); e_msg_list_concat_in_place(&result.msgs, &casted_tree.msgs); E_TypeKey cast_type = lhs_irtree.type_key; E_TypeKind cast_type_kind = e_type_kind_from_key(cast_type); @@ -1347,7 +1347,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, B32 strip_lenses = 1; disallow_autohooks = 1; } - result = e_push_irtree_and_type_from_expr(arena, parent, disallow_autohooks, disallow_chained_fastpaths, disallow_chained_casts, call); + result = e_push_irtree_and_type_from_expr(arena, parent, disallow_autohooks, 1, call); // NOTE(rjf): we do not want to accumulate messages from the original left-hand-side evaluation in this case, because // this path only occurs if the member access fails specifically. } @@ -1365,7 +1365,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, B32 } // rjf: generate result via first argument to lens - result = e_push_irtree_and_type_from_expr(arena, parent, disallow_autohooks, 1, disallow_chained_casts, lhs->next); + result = e_push_irtree_and_type_from_expr(arena, parent, disallow_autohooks, 1, lhs->next); // rjf: if not raw, wrap resultant type with lens type if(!strip_lenses) @@ -1554,7 +1554,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, B32 for(E_IRTreeAndType *prev = parent; prev != 0; prev = prev->prev) { E_Expr *access = e_expr_irext_member_access(scratch.arena, &e_expr_nil, prev, string); - E_IRTreeAndType access_irtree = e_push_irtree_and_type_from_expr(scratch.arena, prev, disallow_autohooks, 1, 1, access); + E_IRTreeAndType access_irtree = e_push_irtree_and_type_from_expr(scratch.arena, prev, disallow_autohooks, 1, access); if(access_irtree.root != &e_irnode_nil) { string_mapped = 1; @@ -1924,7 +1924,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, B32 { generated = 1; e_string2expr_map_inc_poison(e_ir_ctx->macro_map, string); - result = e_push_irtree_and_type_from_expr(arena, parent, disallow_autohooks, disallow_chained_fastpaths, disallow_chained_casts, macro_expr); + result = e_push_irtree_and_type_from_expr(arena, parent, disallow_autohooks, 1, macro_expr); e_string2expr_map_dec_poison(e_ir_ctx->macro_map, string); } } @@ -2011,7 +2011,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, B32 }break; case E_ExprKind_Unsigned: { - E_IRTreeAndType direct_irtree = e_push_irtree_and_type_from_expr(arena, parent, disallow_autohooks, disallow_chained_fastpaths, disallow_chained_casts, expr->first); + E_IRTreeAndType direct_irtree = e_push_irtree_and_type_from_expr(arena, parent, disallow_autohooks, 1, expr->first); result = direct_irtree; E_TypeKey direct_type_key = result.type_key; E_TypeKind direct_type_kind = e_type_kind_from_key(direct_type_key); @@ -2041,13 +2041,13 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, B32 }break; case E_ExprKind_Ptr: { - E_IRTreeAndType ptee_irtree = e_push_irtree_and_type_from_expr(arena, parent, disallow_autohooks, disallow_chained_fastpaths, disallow_chained_casts, expr->first); + E_IRTreeAndType ptee_irtree = e_push_irtree_and_type_from_expr(arena, parent, disallow_autohooks, 1, 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_push_irtree_and_type_from_expr(arena, parent, disallow_autohooks, disallow_chained_fastpaths, disallow_chained_casts, expr->first); + E_IRTreeAndType element_irtree = e_push_irtree_and_type_from_expr(arena, parent, disallow_autohooks, 1, expr->first); result = element_irtree; result.type_key = e_type_key_cons_array(result.type_key, expr->value.u64, 0); }break; @@ -2061,7 +2061,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, B32 { E_Expr *lhs = expr->first; E_Expr *rhs = lhs->next; - result = e_push_irtree_and_type_from_expr(arena, parent, disallow_autohooks, disallow_chained_fastpaths, disallow_chained_casts, rhs); + result = e_push_irtree_and_type_from_expr(arena, parent, disallow_autohooks, 1, rhs); if(lhs->kind != E_ExprKind_LeafIdentifier) { e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, expr->location, "Left side of assignment must be an unused identifier."); diff --git a/src/eval/eval_ir.h b/src/eval/eval_ir.h index a63bd7bc..97889252 100644 --- a/src/eval/eval_ir.h +++ b/src/eval/eval_ir.h @@ -88,7 +88,7 @@ internal void e_expr_unpoison(E_Expr *expr); //- rjf: top-level irtree/type extraction E_TYPE_ACCESS_FUNCTION_DEF(default); -internal E_IRTreeAndType e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, B32 disallow_autohooks, B32 disallow_chained_fastpaths, B32 disallow_chained_casts, E_Expr *root_expr); +internal E_IRTreeAndType e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, B32 disallow_autohooks, B32 disallow_chained_fastpaths, E_Expr *root_expr); //- rjf: irtree -> linear ops/bytecode internal void e_append_oplist_from_irtree(Arena *arena, E_IRNode *root, E_Space *current_space, E_OpList *out); diff --git a/src/eval/eval_parse.c b/src/eval/eval_parse.c index 61b5c139..c437c23d 100644 --- a/src/eval/eval_parse.c +++ b/src/eval/eval_parse.c @@ -568,6 +568,21 @@ e_leaf_type_from_name(String8 name) found = 1; key = e_type_key_basic(E_TypeKind_U64); } + else if(Case("u128") || Case("uint128") || Case("uint128_t") || Case("U128")) + { + found = 1; + key = e_type_key_basic(E_TypeKind_U128); + } + else if(Case("u256") || Case("uint256") || Case("uint256_t") || Case("U256")) + { + found = 1; + key = e_type_key_basic(E_TypeKind_U256); + } + else if(Case("u512") || Case("uint512") || Case("uint512_t") || Case("U512")) + { + found = 1; + key = e_type_key_basic(E_TypeKind_U512); + } else if(Case("s8") || Case("b8") || Case("B8") || Case("i8") || Case("int8") || Case("int8_t") || Case("S8")) { found = 1; @@ -603,6 +618,16 @@ e_leaf_type_from_name(String8 name) found = 1; key = e_type_key_basic(E_TypeKind_S64); } + else if(Case("s256") || Case("i256") || Case("int256") || Case("int256_t") || Case("S256")) + { + found = 1; + key = e_type_key_basic(E_TypeKind_S256); + } + else if(Case("s512") || Case("i512") || Case("int512") || Case("int512_t") || Case("S512")) + { + found = 1; + key = e_type_key_basic(E_TypeKind_S512); + } else if(Case("void")) { found = 1; @@ -786,7 +811,6 @@ e_push_parse_from_string_tokens__prec(Arena *arena, String8 text, E_TokenArray t ////////////////////////////// //- rjf: parse chain of expressions // - E_Expr *possible_cast = &e_expr_nil; for(U64 chain_count = 0; it < it_opl && chain_count < max_chain_count;) { //////////////////////////// @@ -895,14 +919,23 @@ e_push_parse_from_string_tokens__prec(Arena *arena, String8 text, E_TokenArray t } //////////////////////////// - //- rjf: parse atom + //- rjf: parse atom, gather cast tasks // - E_Expr *atom = &e_expr_nil; - String8 atom_implicit_member_name = {0}; - if(it < it_opl) + typedef struct CastTask CastTask; + struct CastTask { + CastTask *next; + E_Expr *type_expr; + }; + CastTask *first_cast = 0; + CastTask *last_cast = 0; + E_Expr *atom = &e_expr_nil; + for(B32 done = 0; !done && it < it_opl;) + { + E_Expr *possible_cast = atom; E_Token token = e_token_at_it(it, &tokens); String8 token_string = str8_substr(text, token.range); + done = 1; ////////////////////////// //- rjf: consume resolution qualifiers @@ -935,9 +968,6 @@ e_push_parse_from_string_tokens__prec(Arena *arena, String8 text, E_TokenArray t atom = nested_parse.expr; it = nested_parse.last_token; - // rjf: this may have been a cast - possible_cast = atom; - // rjf: expect ) E_Token close_paren_maybe = e_token_at_it(it, &tokens); String8 close_paren_maybe_string = str8_substr(text, close_paren_maybe.range); @@ -951,6 +981,9 @@ e_push_parse_from_string_tokens__prec(Arena *arena, String8 text, E_TokenArray t { it += 1; } + + // rjf: this may have been a cast, so keep parsing after this + done = 0; } ////////////////////////// @@ -1094,11 +1127,31 @@ e_push_parse_from_string_tokens__prec(Arena *arena, String8 text, E_TokenArray t it += 1; } + ////////////////////////// + //- rjf: not a recognized atom pattern + // + else + { + done = 1; + } + + ////////////////////////// //- rjf: upgrade atom w/ qualifier + // if(atom != &e_expr_nil && resolution_qualifier.size != 0) { atom->qualifier = resolution_qualifier; } + + ////////////////////////// + //- rjf: gather cast + // + if(possible_cast != &e_expr_nil && possible_cast != atom) + { + CastTask *t = push_array(scratch.arena, CastTask, 1); + t->type_expr = possible_cast; + SLLQueuePushFront(first_cast, last_cast, t); + } } //////////////////////////// @@ -1226,13 +1279,6 @@ e_push_parse_from_string_tokens__prec(Arena *arena, String8 text, E_TokenArray t } } - // rjf: if this is a postfix unary, then we know the previous expression - // could not have been a cast. - if(is_postfix_unary) - { - possible_cast = &e_expr_nil; - } - // rjf: quit if this doesn't look like any patterns of postfix unary we know if(!is_postfix_unary) { @@ -1241,16 +1287,17 @@ e_push_parse_from_string_tokens__prec(Arena *arena, String8 text, E_TokenArray t } //////////////////////////// - //- rjf: if we have an atom, and we have a potential cast expression, then remove - // the cast from the chain, and build a cast tree - if(atom != &e_expr_nil && possible_cast != &e_expr_nil && atom != possible_cast) + //- rjf: upgrade `atom` w/ previously parsed casts + // + if(atom != &e_expr_nil) { - E_Expr *casted = atom; - DLLRemove_NPZ(&e_expr_nil, result.expr, result.last_expr, possible_cast, next, prev); - atom = e_push_expr(arena, E_ExprKind_Cast, atom->location); - e_expr_push_child(atom, possible_cast); - e_expr_push_child(atom, casted); - possible_cast = &e_expr_nil; + for(CastTask *cast = first_cast; cast != 0; cast = cast->next) + { + E_Expr *rhs = atom; + atom = e_push_expr(arena, E_ExprKind_Cast, cast->type_expr->location); + e_expr_push_child(atom, cast->type_expr); + e_expr_push_child(atom, rhs); + } } //////////////////////////// @@ -1302,7 +1349,6 @@ e_push_parse_from_string_tokens__prec(Arena *arena, String8 text, E_TokenArray t // precedence if(binary_precedence != 0 && binary_precedence <= max_precedence) { - possible_cast = &e_expr_nil; E_Parse rhs_expr_parse = e_push_parse_from_string_tokens__prec(arena, text, e_token_array_make_first_opl(it+1, it_opl), binary_precedence-1, 1); e_msg_list_concat_in_place(&result.msgs, &rhs_expr_parse.msgs); E_Expr *rhs = rhs_expr_parse.expr; @@ -1335,7 +1381,6 @@ e_push_parse_from_string_tokens__prec(Arena *arena, String8 text, E_TokenArray t if(token.kind == E_TokenKind_Symbol && str8_match(token_string, str8_lit("?"), 0) && 13 <= max_precedence) { it += 1; - possible_cast = &e_expr_nil; // rjf: parse middle expression E_Parse middle_expr_parse = e_push_parse_from_string_tokens__prec(arena, text, e_token_array_make_first_opl(it, it_opl), e_max_precedence, 1); diff --git a/src/eval/eval_types.c b/src/eval/eval_types.c index 1be51681..d59f999b 100644 --- a/src/eval/eval_types.c +++ b/src/eval/eval_types.c @@ -2466,7 +2466,7 @@ E_TYPE_ACCESS_FUNCTION_DEF(slice) } // rjf: compute struct.base_ptr IR tree - result = e_push_irtree_and_type_from_expr(arena, 0, 0, 0, 0, idx_expr); + result = e_push_irtree_and_type_from_expr(arena, 0, 0, 1, idx_expr); scratch_end(scratch); }break;