eliminate dependence on 'command parameter slots'

This commit is contained in:
Ryan Fleury
2024-08-28 15:34:46 -07:00
parent c60809f02b
commit 818c5a9160
5 changed files with 14 additions and 15 deletions
+1 -1
View File
@@ -123,7 +123,7 @@ D_CoreCmdTable: // | | | |
{Exit 1 1 Null Nil 0 0 0 0 0 0 X "exit" "Exit" "Exits the debugger." "quit,close,abort" } {Exit 1 1 Null Nil 0 0 0 0 0 0 X "exit" "Exit" "Exits the debugger." "quit,close,abort" }
//- rjf: command runner //- rjf: command runner
{RunCommand 1 1 CmdSpec Nil 0 0 0 0 0 0 Null "run_command" "Run Command" "Runs a command from the command palette." "help,cmd" } {RunCommand 1 1 CmdSpec Nil 0 0 0 0 0 1 Null "run_command" "Run Command" "Runs a command from the command palette." "help,cmd" }
//- rjf: notifications //- rjf: notifications
{Error 0 1 Null Nil 0 0 0 0 0 0 Null "error" "Error" "Notifies of an error." "" } {Error 0 1 Null Nil 0 0 0 0 0 0 Null "error" "Error" "Notifies of an error." "" }
+2 -4
View File
@@ -6831,12 +6831,10 @@ d_begin_frame(Arena *arena, D_CmdList *cmds, F32 dt)
case D_CmdKind_RunCommand: case D_CmdKind_RunCommand:
{ {
D_CmdSpec *spec = params.cmd_spec; D_CmdSpec *spec = params.cmd_spec;
if(spec != cmd->spec) if(spec != cmd->spec && !d_cmd_spec_is_nil(spec))
{ {
d_cmd_spec_counter_inc(spec); d_cmd_spec_counter_inc(spec);
if(!(spec->info.query.flags & D_CmdQueryFlag_Required) && if(!(spec->info.query.flags & D_CmdQueryFlag_Required))
(spec->info.query.slot == D_CmdParamSlot_Null ||
d_cmd_params_has_slot(&params, spec->info.query.slot)))
{ {
d_cmd_list_push(arena, cmds, &params, spec); d_cmd_list_push(arena, cmds, &params, spec);
} }
+1 -1
View File
@@ -260,7 +260,7 @@ D_CmdSpecInfo d_core_cmd_kind_spec_info_table[221] =
{ {
{ str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (D_CmdSpecFlag_ListInUI*0)|(D_CmdSpecFlag_ListInIPCDocs*0), {D_CmdParamSlot_Null, D_EntityKind_Nil, (D_CmdQueryFlag_AllowFiles*0)|(D_CmdQueryFlag_AllowFolders*0)|(D_CmdQueryFlag_CodeInput*0)|(D_CmdQueryFlag_KeepOldInput*0)|(D_CmdQueryFlag_SelectOldInput*0)|(D_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, { str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp(""), (D_CmdSpecFlag_ListInUI*0)|(D_CmdSpecFlag_ListInIPCDocs*0), {D_CmdParamSlot_Null, D_EntityKind_Nil, (D_CmdQueryFlag_AllowFiles*0)|(D_CmdQueryFlag_AllowFolders*0)|(D_CmdQueryFlag_CodeInput*0)|(D_CmdQueryFlag_KeepOldInput*0)|(D_CmdQueryFlag_SelectOldInput*0)|(D_CmdQueryFlag_Required*0)}, DF_IconKind_Null},
{ str8_lit_comp("exit"), str8_lit_comp("Exits the debugger."), str8_lit_comp("quit,close,abort"), str8_lit_comp("Exit"), (D_CmdSpecFlag_ListInUI*1)|(D_CmdSpecFlag_ListInIPCDocs*1), {D_CmdParamSlot_Null, D_EntityKind_Nil, (D_CmdQueryFlag_AllowFiles*0)|(D_CmdQueryFlag_AllowFolders*0)|(D_CmdQueryFlag_CodeInput*0)|(D_CmdQueryFlag_KeepOldInput*0)|(D_CmdQueryFlag_SelectOldInput*0)|(D_CmdQueryFlag_Required*0)}, DF_IconKind_X}, { str8_lit_comp("exit"), str8_lit_comp("Exits the debugger."), str8_lit_comp("quit,close,abort"), str8_lit_comp("Exit"), (D_CmdSpecFlag_ListInUI*1)|(D_CmdSpecFlag_ListInIPCDocs*1), {D_CmdParamSlot_Null, D_EntityKind_Nil, (D_CmdQueryFlag_AllowFiles*0)|(D_CmdQueryFlag_AllowFolders*0)|(D_CmdQueryFlag_CodeInput*0)|(D_CmdQueryFlag_KeepOldInput*0)|(D_CmdQueryFlag_SelectOldInput*0)|(D_CmdQueryFlag_Required*0)}, DF_IconKind_X},
{ str8_lit_comp("run_command"), str8_lit_comp("Runs a command from the command palette."), str8_lit_comp("help,cmd"), str8_lit_comp("Run Command"), (D_CmdSpecFlag_ListInUI*1)|(D_CmdSpecFlag_ListInIPCDocs*1), {D_CmdParamSlot_CmdSpec, D_EntityKind_Nil, (D_CmdQueryFlag_AllowFiles*0)|(D_CmdQueryFlag_AllowFolders*0)|(D_CmdQueryFlag_CodeInput*0)|(D_CmdQueryFlag_KeepOldInput*0)|(D_CmdQueryFlag_SelectOldInput*0)|(D_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, { str8_lit_comp("run_command"), str8_lit_comp("Runs a command from the command palette."), str8_lit_comp("help,cmd"), str8_lit_comp("Run Command"), (D_CmdSpecFlag_ListInUI*1)|(D_CmdSpecFlag_ListInIPCDocs*1), {D_CmdParamSlot_CmdSpec, D_EntityKind_Nil, (D_CmdQueryFlag_AllowFiles*0)|(D_CmdQueryFlag_AllowFolders*0)|(D_CmdQueryFlag_CodeInput*0)|(D_CmdQueryFlag_KeepOldInput*0)|(D_CmdQueryFlag_SelectOldInput*0)|(D_CmdQueryFlag_Required*1)}, DF_IconKind_Null},
{ str8_lit_comp("error"), str8_lit_comp("Notifies of an error."), str8_lit_comp(""), str8_lit_comp("Error"), (D_CmdSpecFlag_ListInUI*0)|(D_CmdSpecFlag_ListInIPCDocs*1), {D_CmdParamSlot_Null, D_EntityKind_Nil, (D_CmdQueryFlag_AllowFiles*0)|(D_CmdQueryFlag_AllowFolders*0)|(D_CmdQueryFlag_CodeInput*0)|(D_CmdQueryFlag_KeepOldInput*0)|(D_CmdQueryFlag_SelectOldInput*0)|(D_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, { str8_lit_comp("error"), str8_lit_comp("Notifies of an error."), str8_lit_comp(""), str8_lit_comp("Error"), (D_CmdSpecFlag_ListInUI*0)|(D_CmdSpecFlag_ListInIPCDocs*1), {D_CmdParamSlot_Null, D_EntityKind_Nil, (D_CmdQueryFlag_AllowFiles*0)|(D_CmdQueryFlag_AllowFolders*0)|(D_CmdQueryFlag_CodeInput*0)|(D_CmdQueryFlag_KeepOldInput*0)|(D_CmdQueryFlag_SelectOldInput*0)|(D_CmdQueryFlag_Required*0)}, DF_IconKind_Null},
{ str8_lit_comp("os_event"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("OS Event"), (D_CmdSpecFlag_ListInUI*0)|(D_CmdSpecFlag_ListInIPCDocs*0), {D_CmdParamSlot_Null, D_EntityKind_Nil, (D_CmdQueryFlag_AllowFiles*0)|(D_CmdQueryFlag_AllowFolders*0)|(D_CmdQueryFlag_CodeInput*0)|(D_CmdQueryFlag_KeepOldInput*0)|(D_CmdQueryFlag_SelectOldInput*0)|(D_CmdQueryFlag_Required*0)}, DF_IconKind_Null}, { str8_lit_comp("os_event"), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("OS Event"), (D_CmdSpecFlag_ListInUI*0)|(D_CmdSpecFlag_ListInIPCDocs*0), {D_CmdParamSlot_Null, D_EntityKind_Nil, (D_CmdQueryFlag_AllowFiles*0)|(D_CmdQueryFlag_AllowFolders*0)|(D_CmdQueryFlag_CodeInput*0)|(D_CmdQueryFlag_KeepOldInput*0)|(D_CmdQueryFlag_SelectOldInput*0)|(D_CmdQueryFlag_Required*0)}, DF_IconKind_Null},
{ str8_lit_comp("launch_and_run"), str8_lit_comp("Starts debugging a new instance of a target, then runs."), str8_lit_comp("launch,start,run,target"), str8_lit_comp("Launch and Run"), (D_CmdSpecFlag_ListInUI*1)|(D_CmdSpecFlag_ListInIPCDocs*1), {D_CmdParamSlot_EntityList, D_EntityKind_Target, (D_CmdQueryFlag_AllowFiles*0)|(D_CmdQueryFlag_AllowFolders*0)|(D_CmdQueryFlag_CodeInput*0)|(D_CmdQueryFlag_KeepOldInput*0)|(D_CmdQueryFlag_SelectOldInput*0)|(D_CmdQueryFlag_Required*1)}, DF_IconKind_Play}, { str8_lit_comp("launch_and_run"), str8_lit_comp("Starts debugging a new instance of a target, then runs."), str8_lit_comp("launch,start,run,target"), str8_lit_comp("Launch and Run"), (D_CmdSpecFlag_ListInUI*1)|(D_CmdSpecFlag_ListInIPCDocs*1), {D_CmdParamSlot_EntityList, D_EntityKind_Target, (D_CmdQueryFlag_AllowFiles*0)|(D_CmdQueryFlag_AllowFolders*0)|(D_CmdQueryFlag_CodeInput*0)|(D_CmdQueryFlag_KeepOldInput*0)|(D_CmdQueryFlag_SelectOldInput*0)|(D_CmdQueryFlag_Required*1)}, DF_IconKind_Play},
+9 -9
View File
@@ -1365,18 +1365,17 @@ df_window_update_and_render(Arena *arena, DF_Window *ws, D_CmdList *cmds)
D_CmdSpec *spec = params.cmd_spec; D_CmdSpec *spec = params.cmd_spec;
// rjf: command simply executes - just no-op in this layer // rjf: command simply executes - just no-op in this layer
if(!(spec->info.query.flags & D_CmdQueryFlag_Required) && if(!d_cmd_spec_is_nil(spec) && !(spec->info.query.flags & D_CmdQueryFlag_Required))
!d_cmd_spec_is_nil(spec) &&
(spec->info.query.slot == D_CmdParamSlot_Null || d_cmd_params_has_slot(&params, spec->info.query.slot)))
{ {
} }
// rjf: command is missing arguments -> prep query // rjf: command has required query -> prep query
else else
{ {
arena_clear(ws->query_cmd_arena); arena_clear(ws->query_cmd_arena);
ws->query_cmd_spec = d_cmd_spec_is_nil(spec) ? cmd->spec : spec; ws->query_cmd_spec = d_cmd_spec_is_nil(spec) ? cmd->spec : spec;
ws->query_cmd_params = df_cmd_params_copy(ws->query_cmd_arena, &params); ws->query_cmd_params = df_cmd_params_copy(ws->query_cmd_arena, &params);
MemoryZeroArray(ws->query_cmd_params_mask);
ws->query_view_selected = 1; ws->query_view_selected = 1;
} }
}break; }break;
@@ -3384,22 +3383,22 @@ df_window_update_and_render(Arena *arena, DF_Window *ws, D_CmdList *cmds)
//- rjf: query completion //- rjf: query completion
case D_CmdKind_CompleteQuery: case D_CmdKind_CompleteQuery:
{ {
D_CmdParamSlot slot = ws->query_cmd_spec->info.query.slot;
// rjf: compound command parameters // rjf: compound command parameters
if(ws->query_cmd_spec->info.query.slot != D_CmdParamSlot_Null && if(slot != D_CmdParamSlot_Null && !(ws->query_cmd_params_mask[slot/64] & (1ull<<(slot%64))))
d_cmd_params_has_slot(&params, ws->query_cmd_spec->info.query.slot))
{ {
D_CmdParams params_copy = df_cmd_params_copy(ws->query_cmd_arena, &params); D_CmdParams params_copy = df_cmd_params_copy(ws->query_cmd_arena, &params);
Rng1U64 offset_range_in_params = d_cmd_param_slot_range_table[ws->query_cmd_spec->info.query.slot]; Rng1U64 offset_range_in_params = d_cmd_param_slot_range_table[ws->query_cmd_spec->info.query.slot];
MemoryCopy((U8 *)(&ws->query_cmd_params) + offset_range_in_params.min, MemoryCopy((U8 *)(&ws->query_cmd_params) + offset_range_in_params.min,
(U8 *)(&params_copy) + offset_range_in_params.min, (U8 *)(&params_copy) + offset_range_in_params.min,
dim_1u64(offset_range_in_params)); dim_1u64(offset_range_in_params));
d_cmd_params_mark_slot(&ws->query_cmd_params, ws->query_cmd_spec->info.query.slot); ws->query_cmd_params_mask[slot/64] |= (1ull<<(slot%64));
} }
// rjf: determine if command is ready to run // rjf: determine if command is ready to run
B32 command_ready = 1; B32 command_ready = 1;
if(ws->query_cmd_spec->info.query.slot != D_CmdParamSlot_Null && if(slot != D_CmdParamSlot_Null && !(ws->query_cmd_params_mask[slot/64] & (1ull<<(slot%64))))
!d_cmd_params_has_slot(&ws->query_cmd_params, ws->query_cmd_spec->info.query.slot))
{ {
command_ready = 0; command_ready = 0;
} }
@@ -3422,6 +3421,7 @@ df_window_update_and_render(Arena *arena, DF_Window *ws, D_CmdList *cmds)
arena_clear(ws->query_cmd_arena); arena_clear(ws->query_cmd_arena);
ws->query_cmd_spec = &d_nil_cmd_spec; ws->query_cmd_spec = &d_nil_cmd_spec;
MemoryZeroStruct(&ws->query_cmd_params); MemoryZeroStruct(&ws->query_cmd_params);
MemoryZeroArray(ws->query_cmd_params_mask);
for(DF_View *v = ws->query_view_stack_top, *next = 0; !df_view_is_nil(v); v = next) for(DF_View *v = ws->query_view_stack_top, *next = 0; !df_view_is_nil(v); v = next)
{ {
next = v->order_next; next = v->order_next;
+1
View File
@@ -632,6 +632,7 @@ struct DF_Window
// rjf: query view stack // rjf: query view stack
Arena *query_cmd_arena; Arena *query_cmd_arena;
D_CmdSpec *query_cmd_spec; D_CmdSpec *query_cmd_spec;
U64 query_cmd_params_mask[(D_CmdParamSlot_COUNT + 63) / 64];
D_CmdParams query_cmd_params; D_CmdParams query_cmd_params;
DF_View *query_view_stack_top; DF_View *query_view_stack_top;
B32 query_view_selected; B32 query_view_selected;