diff --git a/src/eval/eval.mdesk b/src/eval/eval.mdesk index 5717a44d..46891e5d 100644 --- a/src/eval/eval.mdesk +++ b/src/eval/eval.mdesk @@ -82,63 +82,64 @@ E_TypeKindTable: @table(name op_kind precedence op_pre op_sep op_pos op_chain) E_ExprKindTable: { - { Nil Null 0 "" "" "" "" } - { Ref Null 0 "" "" "" "" } + { Nil Null 0 "" "" "" "" } + { Ref Null 0 "" "" "" "" } - { ArrayIndex Null 0 "" "[" "]" "" } - { MemberAccess Null 0 "" "." "" "" } - { Deref UnaryPrefix 2 "*" "" "" "" } - { Address UnaryPrefix 2 "&" "" "" "" } + { ArrayIndex Null 0 "" "[" "]" "" } + { MemberAccess Null 0 "" "." "" "" } + { Deref UnaryPrefix 2 "*" "" "" "" } + { Address UnaryPrefix 2 "&" "" "" "" } - { Cast Null 1 "(" ")" "" "" } - { Sizeof UnaryPrefix 1 "sizeof" "(" ")" "" } - { Typeof UnaryPrefix 1 "typeof" "(" ")" "" } - { ByteSwap UnaryPrefix 1 "bswap" "(" ")" "" } + { Cast Null 1 "(" ")" "" "" } + { Sizeof UnaryPrefix 1 "sizeof" "(" ")" "" } + { Typeof UnaryPrefix 1 "typeof" "(" ")" "" } + { ByteSwap UnaryPrefix 1 "bswap" "(" ")" "" } - { Pos UnaryPrefix 2 "+" "" "" "" } - { Neg UnaryPrefix 2 "-" "" "" "" } - { LogNot UnaryPrefix 2 "!" "" "" "" } - { BitNot UnaryPrefix 2 "~" "" "" "" } - { Mul Binary 3 "" " * " "" "" } - { Div Binary 3 "" " / " "" "" } - { Mod Binary 3 "" " % " "" "" } - { Add Binary 4 "" " + " "" "" } - { Sub Binary 4 "" " - " "" "" } - { LShift Binary 5 "" " << " "" "" } - { RShift Binary 5 "" " >> " "" "" } - { Less Binary 6 "" " < " "" "" } - { LsEq Binary 6 "" " <= " "" "" } - { Grtr Binary 6 "" " > " "" "" } - { GrEq Binary 6 "" " >= " "" "" } - { EqEq Binary 7 "" " == " "" "" } - { NtEq Binary 7 "" " != " "" "" } + { Pos UnaryPrefix 2 "+" "" "" "" } + { Neg UnaryPrefix 2 "-" "" "" "" } + { LogNot UnaryPrefix 2 "!" "" "" "" } + { BitNot UnaryPrefix 2 "~" "" "" "" } + { Mul Binary 3 "" " * " "" "" } + { Div Binary 3 "" " / " "" "" } + { Mod Binary 3 "" " % " "" "" } + { Add Binary 4 "" " + " "" "" } + { Sub Binary 4 "" " - " "" "" } + { LShift Binary 5 "" " << " "" "" } + { RShift Binary 5 "" " >> " "" "" } + { Less Binary 6 "" " < " "" "" } + { LsEq Binary 6 "" " <= " "" "" } + { Grtr Binary 6 "" " > " "" "" } + { GrEq Binary 6 "" " >= " "" "" } + { EqEq Binary 7 "" " == " "" "" } + { NtEq Binary 7 "" " != " "" "" } - { BitAnd Binary 8 "" " & " "" "" } - { BitXor Binary 9 "" " ^ " "" "" } - { BitOr Binary 10 "" " | " "" "" } - { LogAnd Binary 11 "" " && " "" "" } - { LogOr Binary 12 "" " || " "" "" } + { BitAnd Binary 8 "" " & " "" "" } + { BitXor Binary 9 "" " ^ " "" "" } + { BitOr Binary 10 "" " | " "" "" } + { LogAnd Binary 11 "" " && " "" "" } + { LogOr Binary 12 "" " || " "" "" } - { Ternary Null 0 "" " ? " " : " "" } + { Ternary Null 0 "" " ? " " : " "" } - { Call Null 15 "" "(" ")" ", "} + { Call Null 15 "" "(" ")" ", "} - { LeafBytecode Null 0 "" "" "" "" } - { LeafStringLiteral Null 0 "" "" "" "" } - { LeafU64 Null 0 "" "" "" "" } - { LeafF64 Null 0 "" "" "" "" } - { LeafF32 Null 0 "" "" "" "" } - { LeafIdentifier Null 0 "" "" "" "" } - { LeafOffset Null 0 "" "" "" "" } - { LeafValue Null 0 "" "" "" "" } - { LeafFilePath Null 0 "" "" "" "" } + { LeafBytecode Null 0 "" "" "" "" } + { LeafStringLiteral Null 0 "" "" "" "" } + { LeafU64 Null 0 "" "" "" "" } + { LeafF64 Null 0 "" "" "" "" } + { LeafF32 Null 0 "" "" "" "" } + { LeafIdentifier Null 0 "" "" "" "" } + { LeafOffset Null 0 "" "" "" "" } + { LeafValue Null 0 "" "" "" "" } + { LeafFilePath Null 0 "" "" "" "" } - { TypeIdent Null 0 "" "" "" "" } - { Ptr Null 0 "" "" "" "" } - { Array Null 0 "" "" "" "" } - { Func Null 0 "" "" "" "" } + { TypeIdent Null 0 "" "" "" "" } + { Ptr Null 0 "" "" "" "" } + { Array Null 0 "" "" "" "" } + { Func Null 0 "" "" "" "" } + { Unsigned Null 0 "unsigned " "" "" "" } - { Define Binary 13 "" " = " "" "" } + { Define Binary 13 "" " = " "" "" } } @table(name display_string) diff --git a/src/eval/eval_core.c b/src/eval/eval_core.c index a0013fb8..3477e016 100644 --- a/src/eval/eval_core.c +++ b/src/eval/eval_core.c @@ -430,26 +430,41 @@ e_auto_hook_map_make(Arena *arena, U64 slots_count) internal void 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; if(params->type_pattern.size != 0) { E_Parse parse = e_push_parse_from_string(arena, params->type_pattern); 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)); - U8 pattern_split = '?'; - node->type_pattern_parts = str8_split(arena, params->type_pattern, &pattern_split, 1, StringSplitFlag_KeepEmpties); - node->expr = e_parse_from_string(params->tag_expr_string).expr; - if(!e_type_key_match(e_type_key_zero(), type_key)) + + // rjf: get type pattern parts + String8List pattern_parts = {0}; + 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); + U8 pattern_split = '?'; + pattern_parts = str8_split(arena, params->type_pattern, &pattern_split, 1, StringSplitFlag_KeepEmpties); } - 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; E_IRTreeAndType overridden = 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, 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_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 - 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"); S32 indent = 2; diff --git a/src/eval/eval_ir.c b/src/eval/eval_ir.c index f8cabbfe..450204e0 100644 --- a/src/eval/eval_ir.c +++ b/src/eval/eval_ir.c @@ -492,7 +492,7 @@ E_TYPE_ACCESS_FUNCTION_DEF(default) E_Expr *exprl = expr->first; E_Expr *exprr = exprl->next; E_IRTreeAndType l = *lhs_irtree; - E_IRTreeAndType r = e_push_irtree_and_type_from_expr(arena, overridden, 0, 0, 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_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); @@ -585,7 +585,7 @@ E_TYPE_ACCESS_FUNCTION_DEF(default) //- 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, 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(); 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 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); // 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 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_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 +752,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, 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_TypeKey r_type = r_tree.type_key; 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 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, 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_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, 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_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 +840,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, 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); 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 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); // rjf: fill output @@ -882,7 +882,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, 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_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 +910,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, expr->first); + result = e_push_irtree_and_type_from_expr(arena, overridden, 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, 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_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 +950,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, 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_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 +1005,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, l_expr); - E_IRTreeAndType r_tree = e_push_irtree_and_type_from_expr(arena, overridden, disallow_autohooks, disallow_chained_fastpaths, r_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_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 +1229,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, c_expr); - E_IRTreeAndType l_tree = e_push_irtree_and_type_from_expr(arena, overridden, disallow_autohooks, disallow_chained_fastpaths, l_expr); - E_IRTreeAndType r_tree = e_push_irtree_and_type_from_expr(arena, overridden, disallow_autohooks, disallow_chained_fastpaths, r_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, 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_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); @@ -1275,18 +1275,72 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_overridden, case E_ExprKind_Call: { 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_TypeKey lhs_type_key = lhs_irtree.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 // 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 // which prevents paren nesting in simple cases, to easily chain multiple // calls - for example, bin(2).digits(4) - if(lhs_type == &e_type_nil && - lhs->kind == E_ExprKind_MemberAccess) + else if(lhs_type == &e_type_nil && + lhs->kind == E_ExprKind_MemberAccess) { E_Expr *callee = lhs->first->next; 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)); } - 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_msg_list_concat_in_place(&new_msgs, &lhs_irtree.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); // 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 U64 arg_count = 0; @@ -1379,7 +1433,7 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_overridden, } 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); } } @@ -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) 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_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) { string_mapped = 1; @@ -1892,7 +1945,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, 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); } } @@ -1977,15 +2030,45 @@ e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_overridden, result.type_key = expr->type_key; result.mode = E_Mode_Null; }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: { - 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.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, 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.type_key = e_type_key_cons_array(result.type_key, expr->value.u64, 0); }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 *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) { 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; } + //- 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 if(!disallow_chained_fastpaths) { diff --git a/src/eval/eval_ir.h b/src/eval/eval_ir.h index c98a70fa..314659bc 100644 --- a/src/eval/eval_ir.h +++ b/src/eval/eval_ir.h @@ -88,7 +88,7 @@ internal void e_expr_unpoison(E_Expr *expr); //- rjf: top-level irtree/type extraction E_TYPE_ACCESS_FUNCTION_DEF(default); -internal E_IRTreeAndType e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_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 internal void e_append_oplist_from_irtree(Arena *arena, E_IRNode *root, E_Space *current_space, E_OpList *out); diff --git a/src/eval/eval_parse.c b/src/eval/eval_parse.c index 116ddda1..1edb9733 100644 --- a/src/eval/eval_parse.c +++ b/src/eval/eval_parse.c @@ -672,6 +672,10 @@ e_type_key_from_expr(E_Expr *expr) { // TODO(rjf): do we support E_ExprKind_Func here? default:{}break; + case E_ExprKind_LeafIdentifier: + { + result = e_leaf_type_from_name(expr->string); + }break; case E_ExprKind_TypeIdent: { 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 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 +#if 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); @@ -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 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_Expr *rhs = rhs_expr_parse.expr; 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); } diff --git a/src/eval/eval_types.c b/src/eval/eval_types.c index 2fa75880..b040e20f 100644 --- a/src/eval/eval_types.c +++ b/src/eval/eval_types.c @@ -2477,7 +2477,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, idx_expr); + result = e_push_irtree_and_type_from_expr(arena, &override, 0, 0, 0, idx_expr); scratch_end(scratch); }break; diff --git a/src/eval/generated/eval.meta.c b/src/eval/generated/eval.meta.c index 86a8ea6e..5577e0a1 100644 --- a/src/eval/generated/eval.meta.c +++ b/src/eval/generated/eval.meta.c @@ -144,7 +144,7 @@ U8 e_type_kind_basic_byte_size_table[61] = 0, }; -String8 e_expr_kind_strings[48] = +String8 e_expr_kind_strings[49] = { str8_lit_comp("Nil"), str8_lit_comp("Ref"), @@ -193,10 +193,11 @@ str8_lit_comp("TypeIdent"), str8_lit_comp("Ptr"), str8_lit_comp("Array"), str8_lit_comp("Func"), +str8_lit_comp("Unsigned"), 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("") }, @@ -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("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("") }, }; diff --git a/src/eval/generated/eval.meta.h b/src/eval/generated/eval.meta.h index 8e3e570b..e85f1b0f 100644 --- a/src/eval/generated/eval.meta.h +++ b/src/eval/generated/eval.meta.h @@ -145,6 +145,7 @@ E_ExprKind_TypeIdent, E_ExprKind_Ptr, E_ExprKind_Array, E_ExprKind_Func, +E_ExprKind_Unsigned, E_ExprKind_Define, E_ExprKind_COUNT, } E_ExprKindEnum; @@ -169,8 +170,8 @@ C_LINKAGE_BEGIN extern String8 e_token_kind_strings[6]; extern String8 e_type_kind_basic_string_table[61]; extern U8 e_type_kind_basic_byte_size_table[61]; -extern String8 e_expr_kind_strings[48]; -extern E_OpInfo e_expr_kind_op_info_table[48]; +extern String8 e_expr_kind_strings[49]; +extern E_OpInfo e_expr_kind_op_info_table[49]; extern String8 e_interpretation_code_display_strings[11]; C_LINKAGE_END diff --git a/src/lib_rdi_format/rdi_format.c b/src/lib_rdi_format/rdi_format.c index 3765d03e..57f02162 100644 --- a/src/lib_rdi_format/rdi_format.c +++ b/src/lib_rdi_format/rdi_format.c @@ -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] = { -{(RDI_U8 *)"Other", sizeof("Other")}, -{(RDI_U8 *)"U", sizeof("U")}, -{(RDI_U8 *)"S", sizeof("S")}, -{(RDI_U8 *)"F32", sizeof("F32")}, -{(RDI_U8 *)"F64", sizeof("F64")}, -{(RDI_U8 *)"COUNT", sizeof("COUNT")}, +{(RDI_U8 *)"", sizeof("")}, +{(RDI_U8 *)"", sizeof("")}, +{(RDI_U8 *)"Cannot convert between these types.", sizeof("Cannot convert between these types.")}, +{(RDI_U8 *)"Cannot convert to this type.", sizeof("Cannot convert to this type.")}, +{(RDI_U8 *)"Cannot convert this type.", sizeof("Cannot convert this type.")}, +{(RDI_U8 *)"", sizeof("")}, }; RDI_PROC RDI_U64 diff --git a/src/raddbg/generated/raddbg.meta.c b/src/raddbg/generated/raddbg.meta.c index 339f75e6..bb04e188 100644 --- a/src/raddbg/generated/raddbg.meta.c +++ b/src/raddbg/generated/raddbg.meta.c @@ -377,7 +377,7 @@ RD_VocabInfo rd_vocab_info_table[319] = RD_NameSchemaInfo rd_name_schema_info_table[22] = { -{str8_lit_comp("user"), str8_lit_comp("x:\n{\n //- rjf: animations\n @default(1) 'hover_animations': bool,\n @default(1) 'press_animations': bool,\n @default(0) 'focus_animations': bool,\n @default(1) 'tooltip_animations': bool,\n @default(1) 'menu_animations': bool,\n @default(1) 'scrolling_animations': bool,\n\n //- rjf: fonts\n @display_name('UI Font') @description(\"The name or path to the font used when displaying non-code UI elements.\")\n 'main_font': string,\n @display_name('Code Font') @description(\"The name or path to the font used when displaying code.\")\n 'code_font': string,\n\n //- rjf: colors\n @display_name('Color Preset')\n 'color_preset': string,\n @display_name('Color File')\n 'color_file': path,\n @display_name('Colors')\n 'colors': query,\n\n //- rjf: thread & breakpoint decorations\n @default(1) @display_name('Thread Lines') @description(\"Controls whether or not a long horizontal line is drawn before the next line or instruction that the selected thread will execute in source and disassembly views.\")\n 'thread_lines': bool,\n @default(1) @display_name('Thread Glow') @description(\"Controls whether or not a glowing effect is drawn on the selected thread in source and disassembly views.\")\n 'thread_glow': bool,\n @default(1) @display_name('Breakpoint Lines') @description(\"Controls whether or not a long horizontal line is drawn before the line or instruction at which a breakpoint is placed, in source and disassembly views.\")\n 'breakpoint_lines': bool,\n @default(1) @display_name('Breakpoint Glow') @description(\"Controls whether or not a glowing effect is drawn on breakpoints in source and disassembly views.\")\n 'breakpoint_glow': bool,\n\n //- rjf: occluding background settings\n @default(0) @display_name('Opaque Backgrounds') @description(\"Controls whether or not all floating background colors are forced to be fully opaque.\")\n 'opaque_backgrounds': bool,\n @default(1) @display_name('Background Blur') @description(\"Controls whether or not occluded regions behind floating elements are blurred.\")\n 'background_blur': bool,\n\n //- rjf: appearance settings\n @default(1) @display_name('Drop Shadows') @description(\"Controls whether or not drop shadows are drawn.\")\n 'drop_shadows': bool,\n @default(1.f) @display_name('Rounded Corner Amount') @description(\"Controls the degree to which UI corners are rounded.\")\n 'rounded_corner_amount': @range[0, 1] f32,\n\n //- rjf: code formatting settings\n @default(2) @display_name('User Tab Width') 'tab_width': @range[1, 32] u64,\n\n //- rjf: windows style menu bar\n @default(1) @display_name('Focus Menu Bar With Alt') @description(\"Mimics standard Windows behavior of focusing the menu bar using the Alt key.\")\n 'focus_menu_bar_with_alt': bool,\n}\n")}, +{str8_lit_comp("user"), str8_lit_comp("x:\n{\n //- rjf: animations\n @default(1) 'hover_animations': bool,\n @default(1) 'press_animations': bool,\n @default(0) 'focus_animations': bool,\n @default(1) 'tooltip_animations': bool,\n @default(1) 'menu_animations': bool,\n @default(1) 'scrolling_animations': bool,\n\n //- rjf: fonts\n @display_name('UI Font') @description(\"The name of, or path to, the font used when displaying non-code UI elements.\")\n 'main_font': string,\n @display_name('Code Font') @description(\"The name of, or path to, the font used when displaying code.\")\n 'code_font': string,\n\n //- rjf: colors\n @display_name('Color Preset')\n 'color_preset': string,\n @display_name('Color File')\n 'color_file': path,\n @display_name('Colors')\n 'colors': query,\n\n //- rjf: thread & breakpoint decorations\n @default(1) @display_name('Thread Lines') @description(\"Controls whether or not a long horizontal line is drawn before the next line or instruction that the selected thread will execute in source and disassembly views.\")\n 'thread_lines': bool,\n @default(1) @display_name('Thread Glow') @description(\"Controls whether or not a glowing effect is drawn on the selected thread in source and disassembly views.\")\n 'thread_glow': bool,\n @default(1) @display_name('Breakpoint Lines') @description(\"Controls whether or not a long horizontal line is drawn before the line or instruction at which a breakpoint is placed, in source and disassembly views.\")\n 'breakpoint_lines': bool,\n @default(1) @display_name('Breakpoint Glow') @description(\"Controls whether or not a glowing effect is drawn on breakpoints in source and disassembly views.\")\n 'breakpoint_glow': bool,\n\n //- rjf: occluding background settings\n @default(0) @display_name('Opaque Backgrounds') @description(\"Controls whether or not all floating background colors are forced to be fully opaque.\")\n 'opaque_backgrounds': bool,\n @default(1) @display_name('Background Blur') @description(\"Controls whether or not occluded regions behind floating elements are blurred.\")\n 'background_blur': bool,\n\n //- rjf: appearance settings\n @default(1) @display_name('Drop Shadows') @description(\"Controls whether or not drop shadows are drawn.\")\n 'drop_shadows': bool,\n @default(1.f) @display_name('Rounded Corner Amount') @description(\"Controls the degree to which UI corners are rounded.\")\n 'rounded_corner_amount': @range[0, 1] f32,\n\n //- rjf: code formatting settings\n @default(2) @display_name('User Tab Width') 'tab_width': @range[1, 32] u64,\n\n //- rjf: windows style menu bar\n @default(1) @display_name('Focus Menu Bar With Alt') @description(\"Mimics standard Windows behavior of focusing the menu bar using the Alt key.\")\n 'focus_menu_bar_with_alt': bool,\n}\n")}, {str8_lit_comp("project"), str8_lit_comp("x:\n{\n @default(2) @display_name('Project Tab Width') 'tab_width': @range[1, 32] u64,\n @default(1) @display_name(\"Break On Win32 Control-C Exceptions\") @description(\"Code: 0x40010005\")\n win32_ctrl_c: bool;\n @default(1) @display_name(\"Break On Win32 Control-Break Exceptions\") @description(\"Code: 0x40010008\")\n win32_ctrl_break: bool;\n @default(0) @display_name(\"Break On Win32 WinRT Originate Error Exceptions\") @description(\"Code: 0x40080201\")\n win32_win_rt_originate_error: bool;\n @default(0) @display_name(\"Break On Win32 WinRT Transform Error Exceptions\") @description(\"Code: 0x40080202\")\n win32_win_rt_transform_error: bool;\n @default(0) @display_name(\"Break On Win32 RPC Call Cancelled Exceptions\") @description(\"Code: 0x0000071a\")\n win32_rpc_call_cancelled: bool;\n @default(0) @display_name(\"Break On Win32 Data Type Misalignment Exceptions\") @description(\"Code: 0x80000002\")\n win32_datatype_misalignment: bool;\n @default(1) @display_name(\"Break On Win32 Access Violation Exceptions\") @description(\"Code: 0xc0000005\")\n win32_access_violation: bool;\n @default(0) @display_name(\"Break On Win32 In Page Error Exceptions\") @description(\"Code: 0xc0000006\")\n win32_in_page_error: bool;\n @default(1) @display_name(\"Break On Win32 Invalid Handle Specified Exceptions\") @description(\"Code: 0xc0000008\")\n win32_invalid_handle: bool;\n @default(0) @display_name(\"Break On Win32 Not Enough Quota Exceptions\") @description(\"Code: 0xc0000017\")\n win32_not_enough_quota: bool;\n @default(0) @display_name(\"Break On Win32 Illegal Instruction Exceptions\") @description(\"Code: 0xc000001d\")\n win32_illegal_instruction: bool;\n @default(0) @display_name(\"Break On Win32 Cannot Continue From Exception Exceptions\") @description(\"Code: 0xc0000025\")\n win32_cannot_continue_exception: bool;\n @default(0) @display_name(\"Break On Win32 Invalid Exception Disposition Returned By Handler Exceptions\") @description(\"Code: 0xc0000026\")\n win32_invalid_exception_disposition: bool;\n @default(0) @display_name(\"Break On Win32 Array Bounds Exceeded Exceptions\") @description(\"Code: 0xc000008c\")\n win32_array_bounds_exceeded: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Denormal Operand Exceptions\") @description(\"Code: 0xc000008d\")\n win32_floating_point_denormal_operand: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Division By Zero Exceptions\") @description(\"Code: 0xc000008e\")\n win32_floating_point_division_by_zero: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Inexact Result Exceptions\") @description(\"Code: 0xc000008f\")\n win32_floating_point_inexact_result: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Invalid Operation Exceptions\") @description(\"Code: 0xc0000090\")\n win32_floating_point_invalid_operation: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Overflow Exceptions\") @description(\"Code: 0xc0000091\")\n win32_floating_point_overflow: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Stack Check Exceptions\") @description(\"Code: 0xc0000092\")\n win32_floating_point_stack_check: bool;\n @default(0) @display_name(\"Break On Win32 Floating-Point Underflow Exceptions\") @description(\"Code: 0xc0000093\")\n win32_floating_point_underflow: bool;\n @default(0) @display_name(\"Break On Win32 Integer Division By Zero Exceptions\") @description(\"Code: 0xc0000094\")\n win32_integer_division_by_zero: bool;\n @default(0) @display_name(\"Break On Win32 Integer Overflow Exceptions\") @description(\"Code: 0xc0000095\")\n win32_integer_overflow: bool;\n @default(0) @display_name(\"Break On Win32 Privileged Instruction Exceptions\") @description(\"Code: 0xc0000096\")\n win32_privileged_instruction: bool;\n @default(0) @display_name(\"Break On Win32 Stack Overflow Exceptions\") @description(\"Code: 0xc00000fd\")\n win32_stack_overflow: bool;\n @default(0) @display_name(\"Break On Win32 Unable To Locate DLL Exceptions\") @description(\"Code: 0xc0000135\")\n win32_unable_to_locate_dll: bool;\n @default(0) @display_name(\"Break On Win32 Ordinal Not Found Exceptions\") @description(\"Code: 0xc0000138\")\n win32_ordinal_not_found: bool;\n @default(0) @display_name(\"Break On Win32 Entry Point Not Found Exceptions\") @description(\"Code: 0xc0000139\")\n win32_entry_point_not_found: bool;\n @default(0) @display_name(\"Break On Win32 DLL Initialization Failed Exceptions\") @description(\"Code: 0xc0000142\")\n win32_dll_initialization_failed: bool;\n @default(0) @display_name(\"Break On Win32 Floating Point SSE Multiple Faults Exceptions\") @description(\"Code: 0xc00002b4\")\n win32_floating_point_sse_multiple_faults: bool;\n @default(0) @display_name(\"Break On Win32 Floating Point SSE Multiple Traps Exceptions\") @description(\"Code: 0xc00002b5\")\n win32_floating_point_sse_multiple_traps: bool;\n @default(1) @display_name(\"Break On Win32 Assertion Failed Exceptions\") @description(\"Code: 0xc0000420\")\n win32_assertion_failed: bool;\n @default(0) @display_name(\"Break On Win32 Module Not Found Exceptions\") @description(\"Code: 0xc06d007e\")\n win32_module_not_found: bool;\n @default(0) @display_name(\"Break On Win32 Procedure Not Found Exceptions\") @description(\"Code: 0xc06d007f\")\n win32_procedure_not_found: bool;\n @default(1) @display_name(\"Break On Win32 Sanitizer Error Detected Exceptions\") @description(\"Code: 0xe073616e\")\n win32_sanitizer_error_detected: bool;\n @default(0) @display_name(\"Break On Win32 Sanitizer Raw Access Violation Exceptions\") @description(\"Code: 0xe0736171\")\n win32_sanitizer_raw_access_violation: bool;\n @default(1) @display_name(\"Break On Win32 DirectX Debug Layer Exceptions\") @description(\"Code: 0x0000087a\")\n win32_directx_debug_layer: bool;\n}\n")}, {str8_lit_comp("color"), str8_lit_comp("@collection_commands(add_color, import_colors) x:\n{\n @display_name('Tags') tags: string,\n @display_name('Value') value: @color @hex u32,\n}\n")}, {str8_lit_comp("window"), str8_lit_comp("x:\n{\n //- rjf: text rasterization settings\n @default(1) @display_name('Smooth UI Text') @description(\"Controls whether or not UI text is fully anti-aliased, for a smoother appearance.\")\n 'smooth_ui_text': bool,\n @default(1) @display_name('Hint UI Text') @description(\"Controls whether or not UI text is hinted, for better text readability at small sizes.\")\n 'hint_ui_text': bool,\n @default(0) @display_name('Smooth Code Text') @description(\"Controls whether or not code text is fully anti-aliased, for a smoother appearance.\")\n 'smooth_code_text': bool,\n @default(1) @display_name('Hint Code Text') @description(\"Controls whether or not code text is hinted, for better text readability at small sizes.\")\n 'hint_code_text': bool,\n @default(11) @display_name('Window Font Size') @description(\"Controls the window's default font size. Does not apply to tabs with their own font size set.\")\n 'font_size': @range[6, 72] u64,\n\n //- rjf: size settings\n @default(3.f) @display_name('Window Row Height') @description(\"Controls the window's default row height, in multiples of the font size. Does not apply to tabs with their own row height set.\")\n 'row_height': @range[1.75f, 5.f] f32,\n @default(3.f) @description(\"Controls the height of tabs, in multiples of the font size.\")\n 'tab_height': @range[1.75f, 5.f] f32,\n}\n")}, diff --git a/src/raddbg/raddbg.mdesk b/src/raddbg/raddbg.mdesk index 77fb96be..4a858306 100644 --- a/src/raddbg/raddbg.mdesk +++ b/src/raddbg/raddbg.mdesk @@ -225,9 +225,9 @@ RD_VocabTable: @default(1) 'scrolling_animations': bool, //- 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, - @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, //- rjf: colors diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index a7b2bedb..9dc1a189 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -1301,36 +1301,48 @@ rd_setting_from_name(String8 name) internal B32 rd_setting_b32_from_name(String8 name) { - Temp scratch = scratch_begin(0, 0); + B32 result = 0; String8 value = rd_setting_from_name(name); - String8 expr = push_str8f(scratch.arena, "(bool)(%S)", value); - E_Eval eval = e_eval_from_string(expr); - B32 result = !!e_value_eval_from_eval(eval).value.u64; - scratch_end(scratch); + if(value.size != 0) + { + Temp scratch = scratch_begin(0, 0); + 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; } internal U64 rd_setting_u64_from_name(String8 name) { - Temp scratch = scratch_begin(0, 0); + U64 result = 0; String8 value = rd_setting_from_name(name); - String8 expr = push_str8f(scratch.arena, "(uint64)(%S)", value); - E_Eval eval = e_eval_from_string(expr); - U64 result = e_value_eval_from_eval(eval).value.u64; - scratch_end(scratch); + if(value.size != 0) + { + Temp scratch = scratch_begin(0, 0); + 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; } internal F32 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 expr = push_str8f(scratch.arena, "(float32)(%S)", value); - E_Eval eval = e_eval_from_string(expr); - F32 result = e_value_eval_from_eval(eval).value.f32; - scratch_end(scratch); + if(value.size != 0) + { + Temp scratch = scratch_begin(0, 0); + 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; } @@ -4357,16 +4369,15 @@ rd_view_ui(Rng2F32 rect) F32 cell_slider_value = 0.f; 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_Expr *max_expr = cell_type->args[1]; + E_Key min_key = e_key_from_expr(cell_type->args[0]); + E_Key max_key = e_key_from_expr(cell_type->args[1]); E_ParentKey(cell->eval.key) { 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); - E_Expr *min_casted = e_expr_ref_cast(scratch.arena, slider_value_type, min_expr); - E_Expr *max_casted = e_expr_ref_cast(scratch.arena, slider_value_type, max_expr); - cell_slider_min = e_value_from_expr(min_casted); - cell_slider_max = e_value_from_expr(max_casted); + String8 slider_type_name = e_type_string_from_key(scratch.arena, slider_value_type); + cell_slider_min = e_value_from_key(e_key_wrapf(min_key, "(%S)$", slider_type_name)); + cell_slider_max = e_value_from_key(e_key_wrapf(max_key, "(%S)$", slider_type_name)); } } switch(slider_value_type_kind) diff --git a/src/rdi_format/rdi_format.mdesk b/src/rdi_format/rdi_format.mdesk index 5639d5df..aabc166d 100644 --- a/src/rdi_format/rdi_format.mdesk +++ b/src/rdi_format/rdi_format.mdesk @@ -1376,7 +1376,7 @@ rdi_eval_typegroup_conversion_kind_matrix: @data(`struct {RDI_U8 *str; RDI_U64 size;}`) @c_file 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;`, `}`; `return result;`; - `}`; + `}`; ``; }