mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-06-16 09:02:22 -07:00
eval: distinguish irtree 'parents' from 'overrides' - parents are any irtree which some other expression is extending, and overrides are a subset of those, being just the irtrees overridden by auto-hooks. doing this because when we unwind the parent chain, sometimes we do not want to do that for basic expression extensions - we just want to undo the overrides.
This commit is contained in:
@@ -838,9 +838,9 @@ e_irtree_from_bundle(E_CacheBundle *bundle)
|
||||
if(bundle != &e_cache_bundle_nil && !(bundle->flags & E_CacheBundleFlag_IRTree))
|
||||
{
|
||||
bundle->flags |= E_CacheBundleFlag_IRTree;
|
||||
E_IRTreeAndType overridden = e_irtree_from_key(bundle->parent_key);
|
||||
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, &overridden, 0, 0, 0, parse.expr);
|
||||
bundle->irtree = e_push_irtree_and_type_from_expr(e_cache->arena, &parent, 0, 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);
|
||||
}
|
||||
|
||||
+120
-139
@@ -348,7 +348,7 @@ e_expr_unpoison(E_Expr *expr)
|
||||
}
|
||||
}
|
||||
|
||||
//- rjf: default type access hook
|
||||
//- rjf: top-level irtree/type extraction
|
||||
|
||||
E_TYPE_ACCESS_FUNCTION_DEF(default)
|
||||
{
|
||||
@@ -582,10 +582,8 @@ E_TYPE_ACCESS_FUNCTION_DEF(default)
|
||||
return result;
|
||||
}
|
||||
|
||||
//- rjf: top-level irtree/type extraction
|
||||
|
||||
internal E_IRTreeAndType
|
||||
e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_overridden, 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, B32 disallow_chained_casts, E_Expr *root_expr)
|
||||
{
|
||||
ProfBeginFunction();
|
||||
Temp scratch = scratch_begin(&arena, 1);
|
||||
@@ -600,26 +598,19 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_overridden,
|
||||
{
|
||||
Task *next;
|
||||
E_Expr *expr;
|
||||
E_IRTreeAndType *prev;
|
||||
E_IRTreeAndType *overridden;
|
||||
};
|
||||
Task start_task = {0, root_expr, root_overridden};
|
||||
Task start_task = {0, root_expr, 0};
|
||||
Task *first_task = &start_task;
|
||||
Task *last_task = first_task;
|
||||
for(Task *t = first_task; t != 0; t = t->next)
|
||||
{
|
||||
E_Expr *expr = t->expr;
|
||||
E_IRTreeAndType *parent = t->overridden ? t->overridden : root_parent;
|
||||
|
||||
//- rjf: poison the expression we are about to use, so we don't recursively use it
|
||||
e_expr_poison(expr);
|
||||
|
||||
//- rjf: select the task's previous ir-tree-and-type as the overridden tree
|
||||
E_IRTreeAndType *overridden = 0;
|
||||
if(t->prev != 0)
|
||||
{
|
||||
overridden = push_array(arena, E_IRTreeAndType, 1);
|
||||
MemoryCopyStruct(overridden, t->prev);
|
||||
}
|
||||
|
||||
//- rjf: do expr -> irtree generation for this expression
|
||||
if(expr->kind == E_ExprKind_Ref)
|
||||
{
|
||||
@@ -636,7 +627,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_overridden,
|
||||
{
|
||||
// rjf: unpack left-hand-side
|
||||
E_Expr *lhs = expr->first;
|
||||
E_IRTreeAndType lhs_irtree = e_push_irtree_and_type_from_expr(arena, overridden, disallow_autohooks, disallow_chained_fastpaths, disallow_chained_casts, lhs);
|
||||
E_IRTreeAndType lhs_irtree = e_push_irtree_and_type_from_expr(arena, parent, disallow_autohooks, disallow_chained_fastpaths, disallow_chained_casts, lhs);
|
||||
e_msg_list_concat_in_place(&result.msgs, &lhs_irtree.msgs);
|
||||
|
||||
// rjf: try all IR trees in chain
|
||||
@@ -678,7 +669,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_overridden,
|
||||
}
|
||||
|
||||
// rjf: call into hook to do access
|
||||
result = lhs_access(arena, overridden, expr, lhs_irtree_try);
|
||||
result = lhs_access(arena, parent, expr, lhs_irtree_try);
|
||||
|
||||
// rjf: end chain if we found a result
|
||||
if(result.root != &e_irnode_nil)
|
||||
@@ -693,7 +684,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_overridden,
|
||||
{
|
||||
// rjf: unpack operand
|
||||
E_Expr *r_expr = expr->first;
|
||||
E_IRTreeAndType r_tree = e_push_irtree_and_type_from_expr(arena, overridden, 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, disallow_chained_fastpaths, disallow_chained_casts, 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);
|
||||
@@ -752,7 +743,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_overridden,
|
||||
{
|
||||
// rjf: unpack operand
|
||||
E_Expr *r_expr = expr->first;
|
||||
E_IRTreeAndType r_tree = e_push_irtree_and_type_from_expr(arena, overridden, 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, disallow_chained_fastpaths, disallow_chained_casts, 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);
|
||||
@@ -780,12 +771,12 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_overridden,
|
||||
// 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, overridden, 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, disallow_chained_fastpaths, disallow_chained_casts, 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, overridden, 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, disallow_chained_fastpaths, disallow_chained_casts, 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);
|
||||
@@ -840,7 +831,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_overridden,
|
||||
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, overridden, 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, disallow_chained_fastpaths, disallow_chained_casts, r_expr);
|
||||
e_msg_list_concat_in_place(&result.msgs, &r_tree.msgs);
|
||||
r_type = r_tree.type_key;
|
||||
|
||||
@@ -868,7 +859,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_overridden,
|
||||
{
|
||||
// rjf: evaluate operand tree
|
||||
E_Expr *r_expr = expr->first;
|
||||
E_IRTreeAndType r_tree = e_push_irtree_and_type_from_expr(arena, overridden, 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, disallow_chained_fastpaths, disallow_chained_casts, r_expr);
|
||||
e_msg_list_concat_in_place(&result.msgs, &r_tree.msgs);
|
||||
|
||||
// rjf: fill output
|
||||
@@ -882,7 +873,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_overridden,
|
||||
{
|
||||
// rjf: unpack operand
|
||||
E_Expr *r_expr = expr->first;
|
||||
E_IRTreeAndType r_tree = e_push_irtree_and_type_from_expr(arena, overridden, 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, disallow_chained_fastpaths, disallow_chained_casts, 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);
|
||||
@@ -910,14 +901,14 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_overridden,
|
||||
//- rjf: unary operations
|
||||
case E_ExprKind_Pos:
|
||||
{
|
||||
result = e_push_irtree_and_type_from_expr(arena, overridden, disallow_autohooks, disallow_chained_fastpaths, disallow_chained_casts, expr->first);
|
||||
result = e_push_irtree_and_type_from_expr(arena, parent, disallow_autohooks, disallow_chained_fastpaths, disallow_chained_casts, 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, overridden, 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, disallow_chained_fastpaths, disallow_chained_casts, 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);
|
||||
@@ -950,7 +941,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_overridden,
|
||||
{
|
||||
// rjf: unpack operand
|
||||
E_Expr *r_expr = expr->first;
|
||||
E_IRTreeAndType r_tree = e_push_irtree_and_type_from_expr(arena, overridden, 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, disallow_chained_fastpaths, disallow_chained_casts, 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);
|
||||
@@ -1005,8 +996,8 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_overridden,
|
||||
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, overridden, disallow_autohooks, disallow_chained_fastpaths, disallow_chained_casts, l_expr);
|
||||
E_IRTreeAndType r_tree = e_push_irtree_and_type_from_expr(arena, overridden, 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, 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_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);
|
||||
@@ -1229,9 +1220,9 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_overridden,
|
||||
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, overridden, disallow_autohooks, disallow_chained_fastpaths, disallow_chained_casts, c_expr);
|
||||
E_IRTreeAndType l_tree = e_push_irtree_and_type_from_expr(arena, overridden, disallow_autohooks, disallow_chained_fastpaths, disallow_chained_casts, l_expr);
|
||||
E_IRTreeAndType r_tree = e_push_irtree_and_type_from_expr(arena, overridden, 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, 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_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);
|
||||
@@ -1274,8 +1265,9 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_overridden,
|
||||
//- rjf: call
|
||||
case E_ExprKind_Call:
|
||||
{
|
||||
B32 strip_lenses = 0;
|
||||
E_Expr *lhs = expr->first;
|
||||
E_IRTreeAndType lhs_irtree = e_push_irtree_and_type_from_expr(arena, overridden, disallow_autohooks, 1, 1, lhs);
|
||||
E_IRTreeAndType lhs_irtree = e_push_irtree_and_type_from_expr(arena, parent, disallow_autohooks, 1, 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);
|
||||
@@ -1283,7 +1275,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_overridden,
|
||||
// rjf: calling a type? -> treat as a cast of that type
|
||||
if(lhs_irtree.mode == E_Mode_Null && lhs_type != &e_type_nil)
|
||||
{
|
||||
E_IRTreeAndType casted_tree = e_push_irtree_and_type_from_expr(arena, overridden, 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, disallow_chained_casts, 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);
|
||||
@@ -1351,108 +1343,69 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_overridden,
|
||||
{
|
||||
e_expr_push_child(call, e_expr_copy(arena, arg));
|
||||
}
|
||||
result = e_push_irtree_and_type_from_expr(arena, overridden, disallow_autohooks, disallow_chained_fastpaths, disallow_chained_casts, call);
|
||||
if(str8_match(callee->string, str8_lit("raw"), 0))
|
||||
{
|
||||
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);
|
||||
E_MsgList new_msgs = {0};
|
||||
e_msg_list_concat_in_place(&new_msgs, &lhs_irtree.msgs);
|
||||
e_msg_list_concat_in_place(&new_msgs, &result.msgs);
|
||||
result.msgs = new_msgs;
|
||||
|
||||
// rjf: is "raw"? -> try to return overridden tree, otherwise strip all
|
||||
// lens types from result; disallow auto-hooks
|
||||
if(str8_match(callee->string, str8_lit("raw"), 0))
|
||||
{
|
||||
disallow_autohooks = 1;
|
||||
if(overridden->root != &e_irnode_nil)
|
||||
{
|
||||
E_MsgList existing_msgs = result.msgs;
|
||||
for(E_IRTreeAndType *prev = overridden; prev->root != &e_irnode_nil; prev = prev->prev)
|
||||
{
|
||||
result = *prev;
|
||||
if(e_type_kind_from_key(prev->type_key) != E_TypeKind_Lens)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
E_MsgList overridden_msgs = e_msg_list_copy(arena, &result.msgs);
|
||||
result.msgs = existing_msgs;
|
||||
e_msg_list_concat_in_place(&result.msgs, &overridden_msgs);
|
||||
}
|
||||
else
|
||||
{
|
||||
result.type_key = e_type_key_unwrap(result.type_key, E_TypeUnwrapFlag_Lenses);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// rjf: calling a lens? -> generate IR for the first argument; wrap the type in
|
||||
// a lens type, which preserves the name & arguments of the lens call expression
|
||||
// rjf: calling a lens? -> generate IR for the first argument; if enabled, wrap
|
||||
// the type in a lens type, which preserves the name & arguments of the lens call
|
||||
// expression
|
||||
else if(lhs_type->kind == E_TypeKind_LensSpec)
|
||||
{
|
||||
Temp scratch = scratch_begin(&arena, 1);
|
||||
|
||||
// rjf: generate result via first argument to lens
|
||||
result = e_push_irtree_and_type_from_expr(arena, overridden, disallow_autohooks, 1, disallow_chained_casts, lhs->next);
|
||||
|
||||
// rjf: count extra arguments
|
||||
U64 arg_count = 0;
|
||||
for(E_Expr *arg = lhs->next->next; arg != &e_expr_nil; arg = arg->next)
|
||||
{
|
||||
arg_count += 1;
|
||||
}
|
||||
|
||||
// rjf: flatten extra arguments
|
||||
E_Expr **args = push_array(scratch.arena, E_Expr *, arg_count);
|
||||
{
|
||||
U64 idx = 0;
|
||||
for(E_Expr *arg = lhs->next->next; arg != &e_expr_nil; arg = arg->next, idx += 1)
|
||||
{
|
||||
args[idx] = arg;
|
||||
}
|
||||
}
|
||||
|
||||
// rjf: is "raw"? -> try to return overridden tree, otherwise strip all
|
||||
// lens types from result; disallow auto-hooks
|
||||
// rjf: is "raw"? -> disable hooks
|
||||
if(str8_match(lhs_type->name, str8_lit("raw"), 0))
|
||||
{
|
||||
strip_lenses = 1;
|
||||
disallow_autohooks = 1;
|
||||
if(overridden->root != &e_irnode_nil)
|
||||
{
|
||||
E_MsgList existing_msgs = result.msgs;
|
||||
result = *overridden;
|
||||
for(E_IRTreeAndType *prev = overridden; prev->root != &e_irnode_nil; prev = prev->prev)
|
||||
{
|
||||
result = *prev;
|
||||
if(e_type_kind_from_key(prev->type_key) != E_TypeKind_Lens)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
E_MsgList overridden_msgs = e_msg_list_copy(arena, &result.msgs);
|
||||
result.msgs = existing_msgs;
|
||||
e_msg_list_concat_in_place(&result.msgs, &overridden_msgs);
|
||||
}
|
||||
else
|
||||
{
|
||||
result = e_push_irtree_and_type_from_expr(arena, overridden, disallow_autohooks, 1, disallow_chained_casts, lhs->next);
|
||||
result.type_key = e_type_key_unwrap(result.type_key, E_TypeUnwrapFlag_Lenses);
|
||||
}
|
||||
}
|
||||
|
||||
// rjf: is non-raw -> patch resultant type with a lens w/ args, pointing to the original type
|
||||
else
|
||||
// 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);
|
||||
|
||||
// rjf: if not raw, wrap resultant type with lens type
|
||||
if(!strip_lenses)
|
||||
{
|
||||
result.type_key = e_type_key_cons(.kind = E_TypeKind_Lens,
|
||||
.flags = lhs_type->flags,
|
||||
.count = arg_count,
|
||||
.args = args,
|
||||
.direct_key = result.type_key,
|
||||
.name = lhs_type->name,
|
||||
.irext = lhs_type->irext,
|
||||
.access = lhs_type->access,
|
||||
.expand = lhs_type->expand);
|
||||
Temp scratch = scratch_begin(&arena, 1);
|
||||
|
||||
// rjf: count extra arguments
|
||||
U64 arg_count = 0;
|
||||
for(E_Expr *arg = lhs->next->next; arg != &e_expr_nil; arg = arg->next)
|
||||
{
|
||||
arg_count += 1;
|
||||
}
|
||||
|
||||
// rjf: flatten extra arguments
|
||||
E_Expr **args = push_array(scratch.arena, E_Expr *, arg_count);
|
||||
{
|
||||
U64 idx = 0;
|
||||
for(E_Expr *arg = lhs->next->next; arg != &e_expr_nil; arg = arg->next, idx += 1)
|
||||
{
|
||||
args[idx] = arg;
|
||||
}
|
||||
}
|
||||
|
||||
// rjf: patch resultant type with a lens w/ args, pointing to the original type
|
||||
{
|
||||
result.type_key = e_type_key_cons(.kind = E_TypeKind_Lens,
|
||||
.flags = lhs_type->flags,
|
||||
.count = arg_count,
|
||||
.args = args,
|
||||
.direct_key = result.type_key,
|
||||
.name = lhs_type->name,
|
||||
.irext = lhs_type->irext,
|
||||
.access = lhs_type->access,
|
||||
.expand = lhs_type->expand);
|
||||
}
|
||||
scratch_end(scratch);
|
||||
}
|
||||
|
||||
scratch_end(scratch);
|
||||
}
|
||||
|
||||
// rjf: calling any other type? -> not valid
|
||||
@@ -1460,6 +1413,23 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_overridden,
|
||||
{
|
||||
e_msgf(arena, &result.msgs, E_MsgKind_InterpretationError, expr->location, "Calling this type is not supported.");
|
||||
}
|
||||
|
||||
// rjf: strip overrides and lenses if needed
|
||||
if(strip_lenses)
|
||||
{
|
||||
if(t->overridden)
|
||||
{
|
||||
E_MsgList existing_msgs = result.msgs;
|
||||
for(E_IRTreeAndType *prev = t->overridden; prev != 0; prev = prev->prev)
|
||||
{
|
||||
result = *prev;
|
||||
}
|
||||
E_MsgList overridden_msgs = e_msg_list_copy(arena, &result.msgs);
|
||||
result.msgs = existing_msgs;
|
||||
e_msg_list_concat_in_place(&result.msgs, &overridden_msgs);
|
||||
}
|
||||
result.type_key = e_type_key_unwrap(result.type_key, E_TypeUnwrapFlag_Lenses|E_TypeUnwrapFlag_Meta);
|
||||
}
|
||||
}break;
|
||||
|
||||
//- rjf: leaf bytecode
|
||||
@@ -1560,24 +1530,32 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_overridden,
|
||||
}
|
||||
}
|
||||
|
||||
//- rjf: try to map name as overridden expression signifier ('$')
|
||||
if(!string_mapped && str8_match(string, str8_lit("$"), 0) && (overridden->root != &e_irnode_nil || overridden->msgs.first != 0))
|
||||
//- rjf: try to map name as parent expression signifier ('$')
|
||||
if(!string_mapped && str8_match(string, str8_lit("$"), 0) && parent != 0 && (parent->root != &e_irnode_nil || parent->msgs.first != 0))
|
||||
{
|
||||
E_OpList oplist = e_oplist_from_irtree(arena, overridden->root);
|
||||
E_IRTreeAndType *parent_irtree = parent;
|
||||
if(disallow_autohooks)
|
||||
{
|
||||
for(E_IRTreeAndType *prev = parent_irtree->prev; prev != 0; prev = prev->prev)
|
||||
{
|
||||
parent_irtree = prev;
|
||||
}
|
||||
}
|
||||
E_OpList oplist = e_oplist_from_irtree(arena, parent_irtree->root);
|
||||
string_mapped = 1;
|
||||
mapped_bytecode = e_bytecode_from_oplist(arena, &oplist);
|
||||
mapped_bytecode_mode = overridden->mode;
|
||||
mapped_type_key = overridden->type_key;
|
||||
mapped_bytecode_mode = parent_irtree->mode;
|
||||
mapped_type_key = parent_irtree->type_key;
|
||||
disallow_autohooks = 1;
|
||||
E_MsgList msgs = e_msg_list_copy(arena, &overridden->msgs);
|
||||
E_MsgList msgs = e_msg_list_copy(arena, &parent_irtree->msgs);
|
||||
e_msg_list_concat_in_place(&result.msgs, &msgs);
|
||||
}
|
||||
|
||||
//- rjf: try to map name as implicit access of overridden expression ('$.member_name', where the $. prefix is omitted)
|
||||
if(!string_mapped && overridden->root != &e_irnode_nil)
|
||||
if(!string_mapped && parent != 0 && parent->root != &e_irnode_nil)
|
||||
{
|
||||
E_Expr *access = e_expr_irext_member_access(scratch.arena, &e_expr_nil, overridden, string);
|
||||
E_IRTreeAndType access_irtree = e_push_irtree_and_type_from_expr(scratch.arena, overridden, disallow_autohooks, 1, 1, access);
|
||||
E_Expr *access = e_expr_irext_member_access(scratch.arena, &e_expr_nil, parent, string);
|
||||
E_IRTreeAndType access_irtree = e_push_irtree_and_type_from_expr(scratch.arena, parent, disallow_autohooks, 1, 1, access);
|
||||
if(access_irtree.root != &e_irnode_nil)
|
||||
{
|
||||
string_mapped = 1;
|
||||
@@ -1945,7 +1923,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_overridden,
|
||||
{
|
||||
generated = 1;
|
||||
e_string2expr_map_inc_poison(e_ir_ctx->macro_map, string);
|
||||
result = e_push_irtree_and_type_from_expr(arena, overridden, disallow_autohooks, disallow_chained_fastpaths, disallow_chained_casts, macro_expr);
|
||||
result = e_push_irtree_and_type_from_expr(arena, parent, disallow_autohooks, disallow_chained_fastpaths, disallow_chained_casts, macro_expr);
|
||||
e_string2expr_map_dec_poison(e_ir_ctx->macro_map, string);
|
||||
}
|
||||
}
|
||||
@@ -2032,7 +2010,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_overridden,
|
||||
}break;
|
||||
case E_ExprKind_Unsigned:
|
||||
{
|
||||
E_IRTreeAndType direct_irtree = e_push_irtree_and_type_from_expr(arena, overridden, 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, disallow_chained_fastpaths, disallow_chained_casts, 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);
|
||||
@@ -2062,13 +2040,13 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_overridden,
|
||||
}break;
|
||||
case E_ExprKind_Ptr:
|
||||
{
|
||||
E_IRTreeAndType ptee_irtree = e_push_irtree_and_type_from_expr(arena, overridden, 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, disallow_chained_fastpaths, disallow_chained_casts, 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, overridden, 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, disallow_chained_fastpaths, disallow_chained_casts, expr->first);
|
||||
result = element_irtree;
|
||||
result.type_key = e_type_key_cons_array(result.type_key, expr->value.u64, 0);
|
||||
}break;
|
||||
@@ -2082,7 +2060,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_overridden,
|
||||
{
|
||||
E_Expr *lhs = expr->first;
|
||||
E_Expr *rhs = lhs->next;
|
||||
result = e_push_irtree_and_type_from_expr(arena, overridden, disallow_autohooks, disallow_chained_fastpaths, disallow_chained_casts, rhs);
|
||||
result = e_push_irtree_and_type_from_expr(arena, parent, disallow_autohooks, disallow_chained_fastpaths, disallow_chained_casts, 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.");
|
||||
@@ -2097,7 +2075,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_overridden,
|
||||
{
|
||||
// rjf: unpack
|
||||
E_IRTreeAndType cast_type_tree = result;
|
||||
E_IRTreeAndType casted_tree = e_push_irtree_and_type_from_expr(arena, overridden, disallow_autohooks, 1, disallow_chained_casts, expr->next);
|
||||
E_IRTreeAndType casted_tree = e_push_irtree_and_type_from_expr(arena, parent, disallow_autohooks, 1, disallow_chained_casts, expr->next);
|
||||
e_msg_list_concat_in_place(&result.msgs, &casted_tree.msgs);
|
||||
E_TypeKey cast_type = cast_type_tree.type_key;
|
||||
E_TypeKind cast_type_kind = e_type_kind_from_key(cast_type);
|
||||
@@ -2234,9 +2212,10 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_overridden,
|
||||
}
|
||||
|
||||
//- rjf: equip previous task's irtree
|
||||
if(t->prev != 0)
|
||||
if(t->overridden != 0)
|
||||
{
|
||||
result.prev = overridden;
|
||||
result.prev = push_array(arena, E_IRTreeAndType, 1);
|
||||
result.prev[0] = *t->overridden;
|
||||
}
|
||||
|
||||
//- rjf: find any auto hooks according to this generation's type
|
||||
@@ -2253,11 +2232,13 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_overridden,
|
||||
Task *task = push_array(scratch.arena, Task, 1);
|
||||
SLLQueuePush(first_task, last_task, task);
|
||||
task->expr = e;
|
||||
task->prev = &result;
|
||||
break;
|
||||
task->overridden = push_array(scratch.arena, E_IRTreeAndType, 1);
|
||||
task->overridden[0] = result;
|
||||
goto end_autohook_find;
|
||||
}
|
||||
}
|
||||
}
|
||||
end_autohook_find:;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -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_overridden, 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, B32 disallow_chained_casts, 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);
|
||||
|
||||
+9
-20
@@ -2251,31 +2251,22 @@ E_TYPE_EXPAND_INFO_FUNCTION_DEF(omit)
|
||||
Temp scratch = scratch_begin(&arena, 1);
|
||||
String8List allowed_children = {0};
|
||||
{
|
||||
#if 0 // TODO(rjf): @eval
|
||||
E_Type *stripped_type = e_type_from_key__cached(type->direct_type_key);
|
||||
// TODO(rjf): this is kind of ugly due to the need to call irext,
|
||||
// i wish it was possible to have an easier way to "strip" the current
|
||||
// lens & evaluate the wrapped expression?
|
||||
E_IRTreeAndType irtree_stripped = *irtree;
|
||||
irtree_stripped.type_key = type->direct_type_key;
|
||||
irtree_stripped.user_data = stripped_type->irext ? stripped_type->irext(scratch.arena, expr, &irtree_stripped).user_data : 0;
|
||||
E_TypeExpandRule *expand_rule = e_expand_rule_from_type_key(irtree_stripped.type_key);
|
||||
// TODO(rjf): @eval before expanding a type, ALWAYS select the parent key
|
||||
E_TypeExpandInfo expand_info = expand_rule->info(scratch.arena, expr, &irtree_stripped, filter);
|
||||
E_Eval eval_stripped = e_eval_wrapf(eval, "raw($)");
|
||||
E_TypeExpandRule *expand_rule = e_expand_rule_from_type_key(eval_stripped.irtree.type_key);
|
||||
E_TypeExpandInfo expand_info = expand_rule->info(scratch.arena, eval_stripped, filter);
|
||||
if(expand_info.expr_count < 4096)
|
||||
{
|
||||
E_Expr **exprs = push_array(scratch.arena, E_Expr *, expand_info.expr_count);
|
||||
String8 *exprs_strings = push_array(scratch.arena, String8, expand_info.expr_count);
|
||||
E_Eval *evals = push_array(scratch.arena, E_Eval, expand_info.expr_count);
|
||||
for EachIndex(idx, expand_info.expr_count)
|
||||
{
|
||||
exprs[idx] = &e_expr_nil;
|
||||
evals[idx] = e_eval_nil;
|
||||
}
|
||||
expand_rule->range(scratch.arena, expand_info.user_data, expr, &irtree_stripped, filter, r1u64(0, expand_info.expr_count), exprs, exprs_strings);
|
||||
expand_rule->range(scratch.arena, expand_info.user_data, eval_stripped, filter, r1u64(0, expand_info.expr_count), evals);
|
||||
for EachIndex(idx, expand_info.expr_count)
|
||||
{
|
||||
if(exprs[idx]->kind == E_ExprKind_MemberAccess)
|
||||
if(evals[idx].expr->kind == E_ExprKind_MemberAccess)
|
||||
{
|
||||
String8 name = exprs[idx]->first->next->string;
|
||||
String8 name = evals[idx].expr->first->next->string;
|
||||
B32 name_is_allowed = 1;
|
||||
for EachIndex(arg_idx, type->count)
|
||||
{
|
||||
@@ -2292,7 +2283,6 @@ E_TYPE_EXPAND_INFO_FUNCTION_DEF(omit)
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
allowed_children_array = str8_array_from_list(arena, &allowed_children);
|
||||
scratch_end(scratch);
|
||||
@@ -2476,8 +2466,7 @@ E_TYPE_ACCESS_FUNCTION_DEF(slice)
|
||||
}
|
||||
|
||||
// rjf: compute struct.base_ptr IR tree
|
||||
E_IRTreeAndType override = {&e_irnode_nil};
|
||||
result = e_push_irtree_and_type_from_expr(arena, &override, 0, 0, 0, idx_expr);
|
||||
result = e_push_irtree_and_type_from_expr(arena, 0, 0, 0, 0, idx_expr);
|
||||
|
||||
scratch_end(scratch);
|
||||
}break;
|
||||
|
||||
@@ -101,6 +101,10 @@ ev_expansion_type_from_key(E_TypeKey type_key)
|
||||
done = 1;
|
||||
result = key;
|
||||
}
|
||||
else
|
||||
{
|
||||
done = 0;
|
||||
}
|
||||
}
|
||||
|
||||
//- rjf: if we have meta-expression tags in the type chain, defer
|
||||
|
||||
Reference in New Issue
Block a user