mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-08-06 13:58:40 +00:00
switch cast expressions from being formally represented in the expression tree - instead use cast-like tree shapes to perform casts in the ir/typechecking phase. this is odd, given C's casting syntax, but it is much more natural given that the parser is not any longer doing identifier resolution, and as such it fixes a bunch of nasty edge cases.
This commit is contained in:
+49
-48
@@ -82,63 +82,64 @@ E_TypeKindTable:
|
|||||||
@table(name op_kind precedence op_pre op_sep op_pos op_chain)
|
@table(name op_kind precedence op_pre op_sep op_pos op_chain)
|
||||||
E_ExprKindTable:
|
E_ExprKindTable:
|
||||||
{
|
{
|
||||||
{ Nil Null 0 "" "" "" "" }
|
{ Nil Null 0 "" "" "" "" }
|
||||||
{ Ref Null 0 "" "" "" "" }
|
{ Ref Null 0 "" "" "" "" }
|
||||||
|
|
||||||
{ ArrayIndex Null 0 "" "[" "]" "" }
|
{ ArrayIndex Null 0 "" "[" "]" "" }
|
||||||
{ MemberAccess Null 0 "" "." "" "" }
|
{ MemberAccess Null 0 "" "." "" "" }
|
||||||
{ Deref UnaryPrefix 2 "*" "" "" "" }
|
{ Deref UnaryPrefix 2 "*" "" "" "" }
|
||||||
{ Address UnaryPrefix 2 "&" "" "" "" }
|
{ Address UnaryPrefix 2 "&" "" "" "" }
|
||||||
|
|
||||||
{ Cast Null 1 "(" ")" "" "" }
|
{ Cast Null 1 "(" ")" "" "" }
|
||||||
{ Sizeof UnaryPrefix 1 "sizeof" "(" ")" "" }
|
{ Sizeof UnaryPrefix 1 "sizeof" "(" ")" "" }
|
||||||
{ Typeof UnaryPrefix 1 "typeof" "(" ")" "" }
|
{ Typeof UnaryPrefix 1 "typeof" "(" ")" "" }
|
||||||
{ ByteSwap UnaryPrefix 1 "bswap" "(" ")" "" }
|
{ ByteSwap UnaryPrefix 1 "bswap" "(" ")" "" }
|
||||||
|
|
||||||
{ Pos UnaryPrefix 2 "+" "" "" "" }
|
{ Pos UnaryPrefix 2 "+" "" "" "" }
|
||||||
{ Neg UnaryPrefix 2 "-" "" "" "" }
|
{ Neg UnaryPrefix 2 "-" "" "" "" }
|
||||||
{ LogNot UnaryPrefix 2 "!" "" "" "" }
|
{ LogNot UnaryPrefix 2 "!" "" "" "" }
|
||||||
{ BitNot UnaryPrefix 2 "~" "" "" "" }
|
{ BitNot UnaryPrefix 2 "~" "" "" "" }
|
||||||
{ Mul Binary 3 "" " * " "" "" }
|
{ Mul Binary 3 "" " * " "" "" }
|
||||||
{ Div Binary 3 "" " / " "" "" }
|
{ Div Binary 3 "" " / " "" "" }
|
||||||
{ Mod Binary 3 "" " % " "" "" }
|
{ Mod Binary 3 "" " % " "" "" }
|
||||||
{ Add Binary 4 "" " + " "" "" }
|
{ Add Binary 4 "" " + " "" "" }
|
||||||
{ Sub Binary 4 "" " - " "" "" }
|
{ Sub Binary 4 "" " - " "" "" }
|
||||||
{ LShift Binary 5 "" " << " "" "" }
|
{ LShift Binary 5 "" " << " "" "" }
|
||||||
{ RShift Binary 5 "" " >> " "" "" }
|
{ RShift Binary 5 "" " >> " "" "" }
|
||||||
{ Less Binary 6 "" " < " "" "" }
|
{ Less Binary 6 "" " < " "" "" }
|
||||||
{ LsEq Binary 6 "" " <= " "" "" }
|
{ LsEq Binary 6 "" " <= " "" "" }
|
||||||
{ Grtr Binary 6 "" " > " "" "" }
|
{ Grtr Binary 6 "" " > " "" "" }
|
||||||
{ GrEq Binary 6 "" " >= " "" "" }
|
{ GrEq Binary 6 "" " >= " "" "" }
|
||||||
{ EqEq Binary 7 "" " == " "" "" }
|
{ EqEq Binary 7 "" " == " "" "" }
|
||||||
{ NtEq Binary 7 "" " != " "" "" }
|
{ NtEq Binary 7 "" " != " "" "" }
|
||||||
|
|
||||||
{ BitAnd Binary 8 "" " & " "" "" }
|
{ BitAnd Binary 8 "" " & " "" "" }
|
||||||
{ BitXor Binary 9 "" " ^ " "" "" }
|
{ BitXor Binary 9 "" " ^ " "" "" }
|
||||||
{ BitOr Binary 10 "" " | " "" "" }
|
{ BitOr Binary 10 "" " | " "" "" }
|
||||||
{ LogAnd Binary 11 "" " && " "" "" }
|
{ LogAnd Binary 11 "" " && " "" "" }
|
||||||
{ LogOr Binary 12 "" " || " "" "" }
|
{ LogOr Binary 12 "" " || " "" "" }
|
||||||
|
|
||||||
{ Ternary Null 0 "" " ? " " : " "" }
|
{ Ternary Null 0 "" " ? " " : " "" }
|
||||||
|
|
||||||
{ Call Null 15 "" "(" ")" ", "}
|
{ Call Null 15 "" "(" ")" ", "}
|
||||||
|
|
||||||
{ LeafBytecode Null 0 "" "" "" "" }
|
{ LeafBytecode Null 0 "" "" "" "" }
|
||||||
{ LeafStringLiteral Null 0 "" "" "" "" }
|
{ LeafStringLiteral Null 0 "" "" "" "" }
|
||||||
{ LeafU64 Null 0 "" "" "" "" }
|
{ LeafU64 Null 0 "" "" "" "" }
|
||||||
{ LeafF64 Null 0 "" "" "" "" }
|
{ LeafF64 Null 0 "" "" "" "" }
|
||||||
{ LeafF32 Null 0 "" "" "" "" }
|
{ LeafF32 Null 0 "" "" "" "" }
|
||||||
{ LeafIdentifier Null 0 "" "" "" "" }
|
{ LeafIdentifier Null 0 "" "" "" "" }
|
||||||
{ LeafOffset Null 0 "" "" "" "" }
|
{ LeafOffset Null 0 "" "" "" "" }
|
||||||
{ LeafValue Null 0 "" "" "" "" }
|
{ LeafValue Null 0 "" "" "" "" }
|
||||||
{ LeafFilePath Null 0 "" "" "" "" }
|
{ LeafFilePath Null 0 "" "" "" "" }
|
||||||
|
|
||||||
{ TypeIdent Null 0 "" "" "" "" }
|
{ TypeIdent Null 0 "" "" "" "" }
|
||||||
{ Ptr Null 0 "" "" "" "" }
|
{ Ptr Null 0 "" "" "" "" }
|
||||||
{ Array Null 0 "" "" "" "" }
|
{ Array Null 0 "" "" "" "" }
|
||||||
{ Func Null 0 "" "" "" "" }
|
{ Func Null 0 "" "" "" "" }
|
||||||
|
{ Unsigned Null 0 "unsigned " "" "" "" }
|
||||||
|
|
||||||
{ Define Binary 13 "" " = " "" "" }
|
{ Define Binary 13 "" " = " "" "" }
|
||||||
}
|
}
|
||||||
|
|
||||||
@table(name display_string)
|
@table(name display_string)
|
||||||
|
|||||||
+28
-13
@@ -430,26 +430,41 @@ e_auto_hook_map_make(Arena *arena, U64 slots_count)
|
|||||||
internal void
|
internal void
|
||||||
e_auto_hook_map_insert_new_(Arena *arena, E_AutoHookMap *map, E_AutoHookParams *params)
|
e_auto_hook_map_insert_new_(Arena *arena, E_AutoHookMap *map, E_AutoHookParams *params)
|
||||||
{
|
{
|
||||||
|
// rjf: get type key
|
||||||
E_TypeKey type_key = params->type_key;
|
E_TypeKey type_key = params->type_key;
|
||||||
if(params->type_pattern.size != 0)
|
if(params->type_pattern.size != 0)
|
||||||
{
|
{
|
||||||
E_Parse parse = e_push_parse_from_string(arena, params->type_pattern);
|
E_Parse parse = e_push_parse_from_string(arena, params->type_pattern);
|
||||||
type_key = e_type_key_from_expr(parse.expr);
|
type_key = e_type_key_from_expr(parse.expr);
|
||||||
}
|
}
|
||||||
E_AutoHookNode *node = push_array(arena, E_AutoHookNode, 1);
|
|
||||||
node->type_string = str8_skip_chop_whitespace(e_type_string_from_key(arena, type_key));
|
// rjf: get type pattern parts
|
||||||
U8 pattern_split = '?';
|
String8List pattern_parts = {0};
|
||||||
node->type_pattern_parts = str8_split(arena, params->type_pattern, &pattern_split, 1, StringSplitFlag_KeepEmpties);
|
if(e_type_key_match(e_type_key_zero(), type_key))
|
||||||
node->expr = e_parse_from_string(params->tag_expr_string).expr;
|
|
||||||
if(!e_type_key_match(e_type_key_zero(), type_key))
|
|
||||||
{
|
{
|
||||||
U64 hash = e_hash_from_string(5381, node->type_string);
|
U8 pattern_split = '?';
|
||||||
U64 slot_idx = hash%map->slots_count;
|
pattern_parts = str8_split(arena, params->type_pattern, &pattern_split, 1, StringSplitFlag_KeepEmpties);
|
||||||
SLLQueuePush_N(map->slots[slot_idx].first, map->slots[slot_idx].last, node, hash_next);
|
|
||||||
}
|
}
|
||||||
else
|
|
||||||
|
// rjf: if the type key is nonzero, *or* we have type patterns, then insert
|
||||||
|
// into map accordingle
|
||||||
|
if(!e_type_key_match(e_type_key_zero(), type_key) ||
|
||||||
|
pattern_parts.node_count != 0)
|
||||||
{
|
{
|
||||||
SLLQueuePush_N(map->first_pattern, map->last_pattern, node, pattern_order_next);
|
E_AutoHookNode *node = push_array(arena, E_AutoHookNode, 1);
|
||||||
|
node->type_string = str8_skip_chop_whitespace(e_type_string_from_key(arena, type_key));
|
||||||
|
node->type_pattern_parts = pattern_parts;
|
||||||
|
node->expr = e_parse_from_string(params->tag_expr_string).expr;
|
||||||
|
if(!e_type_key_match(e_type_key_zero(), type_key))
|
||||||
|
{
|
||||||
|
U64 hash = e_hash_from_string(5381, node->type_string);
|
||||||
|
U64 slot_idx = hash%map->slots_count;
|
||||||
|
SLLQueuePush_N(map->slots[slot_idx].first, map->slots[slot_idx].last, node, hash_next);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SLLQueuePush_N(map->first_pattern, map->last_pattern, node, pattern_order_next);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -825,7 +840,7 @@ e_irtree_from_bundle(E_CacheBundle *bundle)
|
|||||||
bundle->flags |= E_CacheBundleFlag_IRTree;
|
bundle->flags |= E_CacheBundleFlag_IRTree;
|
||||||
E_IRTreeAndType overridden = e_irtree_from_key(bundle->parent_key);
|
E_IRTreeAndType overridden = e_irtree_from_key(bundle->parent_key);
|
||||||
E_Parse parse = e_parse_from_bundle(bundle);
|
E_Parse parse = e_parse_from_bundle(bundle);
|
||||||
bundle->irtree = e_push_irtree_and_type_from_expr(e_cache->arena, &overridden, 0, 0, parse.expr);
|
bundle->irtree = e_push_irtree_and_type_from_expr(e_cache->arena, &overridden, 0, 0, 0, parse.expr);
|
||||||
E_MsgList msgs_copy = e_msg_list_copy(e_cache->arena, &bundle->irtree.msgs);
|
E_MsgList msgs_copy = e_msg_list_copy(e_cache->arena, &bundle->irtree.msgs);
|
||||||
e_msg_list_concat_in_place(&bundle->msgs, &msgs_copy);
|
e_msg_list_concat_in_place(&bundle->msgs, &msgs_copy);
|
||||||
}
|
}
|
||||||
@@ -1243,7 +1258,7 @@ e_debug_log_from_expr_string(Arena *arena, String8 string)
|
|||||||
}
|
}
|
||||||
|
|
||||||
//- rjf: type
|
//- rjf: type
|
||||||
E_IRTreeAndType irtree = e_push_irtree_and_type_from_expr(scratch.arena, 0, 0, 0, parse.expr);
|
E_IRTreeAndType irtree = e_push_irtree_and_type_from_expr(scratch.arena, 0, 0, 0, 0, parse.expr);
|
||||||
{
|
{
|
||||||
str8_list_pushf(scratch.arena, &strings, " type:\n");
|
str8_list_pushf(scratch.arena, &strings, " type:\n");
|
||||||
S32 indent = 2;
|
S32 indent = 2;
|
||||||
|
|||||||
+173
-30
@@ -492,7 +492,7 @@ E_TYPE_ACCESS_FUNCTION_DEF(default)
|
|||||||
E_Expr *exprl = expr->first;
|
E_Expr *exprl = expr->first;
|
||||||
E_Expr *exprr = exprl->next;
|
E_Expr *exprr = exprl->next;
|
||||||
E_IRTreeAndType l = *lhs_irtree;
|
E_IRTreeAndType l = *lhs_irtree;
|
||||||
E_IRTreeAndType r = e_push_irtree_and_type_from_expr(arena, overridden, 0, 0, exprr);
|
E_IRTreeAndType r = e_push_irtree_and_type_from_expr(arena, overridden, 0, 0, 0, exprr);
|
||||||
e_msg_list_concat_in_place(&result.msgs, &r.msgs);
|
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 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);
|
E_TypeKey r_restype = e_type_key_unwrap(r.type_key, E_TypeUnwrapFlag_AllDecorative);
|
||||||
@@ -585,7 +585,7 @@ E_TYPE_ACCESS_FUNCTION_DEF(default)
|
|||||||
//- rjf: top-level irtree/type extraction
|
//- rjf: top-level irtree/type extraction
|
||||||
|
|
||||||
internal E_IRTreeAndType
|
internal E_IRTreeAndType
|
||||||
e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_overridden, B32 disallow_autohooks, B32 disallow_chained_fastpaths, E_Expr *root_expr)
|
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)
|
||||||
{
|
{
|
||||||
ProfBeginFunction();
|
ProfBeginFunction();
|
||||||
Temp scratch = scratch_begin(&arena, 1);
|
Temp scratch = scratch_begin(&arena, 1);
|
||||||
@@ -636,7 +636,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_overridden,
|
|||||||
{
|
{
|
||||||
// rjf: unpack left-hand-side
|
// rjf: unpack left-hand-side
|
||||||
E_Expr *lhs = expr->first;
|
E_Expr *lhs = expr->first;
|
||||||
E_IRTreeAndType lhs_irtree = e_push_irtree_and_type_from_expr(arena, overridden, disallow_autohooks, disallow_chained_fastpaths, lhs);
|
E_IRTreeAndType lhs_irtree = e_push_irtree_and_type_from_expr(arena, overridden, disallow_autohooks, disallow_chained_fastpaths, disallow_chained_casts, lhs);
|
||||||
e_msg_list_concat_in_place(&result.msgs, &lhs_irtree.msgs);
|
e_msg_list_concat_in_place(&result.msgs, &lhs_irtree.msgs);
|
||||||
|
|
||||||
// rjf: try all IR trees in chain
|
// rjf: try all IR trees in chain
|
||||||
@@ -693,7 +693,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_overridden,
|
|||||||
{
|
{
|
||||||
// rjf: unpack operand
|
// rjf: unpack operand
|
||||||
E_Expr *r_expr = expr->first;
|
E_Expr *r_expr = expr->first;
|
||||||
E_IRTreeAndType r_tree = e_push_irtree_and_type_from_expr(arena, overridden, disallow_autohooks, disallow_chained_fastpaths, r_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_msg_list_concat_in_place(&result.msgs, &r_tree.msgs);
|
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_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);
|
E_TypeKind r_type_kind = e_type_kind_from_key(r_type);
|
||||||
@@ -752,7 +752,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_overridden,
|
|||||||
{
|
{
|
||||||
// rjf: unpack operand
|
// rjf: unpack operand
|
||||||
E_Expr *r_expr = expr->first;
|
E_Expr *r_expr = expr->first;
|
||||||
E_IRTreeAndType r_tree = e_push_irtree_and_type_from_expr(arena, overridden, disallow_autohooks, disallow_chained_fastpaths, r_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_msg_list_concat_in_place(&result.msgs, &r_tree.msgs);
|
e_msg_list_concat_in_place(&result.msgs, &r_tree.msgs);
|
||||||
E_TypeKey r_type = r_tree.type_key;
|
E_TypeKey r_type = r_tree.type_key;
|
||||||
E_TypeKey r_type_unwrapped = e_type_key_unwrap(r_type, E_TypeUnwrapFlag_AllDecorative);
|
E_TypeKey r_type_unwrapped = e_type_key_unwrap(r_type, E_TypeUnwrapFlag_AllDecorative);
|
||||||
@@ -780,12 +780,12 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_overridden,
|
|||||||
// rjf: unpack operands
|
// rjf: unpack operands
|
||||||
E_Expr *cast_type_expr = expr->first;
|
E_Expr *cast_type_expr = expr->first;
|
||||||
E_Expr *casted_expr = cast_type_expr->next;
|
E_Expr *casted_expr = cast_type_expr->next;
|
||||||
E_IRTreeAndType cast_irtree = e_push_irtree_and_type_from_expr(arena, overridden, disallow_autohooks, disallow_chained_fastpaths, cast_type_expr);
|
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_msg_list_concat_in_place(&result.msgs, &cast_irtree.msgs);
|
e_msg_list_concat_in_place(&result.msgs, &cast_irtree.msgs);
|
||||||
E_TypeKey cast_type = cast_irtree.type_key;
|
E_TypeKey cast_type = cast_irtree.type_key;
|
||||||
E_TypeKind cast_type_kind = e_type_kind_from_key(cast_type);
|
E_TypeKind cast_type_kind = e_type_kind_from_key(cast_type);
|
||||||
U64 cast_type_byte_size = e_type_byte_size_from_key(cast_type);
|
U64 cast_type_byte_size = e_type_byte_size_from_key(cast_type);
|
||||||
E_IRTreeAndType casted_tree = e_push_irtree_and_type_from_expr(arena, overridden, disallow_autohooks, disallow_chained_fastpaths, casted_expr);
|
E_IRTreeAndType casted_tree = e_push_irtree_and_type_from_expr(arena, overridden, disallow_autohooks, disallow_chained_fastpaths, disallow_chained_casts, casted_expr);
|
||||||
e_msg_list_concat_in_place(&result.msgs, &casted_tree.msgs);
|
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_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);
|
E_TypeKind casted_type_kind = e_type_kind_from_key(casted_type);
|
||||||
@@ -840,7 +840,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_overridden,
|
|||||||
E_Expr *r_expr = expr->first;
|
E_Expr *r_expr = expr->first;
|
||||||
E_TypeKey r_type = zero_struct;
|
E_TypeKey r_type = zero_struct;
|
||||||
E_Space space = r_expr->space;
|
E_Space space = r_expr->space;
|
||||||
E_IRTreeAndType r_tree = e_push_irtree_and_type_from_expr(arena, overridden, disallow_autohooks, disallow_chained_fastpaths, r_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_msg_list_concat_in_place(&result.msgs, &r_tree.msgs);
|
e_msg_list_concat_in_place(&result.msgs, &r_tree.msgs);
|
||||||
r_type = r_tree.type_key;
|
r_type = r_tree.type_key;
|
||||||
|
|
||||||
@@ -868,7 +868,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_overridden,
|
|||||||
{
|
{
|
||||||
// rjf: evaluate operand tree
|
// rjf: evaluate operand tree
|
||||||
E_Expr *r_expr = expr->first;
|
E_Expr *r_expr = expr->first;
|
||||||
E_IRTreeAndType r_tree = e_push_irtree_and_type_from_expr(arena, overridden, disallow_autohooks, disallow_chained_fastpaths, r_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_msg_list_concat_in_place(&result.msgs, &r_tree.msgs);
|
e_msg_list_concat_in_place(&result.msgs, &r_tree.msgs);
|
||||||
|
|
||||||
// rjf: fill output
|
// rjf: fill output
|
||||||
@@ -882,7 +882,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_overridden,
|
|||||||
{
|
{
|
||||||
// rjf: unpack operand
|
// rjf: unpack operand
|
||||||
E_Expr *r_expr = expr->first;
|
E_Expr *r_expr = expr->first;
|
||||||
E_IRTreeAndType r_tree = e_push_irtree_and_type_from_expr(arena, overridden, disallow_autohooks, disallow_chained_fastpaths, r_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_msg_list_concat_in_place(&result.msgs, &r_tree.msgs);
|
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_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);
|
E_TypeKind r_type_kind = e_type_kind_from_key(r_type);
|
||||||
@@ -910,14 +910,14 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_overridden,
|
|||||||
//- rjf: unary operations
|
//- rjf: unary operations
|
||||||
case E_ExprKind_Pos:
|
case E_ExprKind_Pos:
|
||||||
{
|
{
|
||||||
result = e_push_irtree_and_type_from_expr(arena, overridden, disallow_autohooks, disallow_chained_fastpaths, expr->first);
|
result = e_push_irtree_and_type_from_expr(arena, overridden, disallow_autohooks, disallow_chained_fastpaths, disallow_chained_casts, expr->first);
|
||||||
}break;
|
}break;
|
||||||
case E_ExprKind_Neg:
|
case E_ExprKind_Neg:
|
||||||
case E_ExprKind_BitNot:
|
case E_ExprKind_BitNot:
|
||||||
{
|
{
|
||||||
// rjf: unpack operand
|
// rjf: unpack operand
|
||||||
E_Expr *r_expr = expr->first;
|
E_Expr *r_expr = expr->first;
|
||||||
E_IRTreeAndType r_tree = e_push_irtree_and_type_from_expr(arena, overridden, disallow_autohooks, disallow_chained_fastpaths, r_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_msg_list_concat_in_place(&result.msgs, &r_tree.msgs);
|
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_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);
|
E_TypeKind r_type_kind = e_type_kind_from_key(r_type);
|
||||||
@@ -950,7 +950,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_overridden,
|
|||||||
{
|
{
|
||||||
// rjf: unpack operand
|
// rjf: unpack operand
|
||||||
E_Expr *r_expr = expr->first;
|
E_Expr *r_expr = expr->first;
|
||||||
E_IRTreeAndType r_tree = e_push_irtree_and_type_from_expr(arena, overridden, disallow_autohooks, disallow_chained_fastpaths, r_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_msg_list_concat_in_place(&result.msgs, &r_tree.msgs);
|
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_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);
|
E_TypeKind r_type_kind = e_type_kind_from_key(r_type);
|
||||||
@@ -1005,8 +1005,8 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_overridden,
|
|||||||
B32 is_comparison = e_expr_kind_is_comparison(kind);
|
B32 is_comparison = e_expr_kind_is_comparison(kind);
|
||||||
E_Expr *l_expr = expr->first;
|
E_Expr *l_expr = expr->first;
|
||||||
E_Expr *r_expr = l_expr->next;
|
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, l_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, r_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_msg_list_concat_in_place(&result.msgs, &l_tree.msgs);
|
e_msg_list_concat_in_place(&result.msgs, &l_tree.msgs);
|
||||||
e_msg_list_concat_in_place(&result.msgs, &r_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);
|
E_TypeKey l_type = e_type_key_unwrap(l_tree.type_key, E_TypeUnwrapFlag_AllDecorative);
|
||||||
@@ -1229,9 +1229,9 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_overridden,
|
|||||||
E_Expr *c_expr = expr->first;
|
E_Expr *c_expr = expr->first;
|
||||||
E_Expr *l_expr = c_expr->next;
|
E_Expr *l_expr = c_expr->next;
|
||||||
E_Expr *r_expr = l_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, c_expr);
|
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, l_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, r_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_msg_list_concat_in_place(&result.msgs, &c_tree.msgs);
|
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, &l_tree.msgs);
|
||||||
e_msg_list_concat_in_place(&result.msgs, &r_tree.msgs);
|
e_msg_list_concat_in_place(&result.msgs, &r_tree.msgs);
|
||||||
@@ -1275,18 +1275,72 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_overridden,
|
|||||||
case E_ExprKind_Call:
|
case E_ExprKind_Call:
|
||||||
{
|
{
|
||||||
E_Expr *lhs = expr->first;
|
E_Expr *lhs = expr->first;
|
||||||
E_IRTreeAndType lhs_irtree = e_push_irtree_and_type_from_expr(arena, overridden, disallow_autohooks, 1, lhs);
|
E_IRTreeAndType lhs_irtree = e_push_irtree_and_type_from_expr(arena, overridden, disallow_autohooks, disallow_chained_fastpaths, 1, lhs);
|
||||||
e_msg_list_concat_in_place(&result.msgs, &lhs_irtree.msgs);
|
e_msg_list_concat_in_place(&result.msgs, &lhs_irtree.msgs);
|
||||||
E_TypeKey lhs_type_key = lhs_irtree.type_key;
|
E_TypeKey lhs_type_key = lhs_irtree.type_key;
|
||||||
E_Type *lhs_type = e_type_from_key__cached(lhs_type_key);
|
E_Type *lhs_type = e_type_from_key__cached(lhs_type_key);
|
||||||
|
|
||||||
|
// rjf: calling a type? -> treat as a cast of that type
|
||||||
|
if(lhs_irtree.mode == E_Mode_Null)
|
||||||
|
{
|
||||||
|
E_IRTreeAndType casted_tree = e_push_irtree_and_type_from_expr(arena, overridden, 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);
|
||||||
|
U64 cast_type_byte_size = e_type_byte_size_from_key(cast_type);
|
||||||
|
E_TypeKey casted_type = casted_tree.type_key;
|
||||||
|
E_TypeKind casted_type_kind = e_type_kind_from_key(casted_type);
|
||||||
|
U64 casted_type_byte_size = e_type_byte_size_from_key(casted_type);
|
||||||
|
U8 in_group = e_type_group_from_kind(casted_type_kind);
|
||||||
|
U8 out_group = e_type_group_from_kind(cast_type_kind);
|
||||||
|
RDI_EvalConversionKind conversion_rule = rdi_eval_conversion_kind_from_typegroups(in_group, out_group);
|
||||||
|
|
||||||
|
// rjf: bad conditions? -> error if applicable, exit
|
||||||
|
if(casted_tree.root->op == 0)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else if(cast_type_kind == E_TypeKind_Null)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else if(conversion_rule != RDI_EvalConversionKind_Noop &&
|
||||||
|
conversion_rule != RDI_EvalConversionKind_Legal)
|
||||||
|
{
|
||||||
|
String8 text = str8_lit("Unknown cast conversion rule.");
|
||||||
|
if(conversion_rule < RDI_EvalConversionKind_COUNT)
|
||||||
|
{
|
||||||
|
text.str = rdi_explanation_string_from_eval_conversion_kind(conversion_rule, &text.size);
|
||||||
|
}
|
||||||
|
e_msg(arena, &result.msgs, E_MsgKind_MalformedInput, expr->location, text);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// rjf: generate casted result
|
||||||
|
{
|
||||||
|
E_IRNode *in_tree = e_irtree_resolve_to_value(arena, casted_tree.mode, casted_tree.root, casted_type);
|
||||||
|
E_IRNode *new_tree = in_tree;
|
||||||
|
if(conversion_rule == RDI_EvalConversionKind_Legal)
|
||||||
|
{
|
||||||
|
new_tree = e_irtree_convert_lo(arena, in_tree, out_group, in_group);
|
||||||
|
}
|
||||||
|
if(cast_type_byte_size < casted_type_byte_size && e_type_kind_is_integer(cast_type_kind))
|
||||||
|
{
|
||||||
|
new_tree = e_irtree_trunc(arena, in_tree, cast_type);
|
||||||
|
}
|
||||||
|
result.root = new_tree;
|
||||||
|
result.type_key = cast_type;
|
||||||
|
result.mode = E_Mode_Value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// rjf: calling an unresolved leaf-identifier member access, and we can determine
|
// rjf: calling an unresolved leaf-identifier member access, and we can determine
|
||||||
// that that identifer maps to a type? -> generate a call expression with the
|
// that that identifer maps to a type? -> generate a call expression with the
|
||||||
// left-hand-side of the dot operator as the first argument. this is a fast path
|
// left-hand-side of the dot operator as the first argument. this is a fast path
|
||||||
// which prevents paren nesting in simple cases, to easily chain multiple
|
// which prevents paren nesting in simple cases, to easily chain multiple
|
||||||
// calls - for example, bin(2).digits(4)
|
// calls - for example, bin(2).digits(4)
|
||||||
if(lhs_type == &e_type_nil &&
|
else if(lhs_type == &e_type_nil &&
|
||||||
lhs->kind == E_ExprKind_MemberAccess)
|
lhs->kind == E_ExprKind_MemberAccess)
|
||||||
{
|
{
|
||||||
E_Expr *callee = lhs->first->next;
|
E_Expr *callee = lhs->first->next;
|
||||||
E_Expr *first_arg = e_expr_ref(arena, lhs->first);
|
E_Expr *first_arg = e_expr_ref(arena, lhs->first);
|
||||||
@@ -1297,7 +1351,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_overridden,
|
|||||||
{
|
{
|
||||||
e_expr_push_child(call, e_expr_copy(arena, arg));
|
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, call);
|
result = e_push_irtree_and_type_from_expr(arena, overridden, disallow_autohooks, disallow_chained_fastpaths, disallow_chained_casts, call);
|
||||||
E_MsgList new_msgs = {0};
|
E_MsgList new_msgs = {0};
|
||||||
e_msg_list_concat_in_place(&new_msgs, &lhs_irtree.msgs);
|
e_msg_list_concat_in_place(&new_msgs, &lhs_irtree.msgs);
|
||||||
e_msg_list_concat_in_place(&new_msgs, &result.msgs);
|
e_msg_list_concat_in_place(&new_msgs, &result.msgs);
|
||||||
@@ -1337,7 +1391,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_overridden,
|
|||||||
Temp scratch = scratch_begin(&arena, 1);
|
Temp scratch = scratch_begin(&arena, 1);
|
||||||
|
|
||||||
// rjf: generate result via first argument to lens
|
// rjf: generate result via first argument to lens
|
||||||
result = e_push_irtree_and_type_from_expr(arena, overridden, disallow_autohooks, 1, lhs->next);
|
result = e_push_irtree_and_type_from_expr(arena, overridden, disallow_autohooks, 1, disallow_chained_casts, lhs->next);
|
||||||
|
|
||||||
// rjf: count extra arguments
|
// rjf: count extra arguments
|
||||||
U64 arg_count = 0;
|
U64 arg_count = 0;
|
||||||
@@ -1379,7 +1433,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_overridden,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
result = e_push_irtree_and_type_from_expr(arena, overridden, disallow_autohooks, 1, lhs->next);
|
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);
|
result.type_key = e_type_key_unwrap(result.type_key, E_TypeUnwrapFlag_Lenses);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1522,9 +1576,8 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_overridden,
|
|||||||
//- rjf: try to map name as implicit access of overridden expression ('$.member_name', where the $. prefix is omitted)
|
//- 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 && overridden->root != &e_irnode_nil)
|
||||||
{
|
{
|
||||||
// TODO(rjf): @eval
|
|
||||||
E_Expr *access = e_expr_irext_member_access(scratch.arena, &e_expr_nil, overridden, string);
|
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, disallow_chained_fastpaths, access);
|
E_IRTreeAndType access_irtree = e_push_irtree_and_type_from_expr(scratch.arena, overridden, disallow_autohooks, 1, 1, access);
|
||||||
if(access_irtree.root != &e_irnode_nil)
|
if(access_irtree.root != &e_irnode_nil)
|
||||||
{
|
{
|
||||||
string_mapped = 1;
|
string_mapped = 1;
|
||||||
@@ -1892,7 +1945,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_overridden,
|
|||||||
{
|
{
|
||||||
generated = 1;
|
generated = 1;
|
||||||
e_string2expr_map_inc_poison(e_ir_ctx->macro_map, string);
|
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, macro_expr);
|
result = e_push_irtree_and_type_from_expr(arena, overridden, disallow_autohooks, disallow_chained_fastpaths, disallow_chained_casts, macro_expr);
|
||||||
e_string2expr_map_dec_poison(e_ir_ctx->macro_map, string);
|
e_string2expr_map_dec_poison(e_ir_ctx->macro_map, string);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1977,15 +2030,45 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_overridden,
|
|||||||
result.type_key = expr->type_key;
|
result.type_key = expr->type_key;
|
||||||
result.mode = E_Mode_Null;
|
result.mode = E_Mode_Null;
|
||||||
}break;
|
}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);
|
||||||
|
result = direct_irtree;
|
||||||
|
E_TypeKey direct_type_key = result.type_key;
|
||||||
|
E_TypeKind direct_type_kind = e_type_kind_from_key(direct_type_key);
|
||||||
|
if(e_type_kind_is_signed(direct_type_kind))
|
||||||
|
{
|
||||||
|
E_TypeKind new_kind = direct_type_kind;
|
||||||
|
switch(direct_type_kind)
|
||||||
|
{
|
||||||
|
default:{}break;
|
||||||
|
case E_TypeKind_Char8: {new_kind = E_TypeKind_UChar8;}break;
|
||||||
|
case E_TypeKind_Char16:{new_kind = E_TypeKind_UChar16;}break;
|
||||||
|
case E_TypeKind_Char32:{new_kind = E_TypeKind_UChar32;}break;
|
||||||
|
case E_TypeKind_S8:{new_kind = E_TypeKind_U8;}break;
|
||||||
|
case E_TypeKind_S16:{new_kind = E_TypeKind_U16;}break;
|
||||||
|
case E_TypeKind_S32:{new_kind = E_TypeKind_U32;}break;
|
||||||
|
case E_TypeKind_S64:{new_kind = E_TypeKind_U64;}break;
|
||||||
|
case E_TypeKind_S128:{new_kind = E_TypeKind_U128;}break;
|
||||||
|
case E_TypeKind_S256:{new_kind = E_TypeKind_U256;}break;
|
||||||
|
case E_TypeKind_S512:{new_kind = E_TypeKind_U512;}break;
|
||||||
|
}
|
||||||
|
result.type_key = e_type_key_basic(new_kind);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, expr->first->location, "Cannot apply an `unsigned` modifier to this type.");
|
||||||
|
}
|
||||||
|
}break;
|
||||||
case E_ExprKind_Ptr:
|
case E_ExprKind_Ptr:
|
||||||
{
|
{
|
||||||
E_IRTreeAndType ptee_irtree = e_push_irtree_and_type_from_expr(arena, overridden, disallow_autohooks, disallow_chained_fastpaths, expr->first);
|
E_IRTreeAndType ptee_irtree = e_push_irtree_and_type_from_expr(arena, overridden, disallow_autohooks, disallow_chained_fastpaths, disallow_chained_casts, expr->first);
|
||||||
result = ptee_irtree;
|
result = ptee_irtree;
|
||||||
result.type_key = e_type_key_cons_ptr(e_base_ctx->primary_module->arch, result.type_key, 1, 0);
|
result.type_key = e_type_key_cons_ptr(e_base_ctx->primary_module->arch, result.type_key, 1, 0);
|
||||||
}break;
|
}break;
|
||||||
case E_ExprKind_Array:
|
case E_ExprKind_Array:
|
||||||
{
|
{
|
||||||
E_IRTreeAndType element_irtree = e_push_irtree_and_type_from_expr(arena, overridden, disallow_autohooks, disallow_chained_fastpaths, expr->first);
|
E_IRTreeAndType element_irtree = e_push_irtree_and_type_from_expr(arena, overridden, disallow_autohooks, disallow_chained_fastpaths, disallow_chained_casts, expr->first);
|
||||||
result = element_irtree;
|
result = element_irtree;
|
||||||
result.type_key = e_type_key_cons_array(result.type_key, expr->value.u64, 0);
|
result.type_key = e_type_key_cons_array(result.type_key, expr->value.u64, 0);
|
||||||
}break;
|
}break;
|
||||||
@@ -1999,7 +2082,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_overridden,
|
|||||||
{
|
{
|
||||||
E_Expr *lhs = expr->first;
|
E_Expr *lhs = expr->first;
|
||||||
E_Expr *rhs = lhs->next;
|
E_Expr *rhs = lhs->next;
|
||||||
result = e_push_irtree_and_type_from_expr(arena, overridden, disallow_autohooks, disallow_chained_fastpaths, rhs);
|
result = e_push_irtree_and_type_from_expr(arena, overridden, disallow_autohooks, disallow_chained_fastpaths, disallow_chained_casts, rhs);
|
||||||
if(lhs->kind != E_ExprKind_LeafIdentifier)
|
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->location, "Left side of assignment must be an unused identifier.");
|
||||||
@@ -2007,6 +2090,66 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_overridden,
|
|||||||
}break;
|
}break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//- rjf: if our currently-computed result is just a type, and we have
|
||||||
|
// a chained expression, then treat the first expression as a cast on
|
||||||
|
// the second.
|
||||||
|
if(!disallow_chained_casts && result.mode == E_Mode_Null && expr->next != &e_expr_nil)
|
||||||
|
{
|
||||||
|
// 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_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);
|
||||||
|
U64 cast_type_byte_size = e_type_byte_size_from_key(cast_type);
|
||||||
|
E_TypeKey casted_type = casted_tree.type_key;
|
||||||
|
E_TypeKind casted_type_kind = e_type_kind_from_key(casted_type);
|
||||||
|
U64 casted_type_byte_size = e_type_byte_size_from_key(casted_type);
|
||||||
|
U8 in_group = e_type_group_from_kind(casted_type_kind);
|
||||||
|
U8 out_group = e_type_group_from_kind(cast_type_kind);
|
||||||
|
RDI_EvalConversionKind conversion_rule = rdi_eval_conversion_kind_from_typegroups(in_group, out_group);
|
||||||
|
|
||||||
|
// rjf: bad conditions? -> error if applicable, exit
|
||||||
|
if(casted_tree.root->op == 0)
|
||||||
|
{
|
||||||
|
goto end_cast_gen;
|
||||||
|
}
|
||||||
|
else if(cast_type_kind == E_TypeKind_Null)
|
||||||
|
{
|
||||||
|
goto end_cast_gen;
|
||||||
|
}
|
||||||
|
else if(conversion_rule != RDI_EvalConversionKind_Noop &&
|
||||||
|
conversion_rule != RDI_EvalConversionKind_Legal)
|
||||||
|
{
|
||||||
|
String8 text = str8_lit("Unknown cast conversion rule.");
|
||||||
|
if(conversion_rule < RDI_EvalConversionKind_COUNT)
|
||||||
|
{
|
||||||
|
text.str = rdi_explanation_string_from_eval_conversion_kind(conversion_rule, &text.size);
|
||||||
|
}
|
||||||
|
e_msg(arena, &result.msgs, E_MsgKind_MalformedInput, expr->location, text);
|
||||||
|
goto end_cast_gen;
|
||||||
|
}
|
||||||
|
|
||||||
|
// rjf: generate casted result
|
||||||
|
{
|
||||||
|
E_IRNode *in_tree = e_irtree_resolve_to_value(arena, casted_tree.mode, casted_tree.root, casted_type);
|
||||||
|
E_IRNode *new_tree = in_tree;
|
||||||
|
if(conversion_rule == RDI_EvalConversionKind_Legal)
|
||||||
|
{
|
||||||
|
new_tree = e_irtree_convert_lo(arena, in_tree, out_group, in_group);
|
||||||
|
}
|
||||||
|
if(cast_type_byte_size < casted_type_byte_size && e_type_kind_is_integer(cast_type_kind))
|
||||||
|
{
|
||||||
|
new_tree = e_irtree_trunc(arena, in_tree, cast_type);
|
||||||
|
}
|
||||||
|
result.root = new_tree;
|
||||||
|
result.type_key = cast_type;
|
||||||
|
result.mode = E_Mode_Value;
|
||||||
|
}
|
||||||
|
|
||||||
|
end_cast_gen:;
|
||||||
|
}
|
||||||
|
|
||||||
//- rjf: check chained expressions for simple wrappers
|
//- rjf: check chained expressions for simple wrappers
|
||||||
if(!disallow_chained_fastpaths)
|
if(!disallow_chained_fastpaths)
|
||||||
{
|
{
|
||||||
|
|||||||
+1
-1
@@ -88,7 +88,7 @@ internal void e_expr_unpoison(E_Expr *expr);
|
|||||||
|
|
||||||
//- rjf: top-level irtree/type extraction
|
//- rjf: top-level irtree/type extraction
|
||||||
E_TYPE_ACCESS_FUNCTION_DEF(default);
|
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, E_Expr *root_expr);
|
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);
|
||||||
|
|
||||||
//- rjf: irtree -> linear ops/bytecode
|
//- rjf: irtree -> linear ops/bytecode
|
||||||
internal void e_append_oplist_from_irtree(Arena *arena, E_IRNode *root, E_Space *current_space, E_OpList *out);
|
internal void e_append_oplist_from_irtree(Arena *arena, E_IRNode *root, E_Space *current_space, E_OpList *out);
|
||||||
|
|||||||
+23
-1
@@ -672,6 +672,10 @@ e_type_key_from_expr(E_Expr *expr)
|
|||||||
{
|
{
|
||||||
// TODO(rjf): do we support E_ExprKind_Func here?
|
// TODO(rjf): do we support E_ExprKind_Func here?
|
||||||
default:{}break;
|
default:{}break;
|
||||||
|
case E_ExprKind_LeafIdentifier:
|
||||||
|
{
|
||||||
|
result = e_leaf_type_from_name(expr->string);
|
||||||
|
}break;
|
||||||
case E_ExprKind_TypeIdent:
|
case E_ExprKind_TypeIdent:
|
||||||
{
|
{
|
||||||
result = expr->type_key;
|
result = expr->type_key;
|
||||||
@@ -867,6 +871,13 @@ e_push_parse_from_string_tokens__prec(Arena *arena, String8 text, E_TokenArray t
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// rjf: try 'unsigned' marker
|
||||||
|
if(str8_match(token_string, str8_lit("unsigned"), 0))
|
||||||
|
{
|
||||||
|
prefix_unary_kind = E_ExprKind_Unsigned;
|
||||||
|
prefix_unary_precedence = 2;
|
||||||
|
}
|
||||||
|
|
||||||
// rjf: consume valid op
|
// rjf: consume valid op
|
||||||
if(prefix_unary_precedence != 0)
|
if(prefix_unary_precedence != 0)
|
||||||
{
|
{
|
||||||
@@ -875,6 +886,7 @@ e_push_parse_from_string_tokens__prec(Arena *arena, String8 text, E_TokenArray t
|
|||||||
}
|
}
|
||||||
|
|
||||||
// rjf: try casting expression
|
// rjf: try casting expression
|
||||||
|
#if 0
|
||||||
if(prefix_unary_precedence == 0 && str8_match(token_string, str8_lit("("), 0))
|
if(prefix_unary_precedence == 0 && str8_match(token_string, str8_lit("("), 0))
|
||||||
{
|
{
|
||||||
E_Token some_type_identifier_maybe = e_token_at_it(it+1, &tokens);
|
E_Token some_type_identifier_maybe = e_token_at_it(it+1, &tokens);
|
||||||
@@ -915,6 +927,7 @@ e_push_parse_from_string_tokens__prec(Arena *arena, String8 text, E_TokenArray t
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
// rjf: break if we got no operators
|
// rjf: break if we got no operators
|
||||||
if(prefix_unary_precedence == 0)
|
if(prefix_unary_precedence == 0)
|
||||||
@@ -1341,7 +1354,16 @@ 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);
|
e_msg_list_concat_in_place(&result.msgs, &rhs_expr_parse.msgs);
|
||||||
E_Expr *rhs = rhs_expr_parse.expr;
|
E_Expr *rhs = rhs_expr_parse.expr;
|
||||||
it = rhs_expr_parse.last_token;
|
it = rhs_expr_parse.last_token;
|
||||||
if(rhs == &e_expr_nil)
|
if(rhs == &e_expr_nil && binary_kind == E_ExprKind_Mul)
|
||||||
|
{
|
||||||
|
// NOTE(rjf): C-style pointer syntax is shared with multiplication.
|
||||||
|
// 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);
|
||||||
|
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_string.str, "Missing right-hand-side of `%S`.", token_string);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2477,7 +2477,7 @@ E_TYPE_ACCESS_FUNCTION_DEF(slice)
|
|||||||
|
|
||||||
// rjf: compute struct.base_ptr IR tree
|
// rjf: compute struct.base_ptr IR tree
|
||||||
E_IRTreeAndType override = {&e_irnode_nil};
|
E_IRTreeAndType override = {&e_irnode_nil};
|
||||||
result = e_push_irtree_and_type_from_expr(arena, &override, 0, 0, idx_expr);
|
result = e_push_irtree_and_type_from_expr(arena, &override, 0, 0, 0, idx_expr);
|
||||||
|
|
||||||
scratch_end(scratch);
|
scratch_end(scratch);
|
||||||
}break;
|
}break;
|
||||||
|
|||||||
@@ -144,7 +144,7 @@ U8 e_type_kind_basic_byte_size_table[61] =
|
|||||||
0,
|
0,
|
||||||
};
|
};
|
||||||
|
|
||||||
String8 e_expr_kind_strings[48] =
|
String8 e_expr_kind_strings[49] =
|
||||||
{
|
{
|
||||||
str8_lit_comp("Nil"),
|
str8_lit_comp("Nil"),
|
||||||
str8_lit_comp("Ref"),
|
str8_lit_comp("Ref"),
|
||||||
@@ -193,10 +193,11 @@ str8_lit_comp("TypeIdent"),
|
|||||||
str8_lit_comp("Ptr"),
|
str8_lit_comp("Ptr"),
|
||||||
str8_lit_comp("Array"),
|
str8_lit_comp("Array"),
|
||||||
str8_lit_comp("Func"),
|
str8_lit_comp("Func"),
|
||||||
|
str8_lit_comp("Unsigned"),
|
||||||
str8_lit_comp("Define"),
|
str8_lit_comp("Define"),
|
||||||
};
|
};
|
||||||
|
|
||||||
E_OpInfo e_expr_kind_op_info_table[48] =
|
E_OpInfo e_expr_kind_op_info_table[49] =
|
||||||
{
|
{
|
||||||
{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") },
|
{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") },
|
||||||
{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") },
|
{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") },
|
||||||
@@ -245,6 +246,7 @@ E_OpInfo e_expr_kind_op_info_table[48] =
|
|||||||
{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") },
|
{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") },
|
||||||
{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") },
|
{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") },
|
||||||
{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") },
|
{ E_OpKind_Null, 0, str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") },
|
||||||
|
{ E_OpKind_Null, 0, str8_lit_comp("unsigned "), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("") },
|
||||||
{ E_OpKind_Binary, 13, str8_lit_comp(""), str8_lit_comp(" = "), str8_lit_comp(""), str8_lit_comp("") },
|
{ E_OpKind_Binary, 13, str8_lit_comp(""), str8_lit_comp(" = "), str8_lit_comp(""), str8_lit_comp("") },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -145,6 +145,7 @@ E_ExprKind_TypeIdent,
|
|||||||
E_ExprKind_Ptr,
|
E_ExprKind_Ptr,
|
||||||
E_ExprKind_Array,
|
E_ExprKind_Array,
|
||||||
E_ExprKind_Func,
|
E_ExprKind_Func,
|
||||||
|
E_ExprKind_Unsigned,
|
||||||
E_ExprKind_Define,
|
E_ExprKind_Define,
|
||||||
E_ExprKind_COUNT,
|
E_ExprKind_COUNT,
|
||||||
} E_ExprKindEnum;
|
} E_ExprKindEnum;
|
||||||
@@ -169,8 +170,8 @@ C_LINKAGE_BEGIN
|
|||||||
extern String8 e_token_kind_strings[6];
|
extern String8 e_token_kind_strings[6];
|
||||||
extern String8 e_type_kind_basic_string_table[61];
|
extern String8 e_type_kind_basic_string_table[61];
|
||||||
extern U8 e_type_kind_basic_byte_size_table[61];
|
extern U8 e_type_kind_basic_byte_size_table[61];
|
||||||
extern String8 e_expr_kind_strings[48];
|
extern String8 e_expr_kind_strings[49];
|
||||||
extern E_OpInfo e_expr_kind_op_info_table[48];
|
extern E_OpInfo e_expr_kind_op_info_table[49];
|
||||||
extern String8 e_interpretation_code_display_strings[11];
|
extern String8 e_interpretation_code_display_strings[11];
|
||||||
|
|
||||||
C_LINKAGE_END
|
C_LINKAGE_END
|
||||||
|
|||||||
@@ -160,12 +160,12 @@ struct {RDI_EvalConversionKind dst_typegroups[RDI_EvalTypeGroup_COUNT];} rdi_eva
|
|||||||
|
|
||||||
struct {RDI_U8 *str; RDI_U64 size;} rdi_eval_conversion_kind_message_string_table[6] =
|
struct {RDI_U8 *str; RDI_U64 size;} rdi_eval_conversion_kind_message_string_table[6] =
|
||||||
{
|
{
|
||||||
{(RDI_U8 *)"Other", sizeof("Other")},
|
{(RDI_U8 *)"", sizeof("")},
|
||||||
{(RDI_U8 *)"U", sizeof("U")},
|
{(RDI_U8 *)"", sizeof("")},
|
||||||
{(RDI_U8 *)"S", sizeof("S")},
|
{(RDI_U8 *)"Cannot convert between these types.", sizeof("Cannot convert between these types.")},
|
||||||
{(RDI_U8 *)"F32", sizeof("F32")},
|
{(RDI_U8 *)"Cannot convert to this type.", sizeof("Cannot convert to this type.")},
|
||||||
{(RDI_U8 *)"F64", sizeof("F64")},
|
{(RDI_U8 *)"Cannot convert this type.", sizeof("Cannot convert this type.")},
|
||||||
{(RDI_U8 *)"COUNT", sizeof("COUNT")},
|
{(RDI_U8 *)"", sizeof("")},
|
||||||
};
|
};
|
||||||
|
|
||||||
RDI_PROC RDI_U64
|
RDI_PROC RDI_U64
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -225,9 +225,9 @@ RD_VocabTable:
|
|||||||
@default(1) 'scrolling_animations': bool,
|
@default(1) 'scrolling_animations': bool,
|
||||||
|
|
||||||
//- rjf: fonts
|
//- rjf: fonts
|
||||||
@display_name('UI Font') @description("The name or path to the font used when displaying non-code UI elements.")
|
@display_name('UI Font') @description("The name of, or path to, the font used when displaying non-code UI elements.")
|
||||||
'main_font': string,
|
'main_font': string,
|
||||||
@display_name('Code Font') @description("The name or path to the font used when displaying code.")
|
@display_name('Code Font') @description("The name of, or path to, the font used when displaying code.")
|
||||||
'code_font': string,
|
'code_font': string,
|
||||||
|
|
||||||
//- rjf: colors
|
//- rjf: colors
|
||||||
|
|||||||
+32
-21
@@ -1301,36 +1301,48 @@ rd_setting_from_name(String8 name)
|
|||||||
internal B32
|
internal B32
|
||||||
rd_setting_b32_from_name(String8 name)
|
rd_setting_b32_from_name(String8 name)
|
||||||
{
|
{
|
||||||
Temp scratch = scratch_begin(0, 0);
|
B32 result = 0;
|
||||||
String8 value = rd_setting_from_name(name);
|
String8 value = rd_setting_from_name(name);
|
||||||
String8 expr = push_str8f(scratch.arena, "(bool)(%S)", value);
|
if(value.size != 0)
|
||||||
E_Eval eval = e_eval_from_string(expr);
|
{
|
||||||
B32 result = !!e_value_eval_from_eval(eval).value.u64;
|
Temp scratch = scratch_begin(0, 0);
|
||||||
scratch_end(scratch);
|
String8 expr = push_str8f(scratch.arena, "(bool)(%S)", value);
|
||||||
|
E_Eval eval = e_eval_from_string(expr);
|
||||||
|
result = !!e_value_eval_from_eval(eval).value.u64;
|
||||||
|
scratch_end(scratch);
|
||||||
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal U64
|
internal U64
|
||||||
rd_setting_u64_from_name(String8 name)
|
rd_setting_u64_from_name(String8 name)
|
||||||
{
|
{
|
||||||
Temp scratch = scratch_begin(0, 0);
|
U64 result = 0;
|
||||||
String8 value = rd_setting_from_name(name);
|
String8 value = rd_setting_from_name(name);
|
||||||
String8 expr = push_str8f(scratch.arena, "(uint64)(%S)", value);
|
if(value.size != 0)
|
||||||
E_Eval eval = e_eval_from_string(expr);
|
{
|
||||||
U64 result = e_value_eval_from_eval(eval).value.u64;
|
Temp scratch = scratch_begin(0, 0);
|
||||||
scratch_end(scratch);
|
String8 expr = push_str8f(scratch.arena, "(uint64)(%S)", value);
|
||||||
|
E_Eval eval = e_eval_from_string(expr);
|
||||||
|
result = e_value_eval_from_eval(eval).value.u64;
|
||||||
|
scratch_end(scratch);
|
||||||
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal F32
|
internal F32
|
||||||
rd_setting_f32_from_name(String8 name)
|
rd_setting_f32_from_name(String8 name)
|
||||||
{
|
{
|
||||||
Temp scratch = scratch_begin(0, 0);
|
F32 result = 0.f;
|
||||||
String8 value = rd_setting_from_name(name);
|
String8 value = rd_setting_from_name(name);
|
||||||
String8 expr = push_str8f(scratch.arena, "(float32)(%S)", value);
|
if(value.size != 0)
|
||||||
E_Eval eval = e_eval_from_string(expr);
|
{
|
||||||
F32 result = e_value_eval_from_eval(eval).value.f32;
|
Temp scratch = scratch_begin(0, 0);
|
||||||
scratch_end(scratch);
|
String8 expr = push_str8f(scratch.arena, "(float32)(%S)", value);
|
||||||
|
E_Eval eval = e_eval_from_string(expr);
|
||||||
|
result = e_value_eval_from_eval(eval).value.f32;
|
||||||
|
scratch_end(scratch);
|
||||||
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4357,16 +4369,15 @@ rd_view_ui(Rng2F32 rect)
|
|||||||
F32 cell_slider_value = 0.f;
|
F32 cell_slider_value = 0.f;
|
||||||
if(str8_match(cell_type->name, str8_lit("range1"), 0) && cell_type->args != 0 && cell_type->count >= 2)
|
if(str8_match(cell_type->name, str8_lit("range1"), 0) && cell_type->args != 0 && cell_type->count >= 2)
|
||||||
{
|
{
|
||||||
E_Expr *min_expr = cell_type->args[0];
|
E_Key min_key = e_key_from_expr(cell_type->args[0]);
|
||||||
E_Expr *max_expr = cell_type->args[1];
|
E_Key max_key = e_key_from_expr(cell_type->args[1]);
|
||||||
E_ParentKey(cell->eval.key)
|
E_ParentKey(cell->eval.key)
|
||||||
{
|
{
|
||||||
E_TypeKey slider_value_type = e_type_key_unwrap(cell_type->direct_type_key, E_TypeUnwrapFlag_AllDecorative);
|
E_TypeKey slider_value_type = e_type_key_unwrap(cell_type->direct_type_key, E_TypeUnwrapFlag_AllDecorative);
|
||||||
slider_value_type_kind = e_type_kind_from_key(slider_value_type);
|
slider_value_type_kind = e_type_kind_from_key(slider_value_type);
|
||||||
E_Expr *min_casted = e_expr_ref_cast(scratch.arena, slider_value_type, min_expr);
|
String8 slider_type_name = e_type_string_from_key(scratch.arena, slider_value_type);
|
||||||
E_Expr *max_casted = e_expr_ref_cast(scratch.arena, slider_value_type, max_expr);
|
cell_slider_min = e_value_from_key(e_key_wrapf(min_key, "(%S)$", slider_type_name));
|
||||||
cell_slider_min = e_value_from_expr(min_casted);
|
cell_slider_max = e_value_from_key(e_key_wrapf(max_key, "(%S)$", slider_type_name));
|
||||||
cell_slider_max = e_value_from_expr(max_casted);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
switch(slider_value_type_kind)
|
switch(slider_value_type_kind)
|
||||||
|
|||||||
@@ -1376,7 +1376,7 @@ rdi_eval_typegroup_conversion_kind_matrix:
|
|||||||
@data(`struct {RDI_U8 *str; RDI_U64 size;}`) @c_file
|
@data(`struct {RDI_U8 *str; RDI_U64 size;}`) @c_file
|
||||||
rdi_eval_conversion_kind_message_string_table:
|
rdi_eval_conversion_kind_message_string_table:
|
||||||
{
|
{
|
||||||
@expand(RDI_EvalTypeGroupTable a) `{(RDI_U8 *)"$(a.error_string)", sizeof("$(a.error_string)")}`
|
@expand(RDI_EvalConversionKindTable a) `{(RDI_U8 *)"$(a.error_string)", sizeof("$(a.error_string)")}`
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
@@ -1503,7 +1503,7 @@ rdi_hash(RDI_U8 *ptr, RDI_U64 size)
|
|||||||
@expand(RDI_TypeKindTable a) ` case RDI_TypeKind_$(a.name): {result = (RDI_U8*)"$(a.name)"; *size_out = sizeof("$(a.name)")-1;}break;`,
|
@expand(RDI_TypeKindTable a) ` case RDI_TypeKind_$(a.name): {result = (RDI_U8*)"$(a.name)"; *size_out = sizeof("$(a.name)")-1;}break;`,
|
||||||
`}`;
|
`}`;
|
||||||
`return result;`;
|
`return result;`;
|
||||||
`}`;
|
`}`;
|
||||||
``;
|
``;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user