diff --git a/src/df/core/df_core.c b/src/df/core/df_core.c index 052865b5..cee0ec44 100644 --- a/src/df/core/df_core.c +++ b/src/df/core/df_core.c @@ -5026,6 +5026,19 @@ df_eval_viz_row_list_push_new(Arena *arena, DF_EvalView *eval_view, DF_EvalVizWi row->size_in_rows = 1; row->string = block->string; row->expr = expr; + if(row->expr->kind == E_ExprKind_MemberAccess) + { + Temp scratch = scratch_begin(&arena, 1); + E_IRTreeAndType irtree = e_irtree_and_type_from_expr(scratch.arena, row->expr->first); + E_TypeKey type = irtree.type_key; + E_MemberArray data_members = e_type_data_members_from_key(scratch.arena, type); + E_Member *member = e_type_member_from_array_name(&data_members, row->expr->last->string); + if(member != 0) + { + row->member = e_type_member_copy(arena, member); + } + scratch_end(scratch); + } // rjf: fill view-rule-derived info { diff --git a/src/df/gfx/df_gfx.c b/src/df/gfx/df_gfx.c index 84264d92..b9d5ebf5 100644 --- a/src/df/gfx/df_gfx.c +++ b/src/df/gfx/df_gfx.c @@ -6178,8 +6178,8 @@ df_window_update_and_render(Arena *arena, DF_Window *ws, DF_CmdList *cmds) DF_EvalVizRow *row = viz_rows.first; E_Eval row_eval = e_eval_from_expr(scratch.arena, row->expr); String8 row_expr_string = df_expr_string_from_viz_row(scratch.arena, row); - String8 row_display_value = df_value_string_from_eval(scratch.arena, DF_EvalVizStringFlag_ReadOnlyDisplayRules, default_radix, ui_top_font(), ui_top_font_size(), 500.f, row_eval, row->cfg_table); - expr_column_width_px = f_dim_from_tag_size_string(ui_top_font(), ui_top_font_size(), 0, 0, row_expr_string).x + ui_top_font_size()*2.5f; + String8 row_display_value = df_value_string_from_eval(scratch.arena, DF_EvalVizStringFlag_ReadOnlyDisplayRules, default_radix, ui_top_font(), ui_top_font_size(), 500.f, row_eval, row->member, row->cfg_table); + expr_column_width_px = f_dim_from_tag_size_string(ui_top_font(), ui_top_font_size(), 0, 0, row_expr_string).x + ui_top_font_size()*5.f; value_column_width_px = f_dim_from_tag_size_string(ui_top_font(), ui_top_font_size(), 0, 0, row_display_value).x + ui_top_font_size()*2.5f; F32 total_dim_px = (expr_column_width_px + value_column_width_px); width_px = Min(80.f*ui_top_font_size(), total_dim_px*1.5f); @@ -6226,8 +6226,8 @@ df_window_update_and_render(Arena *arena, DF_Window *ws, DF_CmdList *cmds) //- rjf: unpack row E_Eval row_eval = e_eval_from_expr(scratch.arena, row->expr); String8 row_expr_string = df_expr_string_from_viz_row(scratch.arena, row); - String8 row_edit_value = df_value_string_from_eval(scratch.arena, 0, default_radix, ui_top_font(), ui_top_font_size(), 500.f, row_eval, row->cfg_table); - String8 row_display_value = df_value_string_from_eval(scratch.arena, DF_EvalVizStringFlag_ReadOnlyDisplayRules, default_radix, ui_top_font(), ui_top_font_size(), 500.f, row_eval, row->cfg_table); + String8 row_edit_value = df_value_string_from_eval(scratch.arena, 0, default_radix, ui_top_font(), ui_top_font_size(), 500.f, row_eval, row->member, row->cfg_table); + String8 row_display_value = df_value_string_from_eval(scratch.arena, DF_EvalVizStringFlag_ReadOnlyDisplayRules, default_radix, ui_top_font(), ui_top_font_size(), 500.f, row_eval, row->member, row->cfg_table); B32 row_is_editable = df_type_key_is_editable(row_eval.type_key); B32 row_is_expandable = df_type_key_is_expandable(row_eval.type_key); @@ -8310,7 +8310,7 @@ df_window_update_and_render(Arena *arena, DF_Window *ws, DF_CmdList *cmds) //~ rjf: Eval Viz internal F32 -df_append_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags flags, U32 default_radix, F_Tag font, F32 font_size, F32 max_size, S32 depth, E_Eval eval, DF_CfgTable *cfg_table, String8List *out) +df_append_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags flags, U32 default_radix, F_Tag font, F32 font_size, F32 max_size, S32 depth, E_Eval eval, E_Member *member, DF_CfgTable *cfg_table, String8List *out) { ProfBeginFunction(); Temp scratch = scratch_begin(&arena, 1); @@ -8331,18 +8331,12 @@ df_append_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags flags, U32 B32 has_array = (df_cfg_val_from_string(cfg_table, str8_lit("array")) != &df_g_nil_cfg_val); //- rjf: member evaluations -> display member info - if(eval.mode == E_Mode_Null && !e_type_key_match(e_type_key_zero(), eval.type_key) && eval.expr->kind == E_ExprKind_MemberAccess) + if(eval.mode == E_Mode_Null && !e_type_key_match(e_type_key_zero(), eval.type_key) && member != 0) { - E_Eval lhs_eval = e_eval_from_expr(scratch.arena, eval.expr->first); - E_MemberArray lhs_members = e_type_data_members_from_key(scratch.arena, lhs_eval.type_key); - E_Member *member = e_type_member_from_array_name(&lhs_members, eval.expr->first->next->string); - if(member != 0) - { - U64 member_byte_size = e_type_byte_size_from_key(eval.type_key); - String8 offset_string = str8_from_u64(arena, member->off, radix, 0, 0); - String8 size_string = str8_from_u64(arena, member_byte_size, radix, 0, 0); - str8_list_pushf(arena, out, "member (%S offset, %S byte%s)", offset_string, size_string, member_byte_size == 1 ? "" : "s"); - } + U64 member_byte_size = e_type_byte_size_from_key(eval.type_key); + String8 offset_string = str8_from_u64(arena, member->off, radix, 0, 0); + String8 size_string = str8_from_u64(arena, member_byte_size, radix, 0, 0); + str8_list_pushf(arena, out, "member (%S offset, %S byte%s)", offset_string, size_string, member_byte_size == 1 ? "" : "s"); } //- rjf: type evaluations -> display type basic information @@ -8450,7 +8444,7 @@ df_append_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags flags, U32 { E_Expr *deref_expr = e_expr_ref_deref(scratch.arena, eval.expr); E_Eval deref_eval = e_eval_from_expr(scratch.arena, deref_expr); - space_taken += df_append_value_strings_from_eval(arena, flags, radix, font, font_size, max_size-space_taken, depth+1, deref_eval, cfg_table, out); + space_taken += df_append_value_strings_from_eval(arena, flags, radix, font, font_size, max_size-space_taken, depth+1, deref_eval, 0, cfg_table, out); } else { @@ -8559,7 +8553,7 @@ df_append_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags flags, U32 { E_Expr *element_expr = e_expr_ref_array_index(scratch.arena, eval.expr, idx); E_Eval element_eval = e_eval_from_expr(scratch.arena, element_expr); - space_taken += df_append_value_strings_from_eval(arena, flags, radix, font, font_size, max_size-space_taken, depth+1, element_eval, cfg_table, out); + space_taken += df_append_value_strings_from_eval(arena, flags, radix, font, font_size, max_size-space_taken, depth+1, element_eval, 0, cfg_table, out); if(idx+1 < array_count) { String8 comma = str8_lit(", "); @@ -8609,7 +8603,7 @@ df_append_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags flags, U32 E_Member *mem = &filtered_data_members.v[member_idx]; E_Expr *dot_expr = e_expr_ref_member_access(scratch.arena, eval.expr, mem->name); E_Eval dot_eval = e_eval_from_expr(scratch.arena, dot_expr); - space_taken += df_append_value_strings_from_eval(arena, flags, radix, font, font_size, max_size-space_taken, depth+1, dot_eval, cfg_table, out); + space_taken += df_append_value_strings_from_eval(arena, flags, radix, font, font_size, max_size-space_taken, depth+1, dot_eval, 0, cfg_table, out); if(member_idx+1 < filtered_data_members.count) { String8 comma = str8_lit(", "); @@ -8640,11 +8634,11 @@ df_append_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags flags, U32 } internal String8 -df_value_string_from_eval(Arena *arena, DF_EvalVizStringFlags flags, U32 default_radix, F_Tag font, F32 font_size, F32 max_size, E_Eval eval, DF_CfgTable *cfg_table) +df_value_string_from_eval(Arena *arena, DF_EvalVizStringFlags flags, U32 default_radix, F_Tag font, F32 font_size, F32 max_size, E_Eval eval, E_Member *member, DF_CfgTable *cfg_table) { Temp scratch = scratch_begin(&arena, 1); String8List strs = {0}; - df_append_value_strings_from_eval(scratch.arena, flags, default_radix, font, font_size, max_size, 0, eval, cfg_table, &strs); + df_append_value_strings_from_eval(scratch.arena, flags, default_radix, font, font_size, max_size, 0, eval, member, cfg_table, &strs); String8 result = str8_list_join(arena, &strs, 0); scratch_end(scratch); return result; @@ -11242,7 +11236,7 @@ df_code_slice(DF_Window *ws, DF_CodeSliceParams *params, TxtPt *cursor, TxtPt *m if(!e_type_key_match(e_type_key_zero(), eval.type_key)) { DF_CfgTable cfg_table = {0}; - eval_string = df_value_string_from_eval(scratch.arena, DF_EvalVizStringFlag_ReadOnlyDisplayRules, 10, params->font, params->font_size, params->font_size*60.f, eval, &cfg_table); + eval_string = df_value_string_from_eval(scratch.arena, DF_EvalVizStringFlag_ReadOnlyDisplayRules, 10, params->font, params->font_size, params->font_size*60.f, eval, 0, &cfg_table); } ui_spacer(ui_em(1.5f, 1.f)); ui_set_next_pref_width(ui_children_sum(1)); @@ -12282,6 +12276,7 @@ df_fancy_string_list_from_code_string(Arena *arena, F32 alpha, B32 indirection_s TXT_TokenArray tokens = txt_token_array_from_string__c_cpp(scratch.arena, 0, string); TXT_Token *tokens_opl = tokens.v+tokens.count; S32 indirection_counter = 0; + indirection_size_change = 0; for(TXT_Token *token = tokens.v; token < tokens_opl; token += 1) { DF_ThemeColor token_color = df_theme_color_from_txt_token_kind(token->kind); diff --git a/src/df/gfx/df_gfx.h b/src/df/gfx/df_gfx.h index a7decabe..fb9c984a 100644 --- a/src/df/gfx/df_gfx.h +++ b/src/df/gfx/df_gfx.h @@ -965,8 +965,8 @@ internal void df_window_update_and_render(Arena *arena, DF_Window *ws, DF_CmdLis //////////////////////////////// //~ rjf: Eval Viz -internal F32 df_append_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags flags, U32 default_radix, F_Tag font, F32 font_size, F32 max_size, S32 depth, E_Eval eval, DF_CfgTable *cfg_table, String8List *out); -internal String8 df_value_string_from_eval(Arena *arena, DF_EvalVizStringFlags flags, U32 default_radix, F_Tag font, F32 font_size, F32 max_size, E_Eval eval, DF_CfgTable *cfg_table); +internal F32 df_append_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags flags, U32 default_radix, F_Tag font, F32 font_size, F32 max_size, S32 depth, E_Eval eval, E_Member *member, DF_CfgTable *cfg_table, String8List *out); +internal String8 df_value_string_from_eval(Arena *arena, DF_EvalVizStringFlags flags, U32 default_radix, F_Tag font, F32 font_size, F32 max_size, E_Eval eval, E_Member *member, DF_CfgTable *cfg_table); //////////////////////////////// //~ rjf: Hover Eval diff --git a/src/df/gfx/df_views.c b/src/df/gfx/df_views.c index 7019545e..2e667de1 100644 --- a/src/df/gfx/df_views.c +++ b/src/df/gfx/df_views.c @@ -1256,7 +1256,7 @@ df_string_from_eval_viz_row_column(Arena *arena, DF_EvalView *ev, DF_EvalVizRow case DF_WatchViewColumnKind_Value: { E_Eval eval = e_eval_from_expr(arena, row->expr); - result = df_value_string_from_eval(arena, !editable * DF_EvalVizStringFlag_ReadOnlyDisplayRules, default_radix, font, font_size, max_size_px, eval, row->cfg_table); + result = df_value_string_from_eval(arena, !editable * DF_EvalVizStringFlag_ReadOnlyDisplayRules, default_radix, font, font_size, max_size_px, eval, row->member, row->cfg_table); }break; case DF_WatchViewColumnKind_Type: { @@ -1280,7 +1280,7 @@ df_string_from_eval_viz_row_column(Arena *arena, DF_EvalView *ev, DF_EvalVizRow { E_Expr *expr = e_expr_ref_member_access(arena, row->expr, str8(col->string_buffer, col->string_size)); E_Eval eval = e_eval_from_expr(arena, expr); - result = df_value_string_from_eval(arena, !editable * DF_EvalVizStringFlag_ReadOnlyDisplayRules, default_radix, font, font_size, max_size_px, eval, row->cfg_table); + result = df_value_string_from_eval(arena, !editable * DF_EvalVizStringFlag_ReadOnlyDisplayRules, default_radix, font, font_size, max_size_px, eval, row->member, row->cfg_table); }break; } return result; @@ -1815,7 +1815,7 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS for(U64 sub_expand_idx = 0; sub_expand_idx < sub_expand_keys_count; sub_expand_idx += 1) { FZY_Item *item = &items.v[sub_expand_item_idxs[sub_expand_idx]]; - E_Expr *child_expr = df_expr_from_eval_viz_block_index(scratch.arena, last_vb, item->idx); + E_Expr *child_expr = df_expr_from_eval_viz_block_index(scratch.arena, last_vb, sub_expand_item_idxs[sub_expand_idx]); // rjf: form split: truncate & complete last block; begin next block last_vb = df_eval_viz_block_split_and_continue(scratch.arena, &blocks, last_vb, sub_expand_item_idxs[sub_expand_idx]); @@ -2004,6 +2004,7 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS evt->flags & UI_EventFlag_Paste || (evt->kind == UI_EventKind_Press && evt->slot == UI_EventActionSlot_Edit)) && selection_tbl.min.x == selection_tbl.max.x && + (selection_tbl.min.y != 0 || selection_tbl.min.y != 0) && (selection_tbl.min.x != 0 || modifiable)) { Vec2S64 selection_dim = dim_2s64(selection_tbl); diff --git a/src/eval/eval_interpret.c b/src/eval/eval_interpret.c index 9ba59c31..1b44618e 100644 --- a/src/eval/eval_interpret.c +++ b/src/eval/eval_interpret.c @@ -769,6 +769,17 @@ e_interpret(String8 bytecode) goto done; } }break; + + case RDI_EvalOp_ValueRead: + { + U64 bytes_to_read = imm; + U64 offset = svals[0].u64; + if(offset + bytes_to_read <= sizeof(E_Value)) + { + E_Value src_val = svals[1]; + MemoryCopy(&nval.u512[0], (U8 *)(&src_val.u512[0]) + offset, bytes_to_read); + } + }break; } // rjf: push diff --git a/src/eval/eval_ir.c b/src/eval/eval_ir.c index 0cc6311d..ca937de9 100644 --- a/src/eval/eval_ir.c +++ b/src/eval/eval_ir.c @@ -418,7 +418,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) e_msg_list_concat_in_place(&result.msgs, &r.msgs); // rjf: bad conditions? -> error if applicable, exit - if(l.root->op == 0 || r.root->op == 0) + if(r.root->op == 0) { break; } @@ -444,31 +444,63 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) } // rjf: generate + E_IRNode *new_tree = &e_irnode_nil; { - // rjf: ops to compute the index - E_IRNode *index_tree = e_irtree_resolve_to_value(arena, r.space, r.mode, r.root, r_restype); - if(direct_type_size > 1) + switch(l.mode) { - E_IRNode *const_tree = e_irtree_const_u(arena, direct_type_size); - index_tree = e_irtree_binary_op_u(arena, RDI_EvalOp_Mul, index_tree, const_tree); + // rjf: null (types) -> just resolve to new type + case E_Mode_Null: + { + }break; + + // rjf: offsets -> read from base offset + default: + case E_Mode_Offset: + { + // rjf: ops to compute the offset + E_IRNode *offset_tree = e_irtree_resolve_to_value(arena, r.space, r.mode, r.root, r_restype); + if(direct_type_size > 1) + { + E_IRNode *const_tree = e_irtree_const_u(arena, direct_type_size); + offset_tree = e_irtree_binary_op_u(arena, RDI_EvalOp_Mul, offset_tree, const_tree); + } + + // rjf: ops to compute the base offset (resolve to value if addr-of-pointer) + E_IRNode *base_tree = l.root; + if(l_restype_kind == E_TypeKind_Ptr && l.mode != E_Mode_Value) + { + base_tree = e_irtree_resolve_to_value(arena, l.space, l.mode, base_tree, l_restype); + } + + // rjf: ops to compute the final address + new_tree = e_irtree_binary_op_u(arena, RDI_EvalOp_Add, offset_tree, base_tree); + }break; + + // rjf: values -> read from stack value + case E_Mode_Value: + { + // rjf: ops to compute the offset + E_IRNode *offset_tree = e_irtree_resolve_to_value(arena, r.space, r.mode, r.root, r_restype); + if(direct_type_size > 1) + { + E_IRNode *const_tree = e_irtree_const_u(arena, direct_type_size); + offset_tree = e_irtree_binary_op_u(arena, RDI_EvalOp_Mul, offset_tree, const_tree); + } + + // rjf: ops to push stack value, push offset, + read from stack value + new_tree = e_push_irnode(arena, RDI_EvalOp_ValueRead); + new_tree->u64 = direct_type_size; + e_irnode_push_child(new_tree, offset_tree); + e_irnode_push_child(new_tree, l.root); + }break; } - - // rjf: ops to compute the base address (resolve to value if addr-of-pointer) - E_IRNode *base_tree = l.root; - if(l_restype_kind == E_TypeKind_Ptr && l.mode != E_Mode_Value) - { - base_tree = e_irtree_resolve_to_value(arena, l.space, l.mode, base_tree, l_restype); - } - - // rjf: ops to compute the final address - E_IRNode *new_tree = e_irtree_binary_op_u(arena, RDI_EvalOp_Add, index_tree, base_tree); - - // rjf: fill - result.root = new_tree; - result.type_key = direct_type; - result.mode = E_Mode_Offset; - result.space = l.space; } + + // rjf: fill + result.root = new_tree; + result.type_key = direct_type; + result.mode = l.mode; + result.space = l.space; }break; //- rjf: member accesses @@ -522,11 +554,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) } // rjf: bad conditions? -> error if applicable, exit - if(l.root->op == 0) - { - break; - } - else if(e_type_key_match(e_type_key_zero(), check_type_key)) + if(e_type_key_match(e_type_key_zero(), check_type_key)) { break; } @@ -553,17 +581,20 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) // rjf: build tree E_IRNode *new_tree = l.root; E_Mode mode = l.mode; - if(l_restype_kind == E_TypeKind_Ptr || - l_restype_kind == E_TypeKind_LRef || - l_restype_kind == E_TypeKind_RRef) + if(l.root != &e_irnode_nil) { - new_tree = e_irtree_resolve_to_value(arena, l.space, l.mode, new_tree, l_restype); - mode = E_Mode_Offset; - } - if(r_off != 0) - { - E_IRNode *const_tree = e_irtree_const_u(arena, r_off); - new_tree = e_irtree_binary_op_u(arena, RDI_EvalOp_Add, new_tree, const_tree); + if(l_restype_kind == E_TypeKind_Ptr || + l_restype_kind == E_TypeKind_LRef || + l_restype_kind == E_TypeKind_RRef) + { + new_tree = e_irtree_resolve_to_value(arena, l.space, l.mode, new_tree, l_restype); + mode = E_Mode_Offset; + } + if(r_off != 0) + { + E_IRNode *const_tree = e_irtree_const_u(arena, r_off); + new_tree = e_irtree_binary_op_u(arena, RDI_EvalOp_Add, new_tree, const_tree); + } } // rjf: fill diff --git a/src/eval/eval_types.c b/src/eval/eval_types.c index 3a6a745d..38faefbc 100644 --- a/src/eval/eval_types.c +++ b/src/eval/eval_types.c @@ -1406,7 +1406,7 @@ e_type_data_members_from_key(Arena *arena, E_TypeKey key) padding_member->kind = E_MemberKind_Padding; padding_member->type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_U8), n->size); padding_member->off = n->off; - padding_member->name = str8_lit("padding"); + padding_member->name = push_str8f(arena, "[padding %I64u]", padding_idx); padding_idx += 1; } members = new_members; @@ -1422,7 +1422,8 @@ e_type_member_from_array_name(E_MemberArray *members, String8 name) E_Member *member = 0; for(U64 idx = 0; idx < members->count; idx += 1) { - if(members->v[idx].kind == E_MemberKind_DataField && + if((members->v[idx].kind == E_MemberKind_DataField || + members->v[idx].kind == E_MemberKind_Padding) && str8_match(members->v[idx].name, name, 0)) { member = &members->v[idx]; diff --git a/src/lib_rdi_format/rdi_format.c b/src/lib_rdi_format/rdi_format.c index 9b6163fe..34733dee 100644 --- a/src/lib_rdi_format/rdi_format.c +++ b/src/lib_rdi_format/rdi_format.c @@ -92,7 +92,7 @@ RDI_U8 rdi_section_is_required_table[37] = 0, }; -RDI_U8 rdi_eval_op_ctrlbits_table[46] = +RDI_U8 rdi_eval_op_ctrlbits_table[47] = { RDI_EVAL_CTRLBITS(0, 0, 0), RDI_EVAL_CTRLBITS(0, 0, 0), @@ -139,6 +139,7 @@ RDI_EVAL_CTRLBITS(2, 1, 1), RDI_EVAL_CTRLBITS(1, 0, 1), RDI_EVAL_CTRLBITS(0, 1, 0), RDI_EVAL_CTRLBITS(1, 0, 0), +RDI_EVAL_CTRLBITS(1, 2, 1), RDI_EVAL_CTRLBITS(0, 0, 0), }; diff --git a/src/lib_rdi_format/rdi_format.h b/src/lib_rdi_format/rdi_format.h index d47a0cad..0ece5986 100644 --- a/src/lib_rdi_format/rdi_format.h +++ b/src/lib_rdi_format/rdi_format.h @@ -482,7 +482,8 @@ RDI_EvalOp_Convert = 41, RDI_EvalOp_Pick = 42, RDI_EvalOp_Pop = 43, RDI_EvalOp_Insert = 44, -RDI_EvalOp_COUNT = 45, +RDI_EvalOp_ValueRead = 45, +RDI_EvalOp_COUNT = 46, } RDI_EvalOpEnum; typedef RDI_U8 RDI_EvalTypeGroup; @@ -886,6 +887,7 @@ X(Convert)\ X(Pick)\ X(Pop)\ X(Insert)\ +X(ValueRead)\ #define RDI_EvalTypeGroup_XList \ X(Other)\ @@ -1355,6 +1357,6 @@ RDI_PROC RDI_U8 *rdi_explanation_string_from_eval_conversion_kind(RDI_EvalConver extern RDI_U16 rdi_section_element_size_table[37]; extern RDI_U8 rdi_section_is_required_table[37]; -extern RDI_U8 rdi_eval_op_ctrlbits_table[46]; +extern RDI_U8 rdi_eval_op_ctrlbits_table[47]; #endif // RDI_FORMAT_H diff --git a/src/raddbg/raddbg.h b/src/raddbg/raddbg.h index 843fc4df..864a0ddd 100644 --- a/src/raddbg/raddbg.h +++ b/src/raddbg/raddbg.h @@ -5,7 +5,10 @@ //~ rjf: Frontend/UI Pass Tasks // // [x] fix HRESULTs -// [ ] fix escape char literals +// [x] fix escape char literals +// [x] eval: indexing into string literals +// [x] fix incorrectly consuming keyboard inputs, preventing fallback-to-filtering, when +// selecting null selection in watch views // // [ ] fix selecting hover eval, then hover eval disappearing, causing // busted focus, until a new hover eval is opened diff --git a/src/rdi_format/rdi_format.mdesk b/src/rdi_format/rdi_format.mdesk index 99822768..eeafb075 100644 --- a/src/rdi_format/rdi_format.mdesk +++ b/src/rdi_format/rdi_format.mdesk @@ -1275,7 +1275,8 @@ RDI_EvalOpTable: {Pick 42 1 0 1} {Pop 43 0 1 0} {Insert 44 1 0 0} - {COUNT 45 0 0 0} + {ValueRead 45 1 2 1} + {COUNT 46 0 0 0} } // NOTE(rjf): "ck" -> "conversion kind, when converted to type group", used in square matrix form