diff --git a/src/df/gfx/df_views.c b/src/df/gfx/df_views.c index 9392df49..c58d322b 100644 --- a/src/df/gfx/df_views.c +++ b/src/df/gfx/df_views.c @@ -2595,6 +2595,152 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS df_push_cmd__root(&p, df_cmd_spec_from_core_cmd_kind(DF_CoreCmdKind_Edit)); } + // rjf: [DEV] hovering -> tooltips + if(DEV_eval_compiler_tooltips && ui_hovering(sig)) UI_Tooltip DF_Font(ws, DF_FontSlot_Code) + { + local_persist char *spaces = " "; + String8 string = row->display_expr; + E_TokenArray tokens = e_token_array_from_text(scratch.arena, string); + E_Parse parse = e_parse_expr_from_text_tokens(scratch.arena, string, &tokens); + E_IRTreeAndType irtree = e_irtree_and_type_from_expr(scratch.arena, parse.expr); + E_OpList oplist = e_oplist_from_irtree(scratch.arena, irtree.root); + String8 bytecode = e_bytecode_from_oplist(scratch.arena, &oplist); + UI_Flags(UI_BoxFlag_DrawTextWeak) ui_labelf("Text:"); + ui_label(string); + ui_spacer(ui_em(2.f, 1.f)); + UI_Flags(UI_BoxFlag_DrawTextWeak) ui_labelf("Tokens:"); + for(U64 idx = 0; idx < tokens.count; idx += 1) + { + ui_labelf("%S: '%S'", e_token_kind_strings[tokens.v[idx].kind], str8_substr(string, tokens.v[idx].range)); + } + ui_spacer(ui_em(2.f, 1.f)); + UI_Flags(UI_BoxFlag_DrawTextWeak) ui_labelf("Expression:"); + { + typedef struct Task Task; + struct Task + { + Task *next; + Task *prev; + E_Expr *expr; + S64 depth; + }; + Task start_task = {0, 0, parse.expr}; + Task *first_task = &start_task; + Task *last_task = first_task; + for(Task *t = first_task; t != 0; t = t->next) + { + String8 ext = {0}; + switch(t->expr->kind) + { + default: + { + if(t->expr->string.size != 0) + { + ext = push_str8f(scratch.arena, "'%S'", t->expr->string); + } + else if(t->expr->u32 != 0) + { + ext = push_str8f(scratch.arena, "0x%x", t->expr->u32); + } + else if(t->expr->f32 != 0) + { + ext = push_str8f(scratch.arena, "%f", t->expr->f32); + } + else if(t->expr->f64 != 0) + { + ext = push_str8f(scratch.arena, "%f", t->expr->f64); + } + else if(t->expr->u64 != 0) + { + ext = push_str8f(scratch.arena, "0x%I64x", t->expr->u64); + } + }break; + } + ui_labelf("%.*s%S%s%S", (int)t->depth*2, spaces, e_expr_kind_strings[t->expr->kind], ext.size ? " " : "", ext); + for(E_Expr *child = t->expr->first; child != &e_expr_nil; child = child->next) + { + Task *task = push_array(scratch.arena, Task, 1); + task->expr = child; + task->depth = t->depth+1; + DLLInsert(first_task, last_task, t, task); + } + } + } + ui_spacer(ui_em(2.f, 1.f)); + UI_Flags(UI_BoxFlag_DrawTextWeak) ui_labelf("IR Tree:"); + { + typedef struct Task Task; + struct Task + { + Task *next; + Task *prev; + E_IRNode *node; + S64 depth; + }; + Task start_task = {0, 0, irtree.root}; + Task *first_task = &start_task; + Task *last_task = first_task; + for(Task *t = first_task; t != 0; t = t->next) + { + String8 op_string = {0}; + switch(t->node->op) + { + default:{}break; + case E_IRExtKind_Data:{op_string = str8_lit("Data");}break; + case E_IRExtKind_Bytecode:{op_string = str8_lit("Bytecode");}break; +#define X(name) case RDI_EvalOp_##name:{op_string = str8_lit(#name);}break; + RDI_EvalOp_XList +#undef X + } + String8 ext = {0}; + ui_labelf("%.*s%S", (int)t->depth*2, spaces, op_string); + for(E_IRNode *child = t->node->first; child != &e_irnode_nil; child = child->next) + { + Task *task = push_array(scratch.arena, Task, 1); + task->node = child; + task->depth = t->depth+1; + DLLInsert(first_task, last_task, t, task); + } + } + } + ui_spacer(ui_em(2.f, 1.f)); + UI_Flags(UI_BoxFlag_DrawTextWeak) ui_labelf("Op List:"); + { + for(E_Op *op = oplist.first; op != 0; op = op->next) + { + String8 op_string = {0}; + switch(op->opcode) + { + default:{}break; + case E_IRExtKind_Data:{op_string = str8_lit("Data");}break; + case E_IRExtKind_Bytecode:{op_string = str8_lit("Bytecode");}break; +#define X(name) case RDI_EvalOp_##name:{op_string = str8_lit(#name);}break; + RDI_EvalOp_XList +#undef X + } + String8 ext = {0}; + switch(op->opcode) + { + case E_IRExtKind_Data:{ext = push_str8f(scratch.arena, "'%S'", op->data);}break; + case E_IRExtKind_Bytecode:{ext = str8_lit("[bytecode]");}break; + default: + { + ext = str8_from_u64(scratch.arena, op->p, 16, 0, 0); + }break; + } + ui_labelf(" %S%s%S", op_string, ext.size ? " " : "", ext); + } + } + ui_spacer(ui_em(2.f, 1.f)); + UI_Flags(UI_BoxFlag_DrawTextWeak) ui_labelf("Bytecode:"); + { + for(U64 idx = 0; idx < bytecode.size; idx += 1) + { + ui_labelf(" 0x%x ('%c')", (U32)bytecode.str[idx], (char)bytecode.str[idx]); + } + } + } + // rjf: commit expansion state if(next_expanded != row_expanded) { diff --git a/src/eval/eval.mdesk b/src/eval/eval.mdesk index de3f0e6c..06ff159f 100644 --- a/src/eval/eval.mdesk +++ b/src/eval/eval.mdesk @@ -1,6 +1,17 @@ // Copyright (c) 2024 Epic Games Tools // Licensed under the MIT license (https://opensource.org/license/mit/) +@table(name) +E_TokenKindTable: +{ + {Null} + {Identifier} + {Numeric} + {StringLiteral} + {CharLiteral} + {Symbol} +} + @table(name basic_string basic_byte_size) // NOTE(rjf): basic_byte_size == 0xFF? => address sized E_TypeKindTable: @@ -131,6 +142,12 @@ E_InterpretationCodeTable: { MalformedBytecode "Malformed bytecode." } } +@enum E_TokenKind: +{ + @expand(E_TokenKindTable a) `$(a.name)`, + COUNT, +} + @enum E_TypeKind: { @expand(E_TypeKindTable a) `$(a.name)`, @@ -159,6 +176,12 @@ E_InterpretationCodeTable: COUNT, } +@data(String8) +e_token_kind_strings: +{ + @expand(E_TokenKindTable a) `str8_lit_comp("$(a.name)")` +} + @data(String8) e_expr_kind_strings: { diff --git a/src/eval/eval_parse.h b/src/eval/eval_parse.h index ea522b33..d2ab161f 100644 --- a/src/eval/eval_parse.h +++ b/src/eval/eval_parse.h @@ -44,18 +44,6 @@ struct E_MsgList //////////////////////////////// //~ rjf: Token Types -typedef enum E_TokenKind -{ - E_TokenKind_Null, - E_TokenKind_Identifier, - E_TokenKind_Numeric, - E_TokenKind_StringLiteral, - E_TokenKind_CharLiteral, - E_TokenKind_Symbol, - E_TokenKind_COUNT -} -E_TokenKind; - typedef struct E_Token E_Token; struct E_Token { diff --git a/src/eval/generated/eval.meta.c b/src/eval/generated/eval.meta.c index f33a4b06..9a600996 100644 --- a/src/eval/generated/eval.meta.c +++ b/src/eval/generated/eval.meta.c @@ -4,6 +4,16 @@ //- GENERATED CODE C_LINKAGE_BEGIN +String8 e_token_kind_strings[6] = +{ +str8_lit_comp("Null"), +str8_lit_comp("Identifier"), +str8_lit_comp("Numeric"), +str8_lit_comp("StringLiteral"), +str8_lit_comp("CharLiteral"), +str8_lit_comp("Symbol"), +}; + String8 e_expr_kind_strings[41] = { str8_lit_comp("Nil"), diff --git a/src/eval/generated/eval.meta.h b/src/eval/generated/eval.meta.h index cfddf0f0..1dd04d6e 100644 --- a/src/eval/generated/eval.meta.h +++ b/src/eval/generated/eval.meta.h @@ -6,6 +6,17 @@ #ifndef EVAL_META_H #define EVAL_META_H +typedef enum E_TokenKind +{ +E_TokenKind_Null, +E_TokenKind_Identifier, +E_TokenKind_Numeric, +E_TokenKind_StringLiteral, +E_TokenKind_CharLiteral, +E_TokenKind_Symbol, +E_TokenKind_COUNT, +} E_TokenKind; + typedef enum E_TypeKind { E_TypeKind_Null, @@ -139,6 +150,7 @@ E_InterpretationCode_COUNT, } E_InterpretationCode; C_LINKAGE_BEGIN +extern String8 e_token_kind_strings[6]; extern String8 e_expr_kind_strings[41]; extern String8 e_interpretation_code_display_strings[11]; extern String8 e_expr_op_strings[41]; diff --git a/src/lib_rdi_format/rdi_format.h b/src/lib_rdi_format/rdi_format.h index 7b13079a..390c07d9 100644 --- a/src/lib_rdi_format/rdi_format.h +++ b/src/lib_rdi_format/rdi_format.h @@ -779,11 +779,11 @@ X(RDI_U32, type_idx)\ X(RDI_U32, container_idx)\ #define RDI_ThreadVariable_XList \ -X(RDI_U32, name_string_idx)\ -X(RDI_LinkFlags, link_flags)\ -X(RDI_U32, tls_off)\ -X(RDI_U32, type_idx)\ -X(RDI_U32, container_idx)\ +X(type, name_string_idx)\ +X(type, link_flags)\ +X(type, tls_off)\ +X(type, type_idx)\ +X(type, container_idx)\ #define RDI_Procedure_XList \ X(RDI_U32, name_string_idx)\ @@ -882,7 +882,6 @@ X(Convert)\ X(Pick)\ X(Pop)\ X(Insert)\ -X(COUNT)\ #define RDI_EvalTypeGroup_XList \ X(Other)\ @@ -890,7 +889,6 @@ X(U)\ X(S)\ X(F32)\ X(F64)\ -X(COUNT)\ #define RDI_EvalConversionKind_XList \ X(Noop)\ @@ -898,7 +896,6 @@ X(Legal)\ X(OtherToOther)\ X(ToOther)\ X(FromOther)\ -X(COUNT)\ #define RDI_NameMapKind_XList \ X(NULL)\ @@ -908,7 +905,6 @@ X(Procedures)\ X(Types)\ X(LinkNameProcedures)\ X(NormalSourcePaths)\ -X(COUNT)\ #define RDI_NameMap_XList \ X(RDI_U32, bucket_base_idx)\ diff --git a/src/rdi_format/rdi_format.mdesk b/src/rdi_format/rdi_format.mdesk index 16858bdf..f346b9b4 100644 --- a/src/rdi_format/rdi_format.mdesk +++ b/src/rdi_format/rdi_format.mdesk @@ -1108,17 +1108,17 @@ RDI_LocationRegMemberTable: @xlist RDI_LinkFlags_XList: { - @expand(RDI_LinkFlagTable a) `$(a.name)`; + @expand(RDI_LinkFlagTable a) `$(a.name != COUNT -> a.name)`; } @xlist RDI_LocalKind_XList: { - @expand(RDI_LocalKindTable a) `$(a.name)`; + @expand(RDI_LocalKindTable a) `$(a.name != COUNT -> a.name)`; } @xlist RDI_LocationKind_XList: { - @expand(RDI_LocationKindTable a) `$(a.name)`; + @expand(RDI_LocationKindTable a) `$(a.name != COUNT -> a.name)`; } @xlist RDI_GlobalVariable_XList: @@ -1128,7 +1128,7 @@ RDI_LocationRegMemberTable: @xlist RDI_ThreadVariable_XList: { - @expand(RDI_ThreadVariableMemberTable a) `$(a.type), $(a.name)` + @expand(RDI_ThreadVariableMemberTable a) `$(type), $(a.name)` } @xlist RDI_Procedure_XList: @@ -1317,17 +1317,17 @@ RDI_EvalConversionKindTable: @xlist RDI_EvalOp_XList: { - @expand(RDI_EvalOpTable a) `$(a.name)`; + @expand(RDI_EvalOpTable a) `$(a.name != COUNT -> a.name)`; } @xlist RDI_EvalTypeGroup_XList: { - @expand(RDI_EvalTypeGroupTable a) `$(a.name)`; + @expand(RDI_EvalTypeGroupTable a) `$(a.name != COUNT -> a.name)`; } @xlist RDI_EvalConversionKind_XList: { - @expand(RDI_EvalConversionKindTable a) `$(a.name)`; + @expand(RDI_EvalConversionKindTable a) `$(a.name != COUNT -> a.name)`; } @gen(enums) @@ -1405,7 +1405,7 @@ RDI_NameMapNodeMemberTable: @xlist RDI_NameMapKind_XList: { - @expand(RDI_NameMapKindTable a) `$(a.name)`; + @expand(RDI_NameMapKindTable a) `$(a.name != COUNT -> a.name)`; } @xlist RDI_NameMap_XList: