diff --git a/src/eval/eval.mdesk b/src/eval/eval.mdesk index e943b21d..b70e3fbb 100644 --- a/src/eval/eval.mdesk +++ b/src/eval/eval.mdesk @@ -74,6 +74,7 @@ E_TypeKindTable: {Set "set" 0 } {Lens "lens" 0 } {LensSpec "lens_spec" 0 } + {MetaExpr "meta_expr" 0 } } @table(name op_kind precedence op_pre op_sep op_pos op_chain) diff --git a/src/eval/eval_types.c b/src/eval/eval_types.c index b6194826..a84bf0ef 100644 --- a/src/eval/eval_types.c +++ b/src/eval/eval_types.c @@ -1338,7 +1338,8 @@ e_type_unwrap(E_TypeKey key) if((E_TypeKind_FirstIncomplete <= kind && kind <= E_TypeKind_LastIncomplete) || kind == E_TypeKind_Modifier || kind == E_TypeKind_Alias || - kind == E_TypeKind_Lens) + kind == E_TypeKind_Lens || + kind == E_TypeKind_MetaExpr) { result = e_type_direct_from_key(result); } @@ -1800,6 +1801,12 @@ e_type_lhs_string_from_key(Arena *arena, E_TypeKey key, String8List *out, U32 pr } str8_list_push(arena, out, str8_lit("::*")); }break; + + case E_TypeKind_MetaExpr: + { + E_TypeKey direct = e_type_direct_from_key(key); + e_type_lhs_string_from_key(arena, direct, out, prec, skip_return); + }break; } } @@ -1874,6 +1881,12 @@ e_type_rhs_string_from_key(Arena *arena, E_TypeKey key, String8List *out, U32 pr E_TypeKey direct = e_type_direct_from_key(key); e_type_rhs_string_from_key(arena, direct, out, 2); }break; + + case E_TypeKind_MetaExpr: + { + E_TypeKey direct = e_type_direct_from_key(key); + e_type_rhs_string_from_key(arena, direct, out, prec); + }break; } } @@ -1947,6 +1960,13 @@ e_default_expansion_type_from_key(E_TypeKey root_key) done = 0; } + //- rjf: if we have meta-expression tags in the type chain, defer + // to the next type in the chain. + else if(kind == E_TypeKind_MetaExpr) + { + done = 0; + } + //- rjf: if we've reached a struct-like, then we can use that for // struct-like expansion. else if(kind == E_TypeKind_Struct || diff --git a/src/eval/generated/eval.meta.c b/src/eval/generated/eval.meta.c index 6febd96e..cf45b3a3 100644 --- a/src/eval/generated/eval.meta.c +++ b/src/eval/generated/eval.meta.c @@ -14,7 +14,7 @@ str8_lit_comp("CharLiteral"), str8_lit_comp("Symbol"), }; -String8 e_type_kind_basic_string_table[58] = +String8 e_type_kind_basic_string_table[59] = { str8_lit_comp(""), str8_lit_comp("void"), @@ -74,9 +74,10 @@ str8_lit_comp("variadic"), str8_lit_comp("set"), str8_lit_comp("lens"), str8_lit_comp("lens_spec"), +str8_lit_comp("meta_expr"), }; -U8 e_type_kind_basic_byte_size_table[58] = +U8 e_type_kind_basic_byte_size_table[59] = { 0, 0, @@ -136,6 +137,7 @@ U8 e_type_kind_basic_byte_size_table[58] = 0, 0, 0, +0, }; String8 e_expr_kind_strings[48] = diff --git a/src/eval/generated/eval.meta.h b/src/eval/generated/eval.meta.h index d9212232..6ba7a85e 100644 --- a/src/eval/generated/eval.meta.h +++ b/src/eval/generated/eval.meta.h @@ -77,6 +77,7 @@ E_TypeKind_Variadic, E_TypeKind_Set, E_TypeKind_Lens, E_TypeKind_LensSpec, +E_TypeKind_MetaExpr, E_TypeKind_COUNT, E_TypeKind_FirstBasic = E_TypeKind_Void, E_TypeKind_LastBasic = E_TypeKind_ComplexF128, @@ -162,8 +163,8 @@ E_InterpretationCode_COUNT, C_LINKAGE_BEGIN extern String8 e_token_kind_strings[6]; -extern String8 e_type_kind_basic_string_table[58]; -extern U8 e_type_kind_basic_byte_size_table[58]; +extern String8 e_type_kind_basic_string_table[59]; +extern U8 e_type_kind_basic_byte_size_table[59]; extern String8 e_expr_kind_strings[48]; extern E_OpInfo e_expr_kind_op_info_table[48]; extern String8 e_interpretation_code_display_strings[11]; diff --git a/src/eval_visualization/eval_visualization_core.c b/src/eval_visualization/eval_visualization_core.c index 8f06f230..d22ca1a3 100644 --- a/src/eval_visualization/eval_visualization_core.c +++ b/src/eval_visualization/eval_visualization_core.c @@ -1657,6 +1657,38 @@ ev_string_iter_next(Arena *arena, EV_StringIter *it, String8 *out_string) } }break; + ////////////////////////// + //- rjf: meta-expression tags + // + case E_TypeKind_MetaExpr: + { + if(params->flags & EV_StringFlag_ReadOnlyDisplayRules) + { + switch(task_idx) + { + default:{}break; + case 0: + { + need_pop = 0; + need_new_task = 1; + new_task.params = *params; + new_task.eval = eval; + new_task.eval.irtree.type_key = e_type_direct_from_key(eval.irtree.type_key); + }break; + case 1: + { + E_Type *type = e_type_from_key__cached(type_key); + *out_string = push_str8f(arena, " (%S)", type->name); + }break; + } + } + else + { + E_Type *type = e_type_from_key__cached(type_key); + *out_string = type->name; + } + }break; + ////////////////////////// //- rjf: modifiers // diff --git a/src/raddbg/generated/raddbg.meta.c b/src/raddbg/generated/raddbg.meta.c index 1c8e1e17..c8476d82 100644 --- a/src/raddbg/generated/raddbg.meta.c +++ b/src/raddbg/generated/raddbg.meta.c @@ -328,7 +328,7 @@ RD_NameSchemaInfo rd_name_schema_info_table[17] = {str8_lit_comp("settings"), str8_lit_comp("x:\n{\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 @default(1) 'background_blur': bool,\n @default(1) 'thread_lines': bool,\n @default(1) 'breakpoint_lines': bool,\n @default(1) 'thread_glow': bool,\n @default(1) 'breakpoint_glow': bool,\n @default(0) 'opaque_backgrounds': bool,\n @default(1) 'smooth_main_text': bool,\n @default(0) 'smooth_code_text': bool,\n @default(1) 'hint_main_text': bool,\n @default(1) 'hint_code_text': bool,\n @default(2) 'tab_width': @range[1, 32] u64,\n @can_be_per_window 'main_font_size': @range[6, 72] u64,\n @can_be_per_window 'code_font_size': @range[1, 32] u64,\n}\n")}, {str8_lit_comp("text"), str8_lit_comp("x:\n{\n 'lang':lang,\n 'size':code_string,\n @default(1) 'show_line_numbers':bool,\n}\n")}, {str8_lit_comp("disasm"), str8_lit_comp("x:\n{\n 'arch': arch,\n 'syntax': dasm_syntax,\n 'size': code_string,\n @default(1) 'show_addresses': bool,\n @default(0) 'show_code_bytes': bool,\n @default(1) 'show_source_lines': bool,\n @default(1) 'show_symbol_names': bool,\n @default(1) 'show_line_numbers': bool,\n}\n")}, -{str8_lit_comp("memory"), str8_lit_comp("x:\n{\n 'size': code_string,\n @default(16) 'num_columns': @range[1, 256] u64,\n @default(1) 'bytes_per_cell': @range[1, 16] u64,\n}\n")}, +{str8_lit_comp("memory"), str8_lit_comp("x:\n{\n 'size': code_string,\n @default(16) 'num_columns': @range[1, 64] u64,\n @default(1) 'bytes_per_cell': @range[1, 8] u64,\n}\n")}, {str8_lit_comp("bitmap"), str8_lit_comp("x:\n{\n @order(0) 'w': u64,\n @order(1) 'h': u64,\n 'fmt': tex2dformat,\n}\n")}, {str8_lit_comp("geo3d"), str8_lit_comp("x:\n{\n 'count': code_string,\n 'vtx': code_string,\n 'vtx_size': code_string,\n 'yaw': @range[0, 1] f32,\n 'pitch': @range[-0.5, 0] f32,\n 'zoom': @range[0, 100] f32,\n}\n")}, {str8_lit_comp("target"), str8_lit_comp("@commands(enable_cfg, launch_and_run, launch_and_step_into, remove_cfg)\n@collection_commands(add_target)\nx:\n{\n 'label': code_string,\n 'executable': path,\n 'arguments': string,\n 'working_directory': path,\n 'entry_point': code_string,\n 'stdout_path': path,\n 'stderr_path': path,\n 'stdin_path': path,\n 'environment': query,\n 'debug_subprocesses': bool,\n @no_expand @default(0) 'enabled': bool,\n}\n")}, diff --git a/src/raddbg/raddbg.mdesk b/src/raddbg/raddbg.mdesk index 3820156f..966e7bb7 100644 --- a/src/raddbg/raddbg.mdesk +++ b/src/raddbg/raddbg.mdesk @@ -205,8 +205,8 @@ RD_VocabTable: x: { 'size': code_string, - @default(16) 'num_columns': @range[1, 256] u64, - @default(1) 'bytes_per_cell': @range[1, 16] u64, + @default(16) 'num_columns': @range[1, 64] u64, + @default(1) 'bytes_per_cell': @range[1, 8] u64, } ``` } diff --git a/src/raddbg/raddbg_eval.c b/src/raddbg/raddbg_eval.c index 521f35fc..bc90f40d 100644 --- a/src/raddbg/raddbg_eval.c +++ b/src/raddbg/raddbg_eval.c @@ -367,15 +367,36 @@ E_TYPE_ACCESS_FUNCTION_DEF(schema) //- rjf: catchall cases else if(str8_match(child_schema->first->string, str8_lit("u64"), 0)) { + Temp scratch = scratch_begin(&arena, 1); child_type_key = e_type_key_basic(E_TypeKind_U64); + E_Expr *expr = e_parse_expr_from_text(scratch.arena, child->first->string).exprs.first; + if(expr->kind != E_ExprKind_LeafU64) + { + child_type_key = e_type_key_cons(.kind = E_TypeKind_MetaExpr, .name = child->first->string, .direct_key = child_type_key); + } + scratch_end(scratch); } else if(str8_match(child_schema->first->string, str8_lit("f32"), 0)) { + Temp scratch = scratch_begin(&arena, 1); child_type_key = e_type_key_basic(E_TypeKind_F32); + E_Expr *expr = e_parse_expr_from_text(scratch.arena, child->first->string).exprs.first; + if(expr->kind != E_ExprKind_LeafF32 && expr->kind != E_ExprKind_LeafF64) + { + child_type_key = e_type_key_cons(.kind = E_TypeKind_MetaExpr, .name = child->first->string, .direct_key = child_type_key); + } + scratch_end(scratch); } else if(str8_match(child_schema->first->string, str8_lit("bool"), 0)) { + Temp scratch = scratch_begin(&arena, 1); child_type_key = e_type_key_basic(E_TypeKind_Bool); + E_Expr *expr = e_parse_expr_from_text(scratch.arena, child->first->string).exprs.first; + if(expr->kind != E_ExprKind_LeafU64) + { + child_type_key = e_type_key_cons(.kind = E_TypeKind_MetaExpr, .name = child->first->string, .direct_key = child_type_key); + } + scratch_end(scratch); } else if(str8_match(child_schema->first->string, str8_lit("vaddr_range"), 0)) {