diff --git a/src/eval/eval_core.c b/src/eval/eval_core.c index ba5f64de..18e8c407 100644 --- a/src/eval/eval_core.c +++ b/src/eval/eval_core.c @@ -129,25 +129,25 @@ e_type_key_list_copy(Arena *arena, E_TypeKeyList *src) //~ rjf: Message Functions internal void -e_msg(Arena *arena, E_MsgList *msgs, E_MsgKind kind, void *location, String8 text) +e_msg(Arena *arena, E_MsgList *msgs, E_MsgKind kind, Rng1U64 range, String8 text) { E_Msg *msg = push_array(arena, E_Msg, 1); SLLQueuePush(msgs->first, msgs->last, msg); msgs->count += 1; msgs->max_kind = Max(kind, msgs->max_kind); msg->kind = kind; - msg->location = location; + msg->range = range; msg->text = text; } internal void -e_msgf(Arena *arena, E_MsgList *msgs, E_MsgKind kind, void *location, char *fmt, ...) +e_msgf(Arena *arena, E_MsgList *msgs, E_MsgKind kind, Rng1U64 range, char *fmt, ...) { va_list args; va_start(args, fmt); String8 text = push_str8fv(arena, fmt, args); va_end(args); - e_msg(arena, msgs, kind, location, text); + e_msg(arena, msgs, kind, range, text); } internal void @@ -173,7 +173,7 @@ e_msg_list_copy(Arena *arena, E_MsgList *src) E_MsgList dst = {0}; for(E_Msg *msg = src->first; msg != 0; msg = msg->next) { - e_msg(arena, &dst, msg->kind, msg->location, msg->text); + e_msg(arena, &dst, msg->kind, msg->range, msg->text); } return dst; } @@ -881,7 +881,7 @@ e_interpretation_from_bundle(E_CacheBundle *bundle) E_Interpretation interpret = e_interpret(bytecode); if(E_InterpretationCode_Good < interpret.code && interpret.code < E_InterpretationCode_COUNT) { - e_msg(e_cache->arena, &bundle->msgs, E_MsgKind_InterpretationError, 0, e_interpretation_code_display_strings[interpret.code]); + e_msg(e_cache->arena, &bundle->msgs, E_MsgKind_InterpretationError, r1u64(0, 0), e_interpretation_code_display_strings[interpret.code]); } bundle->interpretation = interpret; bundle->space_gen = e_space_gen(interpret.space); diff --git a/src/eval/eval_core.h b/src/eval/eval_core.h index b1d2c3d7..3497abfd 100644 --- a/src/eval/eval_core.h +++ b/src/eval/eval_core.h @@ -32,7 +32,7 @@ struct E_Msg { E_Msg *next; E_MsgKind kind; - void *location; + Rng1U64 range; String8 text; }; @@ -253,7 +253,7 @@ struct E_Expr E_Expr *next; E_Expr *prev; E_Expr *ref; - void *location; + Rng1U64 range; E_ExprKind kind; E_Mode mode; E_Space space; @@ -1030,8 +1030,8 @@ internal E_TypeKeyList e_type_key_list_copy(Arena *arena, E_TypeKeyList *src); //////////////////////////////// //~ rjf: Message Functions -internal void e_msg(Arena *arena, E_MsgList *msgs, E_MsgKind kind, void *location, String8 text); -internal void e_msgf(Arena *arena, E_MsgList *msgs, E_MsgKind kind, void *location, char *fmt, ...); +internal void e_msg(Arena *arena, E_MsgList *msgs, E_MsgKind kind, Rng1U64 range, String8 text); +internal void e_msgf(Arena *arena, E_MsgList *msgs, E_MsgKind kind, Rng1U64 range, char *fmt, ...); internal void e_msg_list_concat_in_place(E_MsgList *dst, E_MsgList *to_push); internal E_MsgList e_msg_list_copy(Arena *arena, E_MsgList *src); diff --git a/src/eval/eval_ir.c b/src/eval/eval_ir.c index cc1c2b17..0f77359e 100644 --- a/src/eval/eval_ir.c +++ b/src/eval/eval_ir.c @@ -429,12 +429,12 @@ E_TYPE_ACCESS_FUNCTION_DEF(default) // rjf: bad conditions? -> error if applicable, exit if(exprr->kind != E_ExprKind_LeafIdentifier) { - e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, exprl->location, "Expected member name."); + e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, exprl->range, "Expected member name."); break; } else if(!r_found) { - e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, exprr->location, "Could not find a member named `%S`.", exprr->string); + e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, exprr->range, "Could not find a member named `%S`.", exprr->string); break; } else if(l.root == &e_irnode_nil || @@ -447,7 +447,7 @@ E_TYPE_ACCESS_FUNCTION_DEF(default) check_type_kind != E_TypeKind_Union && check_type_kind != E_TypeKind_Enum) { - e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, exprl->location, "Cannot perform member access on this type."); + e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, exprl->range, "Cannot perform member access on this type."); break; } @@ -506,22 +506,22 @@ E_TYPE_ACCESS_FUNCTION_DEF(default) } else if(l_restype_kind != E_TypeKind_Ptr && l_restype_kind != E_TypeKind_Array) { - e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, exprl->location, "Cannot index into this type."); + e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, exprl->range, "Cannot index into this type."); break; } else if(!e_type_kind_is_integer(r_restype_kind)) { - e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, exprr->location, "Cannot index with this type."); + e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, exprr->range, "Cannot index with this type."); break; } else if(l_restype_kind == E_TypeKind_Ptr && direct_type_size == 0) { - e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, exprr->location, "Cannot index into pointers of zero-sized types."); + e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, exprr->range, "Cannot index into pointers of zero-sized types."); break; } else if(l_restype_kind == E_TypeKind_Array && direct_type_size == 0) { - e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, exprr->location, "Cannot index into arrays of zero-sized types."); + e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, exprr->range, "Cannot index into arrays of zero-sized types."); break; } @@ -699,12 +699,12 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, B32 r_type_kind == E_TypeKind_LRef || r_type_kind == E_TypeKind_RRef)) { - e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, r_expr->location, "Cannot dereference pointers of zero-sized types."); + e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, r_expr->range, "Cannot dereference pointers of zero-sized types."); break; } else if(r_type_direct_size == 0 && r_type_kind == E_TypeKind_Array) { - e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, r_expr->location, "Cannot dereference arrays of zero-sized types."); + e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, r_expr->range, "Cannot dereference arrays of zero-sized types."); break; } else if(r_type_kind != E_TypeKind_Array && @@ -712,7 +712,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, B32 r_type_kind != E_TypeKind_LRef && r_type_kind != E_TypeKind_RRef) { - e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, r_expr->location, "Cannot dereference this type."); + e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, r_expr->range, "Cannot dereference this type."); break; } @@ -800,7 +800,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, B32 { text.str = rdi_explanation_string_from_eval_conversion_kind(conversion_rule, &text.size); } - e_msg(arena, &result.msgs, E_MsgKind_MalformedInput, expr->location, text); + e_msg(arena, &result.msgs, E_MsgKind_MalformedInput, expr->range, text); break; } @@ -880,7 +880,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, B32 // rjf: bad conditions? -> error if applicable, exit if(!e_type_kind_is_integer(r_type_kind) || (r_type_size != 8 && r_type_size != 4 && r_type_size != 2)) { - e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, expr->location, "Byteswapping this type is not supported."); + e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, expr->range, "Byteswapping this type is not supported."); break; } @@ -921,7 +921,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, B32 } else if(!rdi_eval_op_typegroup_are_compatible(op, r_type_group)) { - e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, expr->location, "Cannot use this operator on this type."); + e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, expr->range, "Cannot use this operator on this type."); break; } @@ -954,7 +954,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, B32 } else if(!rdi_eval_op_typegroup_are_compatible(op, r_type_group)) { - e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, expr->location, "Cannot use this operator on this type."); + e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, expr->range, "Cannot use this operator on this type."); break; } @@ -1086,7 +1086,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, B32 if(!rdi_eval_op_typegroup_are_compatible(op, l_type_group) || !rdi_eval_op_typegroup_are_compatible(op, r_type_group)) { - e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, expr->location, "Cannot use this operator on this type."); + e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, expr->range, "Cannot use this operator on this type."); break; } @@ -1238,7 +1238,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, B32 } else if(!e_type_kind_is_integer(c_type_kind) && c_type_kind != E_TypeKind_Bool) { - e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, expr->location, "Conditional term must be an integer or boolean type."); + e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, expr->range, "Conditional term must be an integer or boolean type."); } // rjf: determine the resultant type - if the left/right types match, then we @@ -1326,7 +1326,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, B32 { text.str = rdi_explanation_string_from_eval_conversion_kind(conversion_rule, &text.size); } - e_msg(arena, &result.msgs, E_MsgKind_MalformedInput, expr->location, text); + e_msg(arena, &result.msgs, E_MsgKind_MalformedInput, expr->range, text); break; } @@ -1357,7 +1357,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, B32 { E_Expr *callee = lhs->first->next; E_Expr *first_arg = e_expr_ref(arena, lhs->first); - E_Expr *call = e_push_expr(arena, E_ExprKind_Call, 0); + E_Expr *call = e_push_expr(arena, E_ExprKind_Call, r1u64(0, 0)); e_expr_push_child(call, callee); e_expr_push_child(call, first_arg); for(E_Expr *arg = lhs->next; arg != &e_expr_nil; arg = arg->next) @@ -1430,7 +1430,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, B32 // rjf: calling any other type? -> not valid else { - e_msgf(arena, &result.msgs, E_MsgKind_InterpretationError, expr->location, "Calling this type is not supported."); + e_msgf(arena, &result.msgs, E_MsgKind_InterpretationError, expr->range, "Calling this type is not supported."); } // rjf: strip overrides and lenses if needed @@ -1962,7 +1962,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, B32 //- rjf: error on failure-to-generate if(!generated && !str8_match(string, str8_lit("$"), 0)) { - e_msgf(arena, &result.msgs, E_MsgKind_ResolutionFailure, expr->location, "`%S` could not be found.", string); + e_msgf(arena, &result.msgs, E_MsgKind_ResolutionFailure, expr->range, "`%S` could not be found.", string); } scratch_end(scratch); @@ -2053,7 +2053,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, B32 } else { - e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, expr->first->location, "Cannot apply an `unsigned` modifier to this type."); + e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, expr->first->range, "Cannot apply an `unsigned` modifier to this type."); } }break; case E_ExprKind_Ptr: @@ -2070,7 +2070,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, B32 }break; case E_ExprKind_Func: { - e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, expr->location, "Function type expressions are currently not supported."); + e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, expr->range, "Function type expressions are currently not supported."); }break; //- rjf: definitions @@ -2081,7 +2081,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, B32 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."); + e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, expr->range, "Left side of assignment must be an unused identifier."); } }break; } @@ -2502,8 +2502,8 @@ e_bytecode_from_oplist(Arena *arena, E_OpList *oplist) internal E_Expr * e_expr_irext_member_access(Arena *arena, E_Expr *lhs, E_IRTreeAndType *lhs_irtree, String8 member_name) { - E_Expr *root = e_push_expr(arena, E_ExprKind_MemberAccess, 0); - E_Expr *lhs_bytecode = e_push_expr(arena, E_ExprKind_LeafBytecode, lhs->location); + E_Expr *root = e_push_expr(arena, E_ExprKind_MemberAccess, r1u64(0, 0)); + E_Expr *lhs_bytecode = e_push_expr(arena, E_ExprKind_LeafBytecode, lhs->range); E_OpList lhs_oplist = e_oplist_from_irtree(arena, lhs_irtree->root); lhs_bytecode->string = e_string_from_expr(arena, lhs, str8_zero()); lhs_bytecode->qualifier = lhs->qualifier; @@ -2511,43 +2511,9 @@ e_expr_irext_member_access(Arena *arena, E_Expr *lhs, E_IRTreeAndType *lhs_irtre lhs_bytecode->mode = lhs_irtree->mode; lhs_bytecode->type_key = lhs_irtree->type_key; lhs_bytecode->bytecode = e_bytecode_from_oplist(arena, &lhs_oplist); - E_Expr *rhs = e_push_expr(arena, E_ExprKind_LeafIdentifier, 0); + E_Expr *rhs = e_push_expr(arena, E_ExprKind_LeafIdentifier, r1u64(0, 0)); rhs->string = push_str8_copy(arena, member_name); e_expr_push_child(root, lhs_bytecode); e_expr_push_child(root, rhs); return root; } - -internal E_Expr * -e_expr_irext_array_index(Arena *arena, E_Expr *lhs, E_IRTreeAndType *lhs_irtree, U64 index) -{ - E_Expr *root = e_push_expr(arena, E_ExprKind_ArrayIndex, 0); - E_Expr *lhs_bytecode = e_push_expr(arena, E_ExprKind_LeafBytecode, lhs->location); - E_OpList lhs_oplist = e_oplist_from_irtree(arena, lhs_irtree->root); - lhs_bytecode->string = e_string_from_expr(arena, lhs, str8_zero()); - lhs_bytecode->qualifier = lhs->qualifier; - lhs_bytecode->space = lhs->space; - lhs_bytecode->mode = lhs_irtree->mode; - lhs_bytecode->type_key = lhs_irtree->type_key; - lhs_bytecode->bytecode = e_bytecode_from_oplist(arena, &lhs_oplist); - E_Expr *rhs = e_push_expr(arena, E_ExprKind_LeafU64, 0); - rhs->value.u64 = index; - e_expr_push_child(root, lhs_bytecode); - e_expr_push_child(root, rhs); - return root; -} - -internal E_Expr * -e_expr_irext_deref(Arena *arena, E_Expr *rhs, E_IRTreeAndType *rhs_irtree) -{ - E_Expr *root = e_push_expr(arena, E_ExprKind_Deref, 0); - E_Expr *rhs_bytecode = e_push_expr(arena, E_ExprKind_LeafBytecode, rhs->location); - E_OpList rhs_oplist = e_oplist_from_irtree(arena, rhs_irtree->root); - rhs_bytecode->string = e_string_from_expr(arena, rhs, str8_zero()); - rhs_bytecode->space = rhs->space; - rhs_bytecode->mode = rhs_irtree->mode; - rhs_bytecode->type_key = rhs_irtree->type_key; - rhs_bytecode->bytecode = e_bytecode_from_oplist(arena, &rhs_oplist); - e_expr_push_child(root, rhs_bytecode); - return root; -} diff --git a/src/eval/eval_ir.h b/src/eval/eval_ir.h index 97889252..afcf793d 100644 --- a/src/eval/eval_ir.h +++ b/src/eval/eval_ir.h @@ -97,7 +97,5 @@ 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); #endif // EVAL_IR_H diff --git a/src/eval/eval_parse.c b/src/eval/eval_parse.c index a2b2f1a0..5a7dcebc 100644 --- a/src/eval/eval_parse.c +++ b/src/eval/eval_parse.c @@ -299,11 +299,11 @@ e_token_array_make_first_opl(E_Token *first, E_Token *opl) //~ rjf: Expression Tree Building Functions internal E_Expr * -e_push_expr(Arena *arena, E_ExprKind kind, void *location) +e_push_expr(Arena *arena, E_ExprKind kind, Rng1U64 range) { E_Expr *e = push_array(arena, E_Expr, 1); e->first = e->last = e->next = e->prev = e->ref = &e_expr_nil; - e->location = location; + e->range = range; e->kind = kind; return e; } @@ -329,7 +329,7 @@ e_expr_remove_child(E_Expr *parent, E_Expr *child) internal E_Expr * e_expr_ref(Arena *arena, E_Expr *ref) { - E_Expr *expr = e_push_expr(arena, E_ExprKind_Ref, 0); + E_Expr *expr = e_push_expr(arena, E_ExprKind_Ref, ref->range); expr->ref = ref; return expr; } @@ -355,7 +355,7 @@ e_expr_copy(Arena *arena, E_Expr *src) Task *last_task = first_task; for(Task *t = first_task; t != 0; t = t->next) { - E_Expr *dst = e_push_expr(arena, t->src->kind, t->src->location); + E_Expr *dst = e_push_expr(arena, t->src->kind, t->src->range); dst->mode = t->src->mode; dst->space = t->src->space; dst->type_key = t->src->type_key; @@ -763,7 +763,7 @@ e_push_type_parse_from_text_tokens(Arena *arena, String8 text, E_TokenArray toke } // rjf: construct leaf type - parse.expr = e_push_expr(arena, E_ExprKind_TypeIdent, token_string.str); + parse.expr = e_push_expr(arena, E_ExprKind_TypeIdent, token.range); parse.expr->type_key = type_key; } } @@ -784,7 +784,7 @@ e_push_type_parse_from_text_tokens(Arena *arena, String8 text, E_TokenArray toke { token_it += 1; E_Expr *ptee = parse.expr; - parse.expr = e_push_expr(arena, E_ExprKind_Ptr, token_string.str); + parse.expr = e_push_expr(arena, E_ExprKind_Ptr, token.range); e_expr_push_child(parse.expr, ptee); } else @@ -856,7 +856,7 @@ e_push_parse_from_string_tokens__prec(Arena *arena, String8 text, E_TokenArray t { PrefixUnaryTask *next; E_ExprKind kind; - void *location; + Rng1U64 range; }; PrefixUnaryTask *first_prefix_unary = 0; PrefixUnaryTask *last_prefix_unary = 0; @@ -868,7 +868,7 @@ e_push_parse_from_string_tokens__prec(Arena *arena, String8 text, E_TokenArray t String8 token_string = str8_substr(text, token.range); S64 prefix_unary_precedence = 0; E_ExprKind prefix_unary_kind = 0; - void *location = 0; + Rng1U64 range = {0}; // rjf: try op table for EachNonZeroEnumVal(E_ExprKind, k) @@ -892,7 +892,7 @@ e_push_parse_from_string_tokens__prec(Arena *arena, String8 text, E_TokenArray t // rjf: consume valid op if(prefix_unary_precedence != 0) { - location = token_string.str; + range = token.range; it += 1; } @@ -912,7 +912,7 @@ e_push_parse_from_string_tokens__prec(Arena *arena, String8 text, E_TokenArray t { PrefixUnaryTask *op_n = push_array(scratch.arena, PrefixUnaryTask, 1); op_n->kind = prefix_unary_kind; - op_n->location = location; + op_n->range = range; SLLQueuePushFront(first_prefix_unary, last_prefix_unary, op_n); } } @@ -973,7 +973,7 @@ e_push_parse_from_string_tokens__prec(Arena *arena, String8 text, E_TokenArray t String8 close_paren_maybe_string = str8_substr(text, close_paren_maybe.range); if(close_paren_maybe.kind != E_TokenKind_Symbol || !str8_match(close_paren_maybe_string, str8_lit(")"), 0)) { - e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, token_string.str, "Missing `)`."); + e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, token.range, "Missing `)`."); } // rjf: consume ) @@ -1003,17 +1003,17 @@ e_push_parse_from_string_tokens__prec(Arena *arena, String8 text, E_TokenArray t // rjf: build cast-to-U64*, and dereference operators if(nested_parse.expr == &e_expr_nil) { - e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, token_string.str, "Expected expression following `[`."); + e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, token.range, "Expected expression following `[`."); } else { - E_Expr *type = e_push_expr(arena, E_ExprKind_TypeIdent, token_string.str); + E_Expr *type = e_push_expr(arena, E_ExprKind_TypeIdent, token.range); type->type_key = e_type_key_cons_ptr(e_base_ctx->primary_module->arch, e_type_key_basic(E_TypeKind_U64), 1, 0); E_Expr *casted = atom; - E_Expr *cast = e_push_expr(arena, E_ExprKind_Cast, token_string.str); + E_Expr *cast = e_push_expr(arena, E_ExprKind_Cast, token.range); e_expr_push_child(cast, type); e_expr_push_child(cast, casted); - atom = e_push_expr(arena, E_ExprKind_Deref, token_string.str); + atom = e_push_expr(arena, E_ExprKind_Deref, token.range); e_expr_push_child(atom, cast); } @@ -1022,7 +1022,7 @@ e_push_parse_from_string_tokens__prec(Arena *arena, String8 text, E_TokenArray t String8 close_paren_maybe_string = str8_substr(text, close_paren_maybe.range); if(close_paren_maybe.kind != E_TokenKind_Symbol || !str8_match(close_paren_maybe_string, str8_lit("]"), 0)) { - e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, token_string.str, "Missing `]`."); + e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, token.range, "Missing `]`."); } // rjf: consume ) @@ -1037,7 +1037,7 @@ e_push_parse_from_string_tokens__prec(Arena *arena, String8 text, E_TokenArray t // else if(token.kind == E_TokenKind_Identifier) { - atom = e_push_expr(arena, E_ExprKind_LeafIdentifier, token_string.str); + atom = e_push_expr(arena, E_ExprKind_LeafIdentifier, token.range); atom->string = token_string; it += 1; } @@ -1055,7 +1055,7 @@ e_push_parse_from_string_tokens__prec(Arena *arena, String8 text, E_TokenArray t { U64 val = 0; try_u64_from_str8_c_rules(token_string, &val); - atom = e_push_expr(arena, E_ExprKind_LeafU64, token_string.str); + atom = e_push_expr(arena, E_ExprKind_LeafU64, token.range); atom->value.u64 = val; } @@ -1068,14 +1068,14 @@ e_push_parse_from_string_tokens__prec(Arena *arena, String8 text, E_TokenArray t // rjf: presence of f after . => f32 if(f_pos < token_string.size) { - atom = e_push_expr(arena, E_ExprKind_LeafF32, token_string.str); + atom = e_push_expr(arena, E_ExprKind_LeafF32, token.range); atom->value.f32 = val; } // rjf: no f => f64 else { - atom = e_push_expr(arena, E_ExprKind_LeafF64, token_string.str); + atom = e_push_expr(arena, E_ExprKind_LeafF64, token.range); atom->value.f64 = val; } } @@ -1092,12 +1092,12 @@ e_push_parse_from_string_tokens__prec(Arena *arena, String8 text, E_TokenArray t String8 char_literal_escaped = str8_skip(str8_chop(token_string, 1), 1); String8 char_literal_raw = raw_from_escaped_str8(scratch.arena, char_literal_escaped); U8 char_val = char_literal_raw.size > 0 ? char_literal_raw.str[0] : 0; - atom = e_push_expr(arena, E_ExprKind_LeafU64, token_string.str); + atom = e_push_expr(arena, E_ExprKind_LeafU64, token.range); atom->value.u64 = (U64)char_val; } else { - e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, token_string.str, "Malformed character literal."); + e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, token.range, "Malformed character literal."); } } @@ -1110,7 +1110,7 @@ e_push_parse_from_string_tokens__prec(Arena *arena, String8 text, E_TokenArray t { String8 string_value_escaped = str8_chop(str8_skip(token_string, 1), 1); String8 string_value_raw = raw_from_escaped_str8(arena, string_value_escaped); - atom = e_push_expr(arena, E_ExprKind_LeafFilePath, token_string.str); + atom = e_push_expr(arena, E_ExprKind_LeafFilePath, token.range); atom->string = string_value_raw; it += 1; } @@ -1122,7 +1122,7 @@ e_push_parse_from_string_tokens__prec(Arena *arena, String8 text, E_TokenArray t { String8 string_value_escaped = str8_chop(str8_skip(token_string, 1), 1); String8 string_value_raw = raw_from_escaped_str8(arena, string_value_escaped); - atom = e_push_expr(arena, E_ExprKind_LeafStringLiteral, token_string.str); + atom = e_push_expr(arena, E_ExprKind_LeafStringLiteral, token.range); atom->string = string_value_raw; it += 1; } @@ -1183,9 +1183,9 @@ e_push_parse_from_string_tokens__prec(Arena *arena, String8 text, E_TokenArray t { it += 1; E_Expr *lhs = atom; - E_Expr *rhs = e_push_expr(arena, E_ExprKind_LeafIdentifier, member_name_maybe_string.str); + E_Expr *rhs = e_push_expr(arena, E_ExprKind_LeafIdentifier, member_name_maybe.range); rhs->string = member_name_maybe_string; - atom = e_push_expr(arena, E_ExprKind_MemberAccess, token_string.str); + atom = e_push_expr(arena, E_ExprKind_MemberAccess, token.range); e_expr_push_child(atom, lhs); e_expr_push_child(atom, rhs); } @@ -1193,7 +1193,7 @@ e_push_parse_from_string_tokens__prec(Arena *arena, String8 text, E_TokenArray t // rjf: no identifier after `.`? -> error else { - e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, token_string.str, "Missing member name after `%S`.", token_string); + e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, token.range, "Missing member name after `%S`.", token_string); } } @@ -1216,7 +1216,7 @@ e_push_parse_from_string_tokens__prec(Arena *arena, String8 text, E_TokenArray t { E_Expr *array_expr = atom; E_Expr *index_expr = idx_expr_parse.expr; - atom = e_push_expr(arena, E_ExprKind_ArrayIndex, token_string.str); + atom = e_push_expr(arena, E_ExprKind_ArrayIndex, token.range); e_expr_push_child(atom, array_expr); e_expr_push_child(atom, index_expr); } @@ -1227,7 +1227,7 @@ e_push_parse_from_string_tokens__prec(Arena *arena, String8 text, E_TokenArray t String8 close_brace_maybe_string = str8_substr(text, close_brace_maybe.range); if(close_brace_maybe.kind != E_TokenKind_Symbol || !str8_match(close_brace_maybe_string, str8_lit("]"), 0)) { - e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, token_string.str, "Unclosed `[`."); + e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, token.range, "Unclosed `[`."); } else { @@ -1247,7 +1247,7 @@ e_push_parse_from_string_tokens__prec(Arena *arena, String8 text, E_TokenArray t // rjf: parse all argument expressions E_Expr *callee_expr = atom; - E_Expr *call_expr = e_push_expr(arena, E_ExprKind_Call, token_string.str); + E_Expr *call_expr = e_push_expr(arena, E_ExprKind_Call, token.range); call_expr->string = callee_expr->string; e_expr_push_child(call_expr, callee_expr); E_Parse args_parse = e_push_parse_from_string_tokens__prec(arena, text, e_token_array_make_first_opl(it, it_opl), e_max_precedence, max_U64); @@ -1270,7 +1270,7 @@ e_push_parse_from_string_tokens__prec(Arena *arena, String8 text, E_TokenArray t String8 close_paren_maybe_string = str8_substr(text, close_paren_maybe.range); if(close_paren_maybe.kind != E_TokenKind_Symbol || !str8_match(close_paren_maybe_string, str8_lit(")"), 0)) { - e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, token_string.str, "Unclosed `(`."); + e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, token.range, "Unclosed `(`."); } else { @@ -1294,7 +1294,7 @@ e_push_parse_from_string_tokens__prec(Arena *arena, String8 text, E_TokenArray t 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); + atom = e_push_expr(arena, E_ExprKind_Cast, cast->type_expr->range); e_expr_push_child(atom, cast->type_expr); e_expr_push_child(atom, rhs); } @@ -1310,13 +1310,13 @@ e_push_parse_from_string_tokens__prec(Arena *arena, String8 text, E_TokenArray t prefix_unary = prefix_unary->next) { E_Expr *rhs = atom; - atom = e_push_expr(arena, prefix_unary->kind, prefix_unary->location); + atom = e_push_expr(arena, prefix_unary->kind, prefix_unary->range); e_expr_push_child(atom, rhs); } } else if(first_prefix_unary != 0) { - e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, last_prefix_unary->location, "Missing expression."); + e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, last_prefix_unary->range, "Missing expression."); } //////////////////////////// @@ -1359,17 +1359,17 @@ e_push_parse_from_string_tokens__prec(Arena *arena, String8 text, E_TokenArray t // carving out a special case here to allow "unfinished *s" to be // treated as pointers instead. E_Expr *ptee = atom; - atom = e_push_expr(arena, E_ExprKind_Ptr, token_string.str); + atom = e_push_expr(arena, E_ExprKind_Ptr, token.range); e_expr_push_child(atom, ptee); } else if(rhs == &e_expr_nil) { - e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, token_string.str, "Missing right-hand-side of `%S`.", token_string); + e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, token.range, "Missing right-hand-side of `%S`.", token_string); } else { E_Expr *lhs = atom; - atom = e_push_expr(arena, binary_kind, token_string.str); + atom = e_push_expr(arena, binary_kind, token.range); e_expr_push_child(atom, lhs); e_expr_push_child(atom, rhs); } @@ -1389,7 +1389,7 @@ e_push_parse_from_string_tokens__prec(Arena *arena, String8 text, E_TokenArray t e_msg_list_concat_in_place(&result.msgs, &middle_expr_parse.msgs); if(middle_expr_parse.expr == &e_expr_nil) { - e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, token_string.str, "Expected expression after `?`."); + e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, token.range, "Expected expression after `?`."); } // rjf: expect : @@ -1401,7 +1401,7 @@ e_push_parse_from_string_tokens__prec(Arena *arena, String8 text, E_TokenArray t String8 colon_token_maybe_string = str8_substr(text, colon_token_maybe.range); if(colon_token_maybe.kind != E_TokenKind_Symbol || !str8_match(colon_token_maybe_string, str8_lit(":"), 0)) { - e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, token_string.str, "Expected `:` after `?`."); + e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, token.range, "Expected `:` after `?`."); } else { @@ -1420,7 +1420,7 @@ e_push_parse_from_string_tokens__prec(Arena *arena, String8 text, E_TokenArray t e_msg_list_concat_in_place(&result.msgs, &rhs_expr_parse.msgs); if(rhs_expr_parse.expr == &e_expr_nil) { - e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, colon_token_string.str, "Expected expression after `:`."); + e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, colon_token.range, "Expected expression after `:`."); } } @@ -1432,7 +1432,7 @@ e_push_parse_from_string_tokens__prec(Arena *arena, String8 text, E_TokenArray t E_Expr *lhs = atom; E_Expr *mhs = middle_expr_parse.expr; E_Expr *rhs = rhs_expr_parse.expr; - atom = e_push_expr(arena, E_ExprKind_Ternary, token_string.str); + atom = e_push_expr(arena, E_ExprKind_Ternary, token.range); e_expr_push_child(atom, lhs); e_expr_push_child(atom, mhs); e_expr_push_child(atom, rhs); diff --git a/src/eval/eval_parse.h b/src/eval/eval_parse.h index 7ab6a07d..c8e91b4b 100644 --- a/src/eval/eval_parse.h +++ b/src/eval/eval_parse.h @@ -17,7 +17,7 @@ internal E_TokenArray e_token_array_make_first_opl(E_Token *first, E_Token *opl) //////////////////////////////// //~ rjf: Expression Tree Building Functions -internal E_Expr *e_push_expr(Arena *arena, E_ExprKind kind, void *location); +internal E_Expr *e_push_expr(Arena *arena, E_ExprKind kind, Rng1U64 range); 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); diff --git a/src/eval/eval_types.c b/src/eval/eval_types.c index d13607e5..8170d349 100644 --- a/src/eval/eval_types.c +++ b/src/eval/eval_types.c @@ -2768,12 +2768,6 @@ E_TYPE_EXPAND_RANGE_FUNCTION_DEF(file) if(0 <= idx && idx < accel->fields.count) { String8 name = accel->fields.v[idx]; - expr = e_push_expr(arena, E_ExprKind_MemberAccess, 0); - E_Expr *lhs = e_expr_ref(arena, expr); - E_Expr *rhs = e_push_expr(arena, E_ExprKind_LeafIdentifier, 0); - rhs->string = push_str8_copy(arena, name); - e_expr_push_child(expr, lhs); - e_expr_push_child(expr, rhs); evals_out[out_idx] = e_eval_wrapf(eval, "$.%S", name); } } diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 59865ca2..1f108d6f 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -11428,7 +11428,7 @@ rd_frame(void) .info = E_TYPE_EXPAND_INFO_FUNCTION_NAME(commands), .range = E_TYPE_EXPAND_RANGE_FUNCTION_NAME(commands), }); - E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0); + E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, r1u64(0, 0)); expr->type_key = type_key; expr->space = e_space_make(RD_EvalSpaceKind_MetaQuery); e_string2expr_map_insert(scratch.arena, macro_map, name, expr); @@ -11457,7 +11457,7 @@ rd_frame(void) E_TypeKey type_key = e_type_key_cons(.name = name, .kind = E_TypeKind_Set, .access = E_TYPE_ACCESS_FUNCTION_NAME(cfgs)); - E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0); + E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, r1u64(0, 0)); expr->type_key = type_key; expr->space = e_space_make(RD_EvalSpaceKind_MetaQuery); e_string2expr_map_insert(scratch.arena, macro_map, name, expr); @@ -11470,7 +11470,7 @@ rd_frame(void) E_TypeKey type_key = e_type_key_cons(.name = name, .kind = E_TypeKind_Set, .access = E_TYPE_ACCESS_FUNCTION_NAME(control)); - E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0); + E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, r1u64(0, 0)); expr->type_key = type_key; expr->space = e_space_make(RD_EvalSpaceKind_MetaQuery); e_string2expr_map_insert(scratch.arena, macro_map, name, expr); @@ -11502,7 +11502,7 @@ rd_frame(void) .id_from_num = E_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_NAME(cfgs_slice), .num_from_id = E_TYPE_EXPAND_NUM_FROM_ID_FUNCTION_NAME(cfgs_slice), }); - E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0); + E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, r1u64(0, 0)); expr->type_key = collection_type_key; expr->space = e_space_make(RD_EvalSpaceKind_MetaQuery); e_string2expr_map_insert(scratch.arena, macro_map, collection_name, expr); @@ -11536,7 +11536,7 @@ rd_frame(void) if(label.size != 0) { E_Space space = rd_eval_space_from_cfg(cfg); - E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0); + E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, r1u64(0, 0)); expr->space = space; expr->mode = E_Mode_Offset; expr->type_key = type_key; @@ -11556,7 +11556,7 @@ rd_frame(void) { E_TypeKey type_key = e_string2typekey_map_lookup(rd_state->meta_name2type_map, window->string); E_Space space = rd_eval_space_from_cfg(window); - E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0); + E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, r1u64(0, 0)); expr->space = space; expr->mode = E_Mode_Offset; expr->type_key = type_key; @@ -11572,7 +11572,7 @@ rd_frame(void) RD_Cfg *tab = tab_n->v; E_TypeKey type_key = e_string2typekey_map_lookup(rd_state->meta_name2type_map, tab->string); E_Space space = rd_eval_space_from_cfg(tab); - E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0); + E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, r1u64(0, 0)); expr->space = space; expr->mode = E_Mode_Offset; expr->type_key = type_key; @@ -11645,7 +11645,7 @@ rd_frame(void) { E_TypeKey type_key = e_string2typekey_map_lookup(rd_state->meta_name2type_map, str8_lit("user")); E_Space space = rd_eval_space_from_cfg(rd_cfg_child_from_string(rd_state->root_cfg, str8_lit("user"))); - E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0); + E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, r1u64(0, 0)); expr->space = space; expr->mode = E_Mode_Offset; expr->type_key = type_key; @@ -11654,7 +11654,7 @@ rd_frame(void) { E_TypeKey type_key = e_string2typekey_map_lookup(rd_state->meta_name2type_map, str8_lit("project")); E_Space space = rd_eval_space_from_cfg(rd_cfg_child_from_string(rd_state->root_cfg, str8_lit("project"))); - E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0); + E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, r1u64(0, 0)); expr->space = space; expr->mode = E_Mode_Offset; expr->type_key = type_key; @@ -11679,7 +11679,7 @@ rd_frame(void) { CTRL_Entity *entity = array.v[idx]; E_Space space = rd_eval_space_from_ctrl_entity(entity, RD_EvalSpaceKind_MetaCtrlEntity); - E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0); + E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, r1u64(0, 0)); expr->space = space; expr->mode = E_Mode_Offset; expr->type_key = type_key; @@ -11719,7 +11719,7 @@ rd_frame(void) .info = E_TYPE_EXPAND_INFO_FUNCTION_NAME(ctrl_entities), .range = E_TYPE_EXPAND_RANGE_FUNCTION_NAME(ctrl_entities) }); - E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0); + E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, r1u64(0, 0)); expr->type_key = collection_type_key; expr->space = e_space_make(RD_EvalSpaceKind_MetaQuery); e_string2expr_map_insert(scratch.arena, macro_map, collection_name, expr); @@ -11738,7 +11738,7 @@ rd_frame(void) .info = E_TYPE_EXPAND_INFO_FUNCTION_NAME(unattached_processes), .range = E_TYPE_EXPAND_RANGE_FUNCTION_NAME(unattached_processes) }); - E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0); + E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, r1u64(0, 0)); expr->type_key = collection_type_key; expr->space = e_space_make(RD_EvalSpaceKind_MetaCtrlEntity); e_string2expr_map_insert(scratch.arena, macro_map, collection_name, expr); @@ -11823,7 +11823,7 @@ rd_frame(void) for EachElement(idx, collection_infos) { String8 collection_name = collection_infos[idx].name; - E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0); + E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, r1u64(0, 0)); expr->type_key = e_type_key_cons(.kind = E_TypeKind_Set, .name = collection_name, .expand = @@ -11847,7 +11847,7 @@ rd_frame(void) for EachElement(idx, debug_info_table_collection_names) { String8 name = debug_info_table_collection_names[idx]; - E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0); + E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, r1u64(0, 0)); expr->space = e_space_make(RD_EvalSpaceKind_MetaQuery); expr->type_key = e_type_key_cons(.kind = E_TypeKind_Set, .flags = E_TypeFlag_StubSingleLineExpansion, @@ -11869,7 +11869,7 @@ rd_frame(void) U128 hash = hs_hash_from_key(key, 0); String8 data = hs_data_from_hash(hs_scope, hash); E_Space space = e_space_make(E_SpaceKind_HashStoreKey); - E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0); + E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, r1u64(0, 0)); space.u128 = key; expr->space = space; expr->mode = E_Mode_Offset; @@ -11982,7 +11982,7 @@ rd_frame(void) { type_flags |= E_TypeFlag_ArrayLikeExpansion; } - E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0); + E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, r1u64(0, 0)); expr->type_key = e_type_key_cons(.kind = E_TypeKind_LensSpec, .flags = type_flags, .name = lens_table[idx].name,