From d9675f256571a8c7f26689efc8d3aa6dc73b4cfa Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Fri, 29 Mar 2024 08:52:37 -0700 Subject: [PATCH] allow assembly-style dereferences in eval parser; register/register-alias syntax highlighting --- src/df/core/df_core.c | 2 +- src/df/gfx/df_gfx.c | 28 +++++++++++++++++++++---- src/df/gfx/df_gfx.mdesk | 2 ++ src/df/gfx/generated/df_gfx.meta.c | 33 ++++++++++++++++++++---------- src/df/gfx/generated/df_gfx.meta.h | 23 +++++++++++---------- src/eval/eval_parser.c | 32 +++++++++++++++++++++++++++++ 6 files changed, 93 insertions(+), 27 deletions(-) diff --git a/src/df/core/df_core.c b/src/df/core/df_core.c index d0243672..791a79ba 100644 --- a/src/df/core/df_core.c +++ b/src/df/core/df_core.c @@ -4179,7 +4179,7 @@ df_eval_from_string(Arena *arena, DBGI_Scope *scope, DF_CtrlCtx *ctrl_ctx, EVAL_ } //- rjf: try to resolve basic integral values into symbols - if(result.mode == EVAL_EvalMode_Value && parse.expr->kind != EVAL_ExprKind_Cast && + if((result.mode == EVAL_EvalMode_Value || result.mode == EVAL_EvalMode_Reg) && parse.expr->kind != EVAL_ExprKind_Cast && (tg_key_match(result.type_key, tg_key_basic(TG_Kind_S64)) || tg_key_match(result.type_key, tg_key_basic(TG_Kind_U64)) || tg_key_match(result.type_key, tg_key_basic(TG_Kind_S32)) || diff --git a/src/df/gfx/df_gfx.c b/src/df/gfx/df_gfx.c index b2f09821..943bfac4 100644 --- a/src/df/gfx/df_gfx.c +++ b/src/df/gfx/df_gfx.c @@ -10314,13 +10314,13 @@ df_code_slice(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_ { DF_ThemeColor new_color_kind = df_theme_color_from_txt_token_kind(token->kind); F32 mix_t = 1.f; - if(token->kind == TXT_TokenKind_Identifier) + if(token->kind == TXT_TokenKind_Identifier || token->kind == TXT_TokenKind_Keyword) { B32 mapped_special = 0; for(DF_EntityNode *n = params->relevant_binaries.first; n != 0; n = n->next) { DF_Entity *binary = n->entity; - if(!mapped_special) + if(!mapped_special && token->kind == TXT_TokenKind_Identifier) { U64 voff = df_voff_from_binary_symbol_name(binary, token_string); if(voff != 0) @@ -10330,7 +10330,7 @@ df_code_slice(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_ mix_t = selected_thread_module->alive_t; } } - if(!mapped_special) + if(!mapped_special && token->kind == TXT_TokenKind_Identifier) { U64 type_num = df_type_num_from_binary_name(binary, token_string); if(type_num != 0) @@ -10340,7 +10340,7 @@ df_code_slice(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_ mix_t = selected_thread_module->alive_t; } } - if(!mapped_special) + if(!mapped_special && token->kind == TXT_TokenKind_Identifier) { U64 local_num = eval_num_from_string(parse_ctx->locals_map, token_string); if(local_num != 0) @@ -10350,6 +10350,26 @@ df_code_slice(DF_Window *ws, DF_CtrlCtx *ctrl_ctx, EVAL_ParseCtx *parse_ctx, DF_ mix_t = selected_thread_module->alive_t; } } + if(!mapped_special) + { + U64 reg_num = eval_num_from_string(parse_ctx->regs_map, token_string); + if(reg_num != 0) + { + mapped_special = 1; + new_color_kind = DF_ThemeColor_CodeRegister; + mix_t = selected_thread_module->alive_t; + } + } + if(!mapped_special) + { + U64 alias_num = eval_num_from_string(parse_ctx->reg_alias_map, token_string); + if(alias_num != 0) + { + mapped_special = 1; + new_color_kind = DF_ThemeColor_CodeRegister; + mix_t = selected_thread_module->alive_t; + } + } break; } } diff --git a/src/df/gfx/df_gfx.mdesk b/src/df/gfx/df_gfx.mdesk index ba56a42d..14ad8d43 100644 --- a/src/df/gfx/df_gfx.mdesk +++ b/src/df/gfx/df_gfx.mdesk @@ -265,6 +265,7 @@ DF_ThemeTable: {CodeFunction "Code (Function)" code_function } {CodeType "Code (Type)" code_type } {CodeLocal "Code (Local)" code_local } + {CodeRegister "Code (Register)" code_register } {CodeKeyword "Code (Keyword)" code_keyword } {CodeSymbol "Code (Symbol)" code_symbol } {CodeNumeric "Code (Numeric)" code_numeric } @@ -349,6 +350,7 @@ DF_ThemePresetColorTable: (code_function 0x7fcc99ff 0x2a7a45ff 0xdcdcaaff 0x74531fff 0x1c7dd1ff 0xc39d36ff 0xcc5735ff 0x7fcc99ff 0x49b2ffff ) (code_type 0x66b2e5ff 0x2c688fff 0x4ec9b0ff 0x2b91afff 0x1c7dd1ff 0x66b2e5ff 0xd8a51dff 0x66b2e5ff 0x49b2ffff ) (code_local 0xfe9548ff 0xfe9548ff 0xfe9548ff 0xfe9548ff 0xfe9548ff 0xfe9548ff 0xfe9548ff 0xfe9548ff 0xfe9548ff ) + (code_register 0xd45d90ff 0xd45d90ff 0xd45d90ff 0xd45d90ff 0xd45d90ff 0xd45d90ff 0xd45d90ff 0xd45d90ff 0xd45d90ff ) (code_keyword 0xf7bf5eff 0xa47729ff 0x569cd6ff 0x0000ffff 0x63980fff 0xc39d36ff 0xac7b0bff 0xd08f20ff 0xff0000ff ) (code_symbol 0x994c32ff 0x6c2d18ff 0xb4b4b4ff 0x000000ff 0x839496ff 0x2e5256ff 0x994c32ff 0x994c32ff 0xffffffff ) (code_numeric 0x4ce54cff 0x2c7d2cff 0xb5cea8ff 0x000000ff 0xcb4b20ff 0x657b83ff 0x6b8e23ff 0x50ff30ff 0x2cff50ff ) diff --git a/src/df/gfx/generated/df_gfx.meta.c b/src/df/gfx/generated/df_gfx.meta.c index 38a43990..dde6d4cf 100644 --- a/src/df/gfx/generated/df_gfx.meta.c +++ b/src/df/gfx/generated/df_gfx.meta.c @@ -30,7 +30,7 @@ str8_lit_comp("four_coder"), str8_lit_comp("far_manager"), }; -Vec4F32 df_g_theme_preset_colors__default_dark[53] = +Vec4F32 df_g_theme_preset_colors__default_dark[54] = { rgba_from_u32_lit_comp(0xff00ffff), rgba_from_u32_lit_comp(0xe5e5e5ff), @@ -41,6 +41,7 @@ rgba_from_u32_lit_comp(0xe5e5e5ff), rgba_from_u32_lit_comp(0x7fcc99ff), rgba_from_u32_lit_comp(0x66b2e5ff), rgba_from_u32_lit_comp(0xfe9548ff), +rgba_from_u32_lit_comp(0xd45d90ff), rgba_from_u32_lit_comp(0xf7bf5eff), rgba_from_u32_lit_comp(0x994c32ff), rgba_from_u32_lit_comp(0x4ce54cff), @@ -87,7 +88,7 @@ rgba_from_u32_lit_comp(0x0000003f), rgba_from_u32_lit_comp(0x0000007f), }; -Vec4F32 df_g_theme_preset_colors__default_light[53] = +Vec4F32 df_g_theme_preset_colors__default_light[54] = { rgba_from_u32_lit_comp(0xff00ffff), rgba_from_u32_lit_comp(0x383838ff), @@ -98,6 +99,7 @@ rgba_from_u32_lit_comp(0x282828ff), rgba_from_u32_lit_comp(0x2a7a45ff), rgba_from_u32_lit_comp(0x2c688fff), rgba_from_u32_lit_comp(0xfe9548ff), +rgba_from_u32_lit_comp(0xd45d90ff), rgba_from_u32_lit_comp(0xa47729ff), rgba_from_u32_lit_comp(0x6c2d18ff), rgba_from_u32_lit_comp(0x2c7d2cff), @@ -144,7 +146,7 @@ rgba_from_u32_lit_comp(0x0000000d), rgba_from_u32_lit_comp(0x0000003b), }; -Vec4F32 df_g_theme_preset_colors__vs_dark[53] = +Vec4F32 df_g_theme_preset_colors__vs_dark[54] = { rgba_from_u32_lit_comp(0xff00ffff), rgba_from_u32_lit_comp(0xe5e5e5ff), @@ -155,6 +157,7 @@ rgba_from_u32_lit_comp(0xd4d4d4ff), rgba_from_u32_lit_comp(0xdcdcaaff), rgba_from_u32_lit_comp(0x4ec9b0ff), rgba_from_u32_lit_comp(0xfe9548ff), +rgba_from_u32_lit_comp(0xd45d90ff), rgba_from_u32_lit_comp(0x569cd6ff), rgba_from_u32_lit_comp(0xb4b4b4ff), rgba_from_u32_lit_comp(0xb5cea8ff), @@ -201,7 +204,7 @@ rgba_from_u32_lit_comp(0x0000003f), rgba_from_u32_lit_comp(0x0000007f), }; -Vec4F32 df_g_theme_preset_colors__vs_light[53] = +Vec4F32 df_g_theme_preset_colors__vs_light[54] = { rgba_from_u32_lit_comp(0xff00ffff), rgba_from_u32_lit_comp(0x1e1e1eff), @@ -212,6 +215,7 @@ rgba_from_u32_lit_comp(0x000000ff), rgba_from_u32_lit_comp(0x74531fff), rgba_from_u32_lit_comp(0x2b91afff), rgba_from_u32_lit_comp(0xfe9548ff), +rgba_from_u32_lit_comp(0xd45d90ff), rgba_from_u32_lit_comp(0x0000ffff), rgba_from_u32_lit_comp(0x000000ff), rgba_from_u32_lit_comp(0x000000ff), @@ -258,7 +262,7 @@ rgba_from_u32_lit_comp(0x0000000d), rgba_from_u32_lit_comp(0x0000003b), }; -Vec4F32 df_g_theme_preset_colors__solarized_dark[53] = +Vec4F32 df_g_theme_preset_colors__solarized_dark[54] = { rgba_from_u32_lit_comp(0xff00ffff), rgba_from_u32_lit_comp(0xe5e5e5ff), @@ -269,6 +273,7 @@ rgba_from_u32_lit_comp(0x839496ff), rgba_from_u32_lit_comp(0x1c7dd1ff), rgba_from_u32_lit_comp(0x1c7dd1ff), rgba_from_u32_lit_comp(0xfe9548ff), +rgba_from_u32_lit_comp(0xd45d90ff), rgba_from_u32_lit_comp(0x63980fff), rgba_from_u32_lit_comp(0x839496ff), rgba_from_u32_lit_comp(0xcb4b20ff), @@ -315,7 +320,7 @@ rgba_from_u32_lit_comp(0x0000003f), rgba_from_u32_lit_comp(0x0000007f), }; -Vec4F32 df_g_theme_preset_colors__solarized_light[53] = +Vec4F32 df_g_theme_preset_colors__solarized_light[54] = { rgba_from_u32_lit_comp(0xff00ffff), rgba_from_u32_lit_comp(0x1e1e1eff), @@ -326,6 +331,7 @@ rgba_from_u32_lit_comp(0x74878cff), rgba_from_u32_lit_comp(0xc39d36ff), rgba_from_u32_lit_comp(0x66b2e5ff), rgba_from_u32_lit_comp(0xfe9548ff), +rgba_from_u32_lit_comp(0xd45d90ff), rgba_from_u32_lit_comp(0xc39d36ff), rgba_from_u32_lit_comp(0x2e5256ff), rgba_from_u32_lit_comp(0x657b83ff), @@ -372,7 +378,7 @@ rgba_from_u32_lit_comp(0x0000000d), rgba_from_u32_lit_comp(0x0000003b), }; -Vec4F32 df_g_theme_preset_colors__handmade_hero[53] = +Vec4F32 df_g_theme_preset_colors__handmade_hero[54] = { rgba_from_u32_lit_comp(0xff00ffff), rgba_from_u32_lit_comp(0xa08563ff), @@ -383,6 +389,7 @@ rgba_from_u32_lit_comp(0xa08563ff), rgba_from_u32_lit_comp(0xcc5735ff), rgba_from_u32_lit_comp(0xd8a51dff), rgba_from_u32_lit_comp(0xfe9548ff), +rgba_from_u32_lit_comp(0xd45d90ff), rgba_from_u32_lit_comp(0xac7b0bff), rgba_from_u32_lit_comp(0x994c32ff), rgba_from_u32_lit_comp(0x6b8e23ff), @@ -429,7 +436,7 @@ rgba_from_u32_lit_comp(0x0000003f), rgba_from_u32_lit_comp(0x0000007f), }; -Vec4F32 df_g_theme_preset_colors__four_coder[53] = +Vec4F32 df_g_theme_preset_colors__four_coder[54] = { rgba_from_u32_lit_comp(0xff00ffff), rgba_from_u32_lit_comp(0x90b080ff), @@ -440,6 +447,7 @@ rgba_from_u32_lit_comp(0x90b080ff), rgba_from_u32_lit_comp(0x7fcc99ff), rgba_from_u32_lit_comp(0x66b2e5ff), rgba_from_u32_lit_comp(0xfe9548ff), +rgba_from_u32_lit_comp(0xd45d90ff), rgba_from_u32_lit_comp(0xd08f20ff), rgba_from_u32_lit_comp(0x994c32ff), rgba_from_u32_lit_comp(0x50ff30ff), @@ -486,7 +494,7 @@ rgba_from_u32_lit_comp(0x0000003f), rgba_from_u32_lit_comp(0x0000007f), }; -Vec4F32 df_g_theme_preset_colors__far_manager[53] = +Vec4F32 df_g_theme_preset_colors__far_manager[54] = { rgba_from_u32_lit_comp(0xff00ffff), rgba_from_u32_lit_comp(0x00ffffff), @@ -497,6 +505,7 @@ rgba_from_u32_lit_comp(0x00ffffff), rgba_from_u32_lit_comp(0x49b2ffff), rgba_from_u32_lit_comp(0x49b2ffff), rgba_from_u32_lit_comp(0xfe9548ff), +rgba_from_u32_lit_comp(0xd45d90ff), rgba_from_u32_lit_comp(0xff0000ff), rgba_from_u32_lit_comp(0xffffffff), rgba_from_u32_lit_comp(0x2cff50ff), @@ -755,7 +764,7 @@ DF_ViewSpecInfo df_g_gfx_view_kind_spec_info_table[29] = {(0|0*DF_ViewSpecFlag_ParameterizedByEntity|1*DF_ViewSpecFlag_CanSerialize|0*DF_ViewSpecFlag_CanSerializeEntityPath|0*DF_ViewSpecFlag_CanFilter|0*DF_ViewSpecFlag_FilterIsCode|0*DF_ViewSpecFlag_TypingAutomaticallyFilters), str8_lit_comp("theme"), str8_lit_comp("Theme"), DF_NameKind_Null, DF_IconKind_Palette, DF_VIEW_SETUP_FUNCTION_NAME(Theme), DF_VIEW_STRING_FROM_STATE_FUNCTION_NAME(Theme), DF_VIEW_CMD_FUNCTION_NAME(Theme), DF_VIEW_UI_FUNCTION_NAME(Theme)}, }; -String8 df_g_theme_color_display_string_table[53] = +String8 df_g_theme_color_display_string_table[54] = { str8_lit_comp("Null"), str8_lit_comp("Plain Text"), @@ -766,6 +775,7 @@ str8_lit_comp("Code (Default)"), str8_lit_comp("Code (Function)"), str8_lit_comp("Code (Type)"), str8_lit_comp("Code (Local)"), +str8_lit_comp("Code (Register)"), str8_lit_comp("Code (Keyword)"), str8_lit_comp("Code (Symbol)"), str8_lit_comp("Code (Numeric)"), @@ -812,7 +822,7 @@ str8_lit_comp("Inactive Panel Overlay"), str8_lit_comp("Drop Shadow"), }; -String8 df_g_theme_color_cfg_string_table[53] = +String8 df_g_theme_color_cfg_string_table[54] = { str8_lit_comp("null"), str8_lit_comp("plain_text"), @@ -823,6 +833,7 @@ str8_lit_comp("code_default"), str8_lit_comp("code_function"), str8_lit_comp("code_type"), str8_lit_comp("code_local"), +str8_lit_comp("code_register"), str8_lit_comp("code_keyword"), str8_lit_comp("code_symbol"), str8_lit_comp("code_numeric"), diff --git a/src/df/gfx/generated/df_gfx.meta.h b/src/df/gfx/generated/df_gfx.meta.h index 23ced75c..595f1ecd 100644 --- a/src/df/gfx/generated/df_gfx.meta.h +++ b/src/df/gfx/generated/df_gfx.meta.h @@ -51,6 +51,7 @@ DF_ThemeColor_CodeDefault, DF_ThemeColor_CodeFunction, DF_ThemeColor_CodeType, DF_ThemeColor_CodeLocal, +DF_ThemeColor_CodeRegister, DF_ThemeColor_CodeKeyword, DF_ThemeColor_CodeSymbol, DF_ThemeColor_CodeNumeric, @@ -250,15 +251,15 @@ DF_GFX_VIEW_RULE_BLOCK_UI_FUNCTION_DEF(geo); C_LINKAGE_BEGIN extern String8 df_g_theme_preset_display_string_table[9]; extern String8 df_g_theme_preset_code_string_table[9]; -extern Vec4F32 df_g_theme_preset_colors__default_dark[53]; -extern Vec4F32 df_g_theme_preset_colors__default_light[53]; -extern Vec4F32 df_g_theme_preset_colors__vs_dark[53]; -extern Vec4F32 df_g_theme_preset_colors__vs_light[53]; -extern Vec4F32 df_g_theme_preset_colors__solarized_dark[53]; -extern Vec4F32 df_g_theme_preset_colors__solarized_light[53]; -extern Vec4F32 df_g_theme_preset_colors__handmade_hero[53]; -extern Vec4F32 df_g_theme_preset_colors__four_coder[53]; -extern Vec4F32 df_g_theme_preset_colors__far_manager[53]; +extern Vec4F32 df_g_theme_preset_colors__default_dark[54]; +extern Vec4F32 df_g_theme_preset_colors__default_light[54]; +extern Vec4F32 df_g_theme_preset_colors__vs_dark[54]; +extern Vec4F32 df_g_theme_preset_colors__vs_light[54]; +extern Vec4F32 df_g_theme_preset_colors__solarized_dark[54]; +extern Vec4F32 df_g_theme_preset_colors__solarized_light[54]; +extern Vec4F32 df_g_theme_preset_colors__handmade_hero[54]; +extern Vec4F32 df_g_theme_preset_colors__four_coder[54]; +extern Vec4F32 df_g_theme_preset_colors__far_manager[54]; extern Vec4F32* df_g_theme_preset_colors_table[9]; extern DF_CmdParamSlot df_g_cmd_param_slot_2_view_spec_src_map[7]; extern String8 df_g_cmd_param_slot_2_view_spec_dst_map[7]; @@ -267,8 +268,8 @@ extern DF_StringBindingPair df_g_default_binding_table[97]; extern String8 df_g_binding_version_remap_old_name_table[3]; extern String8 df_g_binding_version_remap_new_name_table[3]; extern DF_ViewSpecInfo df_g_gfx_view_kind_spec_info_table[29]; -extern String8 df_g_theme_color_display_string_table[53]; -extern String8 df_g_theme_color_cfg_string_table[53]; +extern String8 df_g_theme_color_display_string_table[54]; +extern String8 df_g_theme_color_cfg_string_table[54]; read_only global U8 df_g_icon_font_bytes__data[] = { 0x00,0x01,0x00,0x00,0x00,0x0f,0x00,0x80,0x00,0x03,0x00,0x70,0x47,0x53,0x55,0x42,0x20,0x8b,0x25,0x7a,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x54,0x4f,0x53,0x2f,0x32,0x56,0x44,0x49,0xa0,0x00,0x00,0x01,0x50,0x00,0x00,0x00,0x60,0x63,0x6d,0x61,0x70,0x2a,0x09,0xe2,0xc2,0x00,0x00,0x01,0xb0,0x00,0x00,0x05,0xec,0x63,0x76,0x74,0x20, diff --git a/src/eval/eval_parser.c b/src/eval/eval_parser.c index 8d5ec73e..71bf8a1b 100644 --- a/src/eval/eval_parser.c +++ b/src/eval/eval_parser.c @@ -775,6 +775,38 @@ eval_parse_expr_from_text_tokens__prec(Arena *arena, EVAL_ParseCtx *ctx, String8 } } + //- rjf: descent to assembly-style dereference sub-expression + else if(token.kind == EVAL_TokenKind_Symbol && str8_match(token_string, str8_lit("["), 0)) + { + // rjf: skip [ + it += 1; + + // rjf: parse [] contents + EVAL_TokenArray nested_parse_tokens = eval_token_array_make_first_opl(it, it_opl); + EVAL_ParseResult nested_parse = eval_parse_expr_from_text_tokens__prec(arena, ctx, text, &nested_parse_tokens, eval_g_max_precedence); + eval_error_list_concat_in_place(&result.errors, &nested_parse.errors); + atom = nested_parse.expr; + it = nested_parse.last_token; + + // rjf: build cast-to-U64*, and dereference operators + atom = eval_expr(arena, EVAL_ExprKind_Cast, token_string.str, eval_expr_leaf_type(arena, token_string.str, tg_cons_type_make(ctx->type_graph, TG_Kind_Ptr, tg_key_basic(TG_Kind_U64), 0)), atom, 0); + atom = eval_expr(arena, EVAL_ExprKind_Deref, token_string.str, atom, 0, 0); + + // rjf: expect ] + EVAL_Token close_paren_maybe = eval_token_at_it(it, tokens); + String8 close_paren_maybe_string = str8_substr(text, close_paren_maybe.range); + if(close_paren_maybe.kind != EVAL_TokenKind_Symbol || !str8_match(close_paren_maybe_string, str8_lit("]"), 0)) + { + eval_errorf(arena, &result.errors, EVAL_ErrorKind_MalformedInput, token_string.str, "Missing ]."); + } + + // rjf: consume ) + else + { + it += 1; + } + } + //- rjf: leaf (identifier, literal) else if(token.kind != EVAL_TokenKind_Symbol) {