diff --git a/src/eval/eval_parse.c b/src/eval/eval_parse.c index 87f57ade..3b32b756 100644 --- a/src/eval/eval_parse.c +++ b/src/eval/eval_parse.c @@ -2065,7 +2065,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to else { E_TokenArray idx_expr_parse_tokens = e_token_array_make_first_opl(it, it_opl); - E_Parse arg_parse = e_parse_expr_from_text_tokens__prec(arena, text, tokens, e_max_precedence); + E_Parse arg_parse = e_parse_expr_from_text_tokens__prec(arena, text, &idx_expr_parse_tokens, e_max_precedence); e_msg_list_concat_in_place(&result.msgs, &arg_parse.msgs); if(arg_parse.expr != &e_expr_nil) { diff --git a/src/eval_visualization/eval_visualization_core.c b/src/eval_visualization/eval_visualization_core.c index 122d14d1..fd4598a1 100644 --- a/src/eval_visualization/eval_visualization_core.c +++ b/src/eval_visualization/eval_visualization_core.c @@ -504,6 +504,12 @@ ev_block_tree_from_expr(Arena *arena, EV_View *view, String8 filter, String8 str // rjf: unpack expr E_IRTreeAndType expr_irtree = e_irtree_and_type_from_expr(scratch.arena, t->expr); + // rjf: skip if type info disallows expansion + if(!ev_type_key_and_mode_is_expandable(expr_irtree.type_key, expr_irtree.mode)) + { + continue; + } + // rjf: get expr's lookup rule E_LookupRuleTagPair lookup_rule_and_tag = e_lookup_rule_tag_pair_from_expr_irtree(t->expr, &expr_irtree); E_LookupRule *lookup_rule = lookup_rule_and_tag.rule; @@ -631,6 +637,14 @@ ev_block_tree_from_expr(Arena *arena, EV_View *view, String8 filter, String8 str if(child_expr != &e_expr_nil) { EV_Key child_key = child_keys[idx]; + String8 tag_expr = push_str8_copy(arena, ev_view_rule_from_key(view, child_key)); + E_TokenArray tag_expr_tokens = e_token_array_from_text(scratch.arena, tag_expr); + E_Parse tag_expr_parse = e_parse_expr_from_text_tokens(arena, tag_expr, &tag_expr_tokens); + for(E_Expr *expr = tag_expr_parse.expr, *next = &e_expr_nil; expr != &e_expr_nil; expr = next) + { + next = expr->next; + e_expr_push_tag(child_expr, expr); + } Task *task = push_array(scratch.arena, Task, 1); SLLQueuePush(first_task, last_task, task); task->parent_block = expansion_block; diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index dcc76c74..a2a1ed04 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -12342,6 +12342,7 @@ rd_frame(void) expr->space = space; expr->mode = E_Mode_Offset; expr->type_key = e_string2typekey_map_lookup(rd_state->meta_name2type_map, name); + e_string2expr_map_insert(scratch.arena, ctx->macro_map, push_str8f(scratch.arena, "$%I64u", cfg->id), expr); if(exe.size != 0) { e_string2expr_map_insert(scratch.arena, ctx->macro_map, str8_skip_last_slash(exe), expr); diff --git a/src/raddbg/raddbg_views.c b/src/raddbg/raddbg_views.c index af967269..08b06b69 100644 --- a/src/raddbg/raddbg_views.c +++ b/src/raddbg/raddbg_views.c @@ -1581,6 +1581,11 @@ rd_watch_view_build(RD_WatchViewState *ewv, Rng2F32 rect) ev_key_set_expansion(eval_view, ev_key_root(), ev_key_make(ev_hash_from_key(ev_key_root()), 1), 1); block_tree = ev_block_tree_from_string(scratch.arena, eval_view, filter, expr); block_ranges = ev_block_range_list_from_tree(scratch.arena, &block_tree); + if(implicit_root && block_ranges.first != 0) + { + block_ranges.count -= 1; + block_ranges.first = block_ranges.first->next; + } } ////////////////////////// @@ -1669,7 +1674,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, Rng2F32 rect) RD_WatchRowInfo row_info = rd_watch_row_info_from_row(scratch.arena, row); cursor_x_range = r1s64(0, (S64)row_info.cells.count-1); } - cursor_tbl_range = r2s64(v2s64(cursor_x_range.min, 0), v2s64(cursor_x_range.max, block_tree.total_item_count)); + cursor_tbl_range = r2s64(v2s64(cursor_x_range.min, 0), v2s64(cursor_x_range.max, block_tree.total_item_count - implicit_root)); // rjf: clamp x positions of cursor/mark tbl for EachEnumVal(Axis2, axis) @@ -1761,7 +1766,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, Rng2F32 rect) EV_WindowedRowList rows = ev_rows_from_num_range(scratch.arena, eval_view, filter, &block_ranges, r1u64(selection_tbl.min.y, selection_tbl.max.y+1)); EV_WindowedRowNode *row_node = rows.first; B32 any_edits_started = 0; - for(S64 y = selection_tbl.min.y; y <= selection_tbl.max.y; y += 1, row_node = row_node->next) + for(S64 y = selection_tbl.min.y; row_node != 0 && y <= selection_tbl.max.y; y += 1, row_node = row_node->next) { EV_Row *row = &row_node->row; RD_WatchRowInfo row_info = rd_watch_row_info_from_row(scratch.arena, row); @@ -1773,7 +1778,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, Rng2F32 rect) continue; } RD_WatchRowCellInfo cell_info = rd_info_from_watch_row_cell(scratch.arena, row, string_flags, &row_info, cell, ui_top_font(), ui_top_font_size(), row_string_max_size_px); - if(cell_info.can_edit) + if(!ev_key_match(ev_key_root(), row->block->key) && cell_info.can_edit) { any_edits_started = 1; String8 string = cell_info.string; @@ -1876,7 +1881,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, Rng2F32 rect) taken = 1; EV_WindowedRowList rows = ev_rows_from_num_range(scratch.arena, eval_view, filter, &block_ranges, r1u64(selection_tbl.min.y, selection_tbl.max.y+1)); EV_WindowedRowNode *row_node = rows.first; - for(S64 y = selection_tbl.min.y; y <= selection_tbl.max.y; y += 1, row_node = row_node->next) + for(S64 y = selection_tbl.min.y; row_node != 0 && y <= selection_tbl.max.y; y += 1, row_node = row_node->next) { EV_Row *row = &row_node->row; RD_WatchRowInfo row_info = rd_watch_row_info_from_row(scratch.arena, row); @@ -1939,11 +1944,17 @@ rd_watch_view_build(RD_WatchViewState *ewv, Rng2F32 rect) case RD_WatchCellKind_Expr: { RD_Cfg *cfg = row_info.group_cfg; - if(cfg == &rd_nil_cfg && editing_complete) + if(cfg == &rd_nil_cfg && editing_complete && new_string.size != 0) { RD_CfgList all_cfgs = rd_cfg_top_level_list_from_string(scratch.arena, row_info.group_cfg_name); RD_Cfg *new_cfg_parent = rd_cfg_list_last(&all_cfgs)->parent; + if(new_cfg_parent == &rd_nil_cfg) + { + new_cfg_parent = rd_cfg_child_from_string(rd_state->root_cfg, str8_lit("project")); + } cfg = rd_cfg_new(new_cfg_parent, row_info.group_cfg_name); + state_dirty = 1; + snap_to_cursor = 1; } if(cfg != &rd_nil_cfg) { @@ -1959,6 +1970,16 @@ rd_watch_view_build(RD_WatchViewState *ewv, Rng2F32 rect) if(editing_complete) { ev_key_set_view_rule(eval_view, pt.key, new_string); + RD_Cfg *cfg = row_info.group_cfg; + if(cfg != &rd_nil_cfg && new_string.size != 0) + { + RD_Cfg *view_rule = rd_cfg_child_from_string_or_alloc(cfg, str8_lit("view_rule")); + rd_cfg_new(view_rule, new_string); + } + else if(cfg != &rd_nil_cfg && new_string.size == 0) + { + rd_cfg_release(rd_cfg_child_from_string(cfg, str8_lit("view_rule"))); + } }break; case RD_WatchCellKind_Eval: { @@ -2140,7 +2161,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, Rng2F32 rect) B32 next_cursor_set = 0; EV_WindowedRowList rows = ev_rows_from_num_range(scratch.arena, eval_view, filter, &block_ranges, r1u64(selection_tbl.min.y, selection_tbl.max.y+1)); EV_WindowedRowNode *row_node = rows.first; - for(S64 y = selection_tbl.min.y; y <= selection_tbl.max.y; y += 1, row_node = row_node->next) + for(S64 y = selection_tbl.min.y; row_node != 0 && y <= selection_tbl.max.y; y += 1, row_node = row_node->next) { EV_Row *row = &row_node->row; RD_WatchRowInfo row_info = rd_watch_row_info_from_row(scratch.arena, row); @@ -2152,50 +2173,52 @@ rd_watch_view_build(RD_WatchViewState *ewv, Rng2F32 rect) continue; } RD_WatchPt pt = {row->block->key, row->key, rd_id_from_watch_cell(cell)}; -#if 0 // TODO(rjf): @cfg - if(tbl.y != 0 && (col->kind == RD_WatchViewColumnKind_Expr || row_kind == RD_WatchViewRowKind_PrettyEntityControls) && - row_info.collection_entity_kind != RD_EntityKind_Nil) + switch(cell->kind) { - RD_Entity *entity = row_info.collection_entity; - if(!rd_entity_is_nil(entity)) + default:{}break; + case RD_WatchCellKind_Expr: { - rd_entity_list_push(scratch.arena, &entities_to_remove, entity); - U64 deleted_id = row->key.child_id; - U64 deleted_num = row->block->expand_view_rule_info->expr_expand_num_from_id(deleted_id, row->block->expand_view_rule_info_user_data); - if(deleted_num != 0) + RD_Cfg *cfg = row_info.group_cfg; + if(cfg != &rd_nil_cfg) { - U64 fallback_id_next = row->block->expand_view_rule_info->expr_expand_id_from_num(deleted_num+1, row->block->expand_view_rule_info_user_data); - U64 fallback_id_prev = row->block->expand_view_rule_info->expr_expand_id_from_num(deleted_num-1, row->block->expand_view_rule_info_user_data); - EV_Key parent_key = row->block->key; - EV_Key key = ev_key_make(row->key.parent_hash, fallback_id_next ? fallback_id_next : fallback_id_prev); - if(key.child_id == 0) + rd_cfg_list_push(scratch.arena, &cfgs_to_remove, cfg); + U64 deleted_num = ev_num_from_key(&block_ranges, row->key); + if(deleted_num != 0) { - key = row->block->key; - parent_key = row->block->parent->key; + EV_Key parent_key = row->block->parent->key; + EV_Key key = row->block->key; + EV_Key fallback_key_prev = ev_key_from_num(&block_ranges, deleted_num-1); + EV_Key fallback_key_next = ev_key_from_num(&block_ranges, deleted_num+1); + if(fallback_key_next.child_id != 0) + { + parent_key = row->block->key; + key = fallback_key_next; + } + else if(fallback_key_prev.child_id != 0) + { + parent_key = row->block->key; + key = fallback_key_prev; + } + RD_WatchPt new_pt = {parent_key, key, pt.cell_id}; + next_cursor_pt = new_pt; + next_cursor_set = 1; } - RD_WatchPt new_pt = {parent_key, key, 0}; - next_cursor_pt = new_pt; - next_cursor_set = 1; } - } - } - else if(tbl.y != 0 && col->kind == RD_WatchViewColumnKind_ViewRule && row_kind == RD_WatchViewRowKind_Normal) - { - if(row_info.collection_entity_kind != RD_EntityKind_Nil) + }break; + case RD_WatchCellKind_Tag: { - RD_Entity *entity = row_info.collection_entity; - RD_Entity *view_rule = rd_entity_child_from_kind(entity, RD_EntityKind_ViewRule); - rd_entity_mark_for_deletion(view_rule); - } - ev_key_set_view_rule(eval_view, row->key, str8_zero()); + if(row_info.group_cfg != &rd_nil_cfg) + { + rd_cfg_release(rd_cfg_child_from_string(row_info.group_cfg, str8_lit("view_rule"))); + } + ev_key_set_view_rule(eval_view, row->key, str8_zero()); + }break; + case RD_WatchCellKind_Eval: + { + RD_WatchRowCellInfo cell_info = rd_info_from_watch_row_cell(scratch.arena, row, string_flags, &row_info, cell, ui_top_font(), ui_top_font_size(), row_string_max_size_px); + rd_commit_eval_value_string(cell_info.eval, str8_zero(), 0); + }break; } - else if(tbl.y != 0 && (col->kind == RD_WatchViewColumnKind_Value || col->kind == RD_WatchViewColumnKind_Member) && row_kind == RD_WatchViewRowKind_Normal) - { - E_Expr *expr = rd_expr_from_watch_view_row_column(scratch.arena, row, col); - E_Eval dst_eval = e_eval_from_expr(scratch.arena, expr); - rd_commit_eval_value_string(dst_eval, str8_zero(), 0); - } -#endif } } for(RD_CfgNode *n = cfgs_to_remove.first; n != 0; n = n->next) diff --git a/src/raddbg/raddbg_widgets.c b/src/raddbg/raddbg_widgets.c index c8e90106..8240b5d6 100644 --- a/src/raddbg/raddbg_widgets.c +++ b/src/raddbg/raddbg_widgets.c @@ -1014,7 +1014,8 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe // rjf: bp hovering if(ui_hovering(bp_sig) && !rd_drag_is_active()) { - RD_RegsScope(.cfg = bp->id) rd_set_hover_regs(RD_RegSlot_Cfg); + rd_set_hover_eval(v2f32(bp_box->rect.x0, bp_box->rect.y1-2.f), str8_zero(), txt_pt(0, 0), 0, push_str8f(scratch.arena, "$%I64u", bp->id)); + // RD_RegsScope(.cfg = bp->id) rd_set_hover_regs(RD_RegSlot_Cfg); } // rjf: shift+click => enable breakpoint