some lua fixes, some more conversions, and added step-over to the tracer
This commit is contained in:
parent
d8b763a18c
commit
a7a914ba4a
@ -21,7 +21,7 @@ procedure luaclass_addArrayPropertyToTable(L: PLua_State; metatable: integer; us
|
||||
|
||||
procedure luaclass_canAutoDestroy(L: PLua_State; metatable: integer; state: boolean);
|
||||
|
||||
function luaclass_getClassObject(L: PLua_state): pointer; inline;
|
||||
function luaclass_getClassObject(L: PLua_state): pointer; //inline;
|
||||
|
||||
procedure luaclass_newClass(L: PLua_State; o: TObject); overload;
|
||||
procedure luaclass_newClass(L: PLua_State; o: TObject; InitialAddMetaDataFunction: TAddMetaDataFunction); overload;
|
||||
@ -138,10 +138,31 @@ begin
|
||||
end;
|
||||
|
||||
|
||||
function luaclass_getClassObject(L: PLua_state): pointer; inline;
|
||||
function luaclass_getClassObject(L: PLua_state): pointer;// inline;
|
||||
//called by class functions. This is in case a 6.2 code executed the function manually
|
||||
var t: integer;
|
||||
u: pointer;
|
||||
begin
|
||||
result:=pointer(lua_touserdata(L, ifthen(lua_type(L, lua_upvalueindex(1))=LUA_TUSERDATA, lua_upvalueindex(1), 1))^);
|
||||
result:=nil;
|
||||
if lua_type(L, lua_upvalueindex(1))=LUA_TUSERDATA then
|
||||
begin
|
||||
u:=lua_touserdata(L, 1);
|
||||
result:=ppointer(u)^;
|
||||
end
|
||||
else
|
||||
if lua_gettop(L)>=1 then
|
||||
begin
|
||||
t:=lua_type(L, 1);
|
||||
if t in [LUA_TUSERDATA, LUA_TLIGHTUSERDATA] then
|
||||
begin
|
||||
u:=lua_touserdata(L, 1);
|
||||
if t=LUA_TUSERDATA then
|
||||
result:=ppointer(u)^
|
||||
else
|
||||
result:=u;
|
||||
end;
|
||||
|
||||
end;
|
||||
|
||||
if result=nil then
|
||||
begin
|
||||
|
@ -307,6 +307,7 @@ end;
|
||||
function control_getPopupMenu(L: PLua_State): integer; cdecl;
|
||||
var
|
||||
c: TControl;
|
||||
i: integer;
|
||||
begin
|
||||
c:=luaclass_getClassObject(L);
|
||||
luaclass_newClass(L, c.PopupMenu);
|
||||
|
@ -11,41 +11,33 @@ procedure initializeLuaMenu;
|
||||
|
||||
implementation
|
||||
|
||||
uses LuaCaller;
|
||||
|
||||
uses LuaCaller, LuaClass, LuaComponent;
|
||||
|
||||
function menu_getItems(L: PLua_State): integer; cdecl;
|
||||
var
|
||||
parameters: integer;
|
||||
menu: TMenu;
|
||||
begin
|
||||
result:=0;
|
||||
parameters:=lua_gettop(L);
|
||||
if parameters=1 then
|
||||
begin
|
||||
menu:=lua_touserdata(L,-1);
|
||||
lua_pop(L, parameters);
|
||||
|
||||
lua_pushlightuserdata(L, menu.Items);
|
||||
result:=1;
|
||||
|
||||
end else lua_pop(L, parameters);
|
||||
menu:=luaclass_getClassObject(L);
|
||||
luaclass_newClass(L, menu.Items);
|
||||
result:=1;
|
||||
end;
|
||||
|
||||
|
||||
|
||||
|
||||
function createMainMenu(L: Plua_State): integer; cdecl;
|
||||
var parameters: integer;
|
||||
f: TComponent;
|
||||
m: TMainMenu;
|
||||
begin
|
||||
result:=0;
|
||||
|
||||
parameters:=lua_gettop(L);
|
||||
if parameters=1 then
|
||||
begin
|
||||
f:=lua_touserdata(L, -1);
|
||||
lua_pop(L, lua_gettop(L));
|
||||
|
||||
f:=lua_ToCEUserData(L, 1);
|
||||
m:=TMainMenu.Create(f);
|
||||
lua_pushlightuserdata(L, m);
|
||||
luaclass_newClass(L, m);
|
||||
result:=1;
|
||||
end else lua_pop(L, lua_gettop(L));
|
||||
end;
|
||||
@ -59,11 +51,11 @@ begin
|
||||
parameters:=lua_gettop(L);
|
||||
if parameters=1 then
|
||||
begin
|
||||
f:=lua_touserdata(L, -1);
|
||||
f:=lua_ToCEUserData(L, -1);
|
||||
lua_pop(L, lua_gettop(L));
|
||||
|
||||
m:=TPopupMenu.Create(f);
|
||||
lua_pushlightuserdata(L, m);
|
||||
luaclass_newClass(L, m);
|
||||
result:=1;
|
||||
end else lua_pop(L, lua_gettop(L));
|
||||
end;
|
||||
@ -77,31 +69,23 @@ begin
|
||||
parameters:=lua_gettop(L);
|
||||
if parameters=1 then
|
||||
begin
|
||||
o:=lua_touserdata(L, -1);
|
||||
o:=lua_ToCEUserData(L, -1);
|
||||
lua_pop(L, lua_gettop(L));
|
||||
|
||||
mi:=TMenuItem.Create(o);
|
||||
lua_pushlightuserdata(L, mi);
|
||||
luaclass_newClass(L, mi);
|
||||
result:=1;
|
||||
end else lua_pop(L, lua_gettop(L));
|
||||
end;
|
||||
|
||||
|
||||
function menuItem_getCaption(L: PLua_State): integer; cdecl;
|
||||
var
|
||||
parameters: integer;
|
||||
menuItem: TmenuItem;
|
||||
|
||||
begin
|
||||
result:=0;
|
||||
parameters:=lua_gettop(L);
|
||||
if parameters=1 then
|
||||
begin
|
||||
menuItem:=lua_touserdata(L,-1);
|
||||
lua_pop(L, parameters);
|
||||
|
||||
lua_pushstring(L, menuItem.Caption);
|
||||
result:=1;
|
||||
end else lua_pop(L, parameters);
|
||||
menuitem:=luaclass_getClassObject(L);
|
||||
lua_pushstring(L, menuItem.Caption);
|
||||
result:=1;
|
||||
end;
|
||||
|
||||
function menuItem_setCaption(L: PLua_State): integer; cdecl;
|
||||
@ -110,34 +94,22 @@ var
|
||||
menuItem: TmenuItem;
|
||||
Caption: string;
|
||||
begin
|
||||
result:=0;
|
||||
parameters:=lua_gettop(L);
|
||||
if parameters=2 then
|
||||
menuitem:=luaclass_getClassObject(L);
|
||||
if lua_gettop(L)>=1 then
|
||||
begin
|
||||
menuItem:=lua_touserdata(L,-parameters);
|
||||
Caption:=Lua_ToString(L, -parameters+1);
|
||||
lua_pop(L, parameters);
|
||||
|
||||
Caption:=Lua_ToString(L, -1);
|
||||
menuItem.Caption:=Caption;
|
||||
end else lua_pop(L, parameters);
|
||||
end;
|
||||
result:=0;
|
||||
end;
|
||||
|
||||
function menuItem_getShortcut(L: PLua_State): integer; cdecl;
|
||||
var
|
||||
parameters: integer;
|
||||
menuItem: TmenuItem;
|
||||
|
||||
begin
|
||||
result:=0;
|
||||
parameters:=lua_gettop(L);
|
||||
if parameters=1 then
|
||||
begin
|
||||
menuItem:=lua_touserdata(L,-1);
|
||||
lua_pop(L, parameters);
|
||||
|
||||
lua_pushstring(L, ShortCutToText(menuItem.Shortcut));
|
||||
result:=1;
|
||||
end else lua_pop(L, parameters);
|
||||
menuitem:=luaclass_getClassObject(L);
|
||||
lua_pushstring(L, ShortCutToText(menuItem.Shortcut));
|
||||
result:=1;
|
||||
end;
|
||||
|
||||
function menuItem_setShortcut(L: PLua_State): integer; cdecl;
|
||||
@ -146,73 +118,51 @@ var
|
||||
menuItem: TmenuItem;
|
||||
Shortcut: string;
|
||||
begin
|
||||
result:=0;
|
||||
parameters:=lua_gettop(L);
|
||||
if parameters=2 then
|
||||
menuitem:=luaclass_getClassObject(L);
|
||||
if lua_gettop(L)>=1 then
|
||||
begin
|
||||
menuItem:=lua_touserdata(L,-parameters);
|
||||
Shortcut:=Lua_ToString(L, -parameters+1);
|
||||
lua_pop(L, parameters);
|
||||
|
||||
Shortcut:=Lua_ToString(L, -1);
|
||||
menuItem.Shortcut:=TextToShortCut(shortcut);
|
||||
end else lua_pop(L, parameters);
|
||||
end;
|
||||
result:=0;
|
||||
end;
|
||||
|
||||
function menuItem_getCount(L: PLua_State): integer; cdecl;
|
||||
var
|
||||
parameters: integer;
|
||||
menuItem: TmenuItem;
|
||||
|
||||
begin
|
||||
result:=0;
|
||||
parameters:=lua_gettop(L);
|
||||
if parameters=1 then
|
||||
begin
|
||||
menuItem:=lua_touserdata(L,-1);
|
||||
lua_pop(L, parameters);
|
||||
|
||||
lua_pushinteger(L, menuItem.Count);
|
||||
result:=1;
|
||||
|
||||
end else lua_pop(L, parameters);
|
||||
menuitem:=luaclass_getClassObject(L);
|
||||
lua_pushinteger(L, menuItem.Count);
|
||||
result:=1;
|
||||
end;
|
||||
|
||||
function menuItem_getItem(L: PLua_State): integer; cdecl;
|
||||
var
|
||||
parameters: integer;
|
||||
menuitem: TMenuItem;
|
||||
index: integer;
|
||||
begin
|
||||
result:=0;
|
||||
parameters:=lua_gettop(L);
|
||||
if parameters=2 then
|
||||
menuitem:=luaclass_getClassObject(L);
|
||||
if lua_gettop(L)>=1 then
|
||||
begin
|
||||
menuitem:=lua_touserdata(L,-2);
|
||||
index:=lua_toInteger(L,-1);
|
||||
lua_pop(L, parameters);
|
||||
|
||||
|
||||
lua_pushlightuserdata(L, menuitem.Items[index]);
|
||||
luaclass_newClass(L, menuitem.Items[index]);
|
||||
result:=1;
|
||||
|
||||
end else lua_pop(L, parameters);
|
||||
end;
|
||||
end;
|
||||
|
||||
function menuItem_add(L: PLua_State): integer; cdecl;
|
||||
var
|
||||
parameters: integer;
|
||||
menuitem, menuitem2: TMenuItem;
|
||||
begin
|
||||
result:=0;
|
||||
parameters:=lua_gettop(L);
|
||||
if parameters=2 then
|
||||
begin
|
||||
menuitem:=lua_touserdata(L,-2);
|
||||
menuitem2:=lua_touserdata(L,-1);
|
||||
lua_pop(L, parameters);
|
||||
menuitem:=luaclass_getClassObject(L);
|
||||
|
||||
if lua_gettop(L)>=1 then
|
||||
begin
|
||||
menuitem2:=lua_touserdata(L,-1);
|
||||
menuitem.Add(menuitem2);
|
||||
end else lua_pop(L, parameters);
|
||||
end;
|
||||
end;
|
||||
|
||||
function menuItem_insert(L: PLua_State): integer; cdecl;
|
||||
@ -222,16 +172,13 @@ var
|
||||
index: integer;
|
||||
begin
|
||||
result:=0;
|
||||
parameters:=lua_gettop(L);
|
||||
if parameters=3 then
|
||||
menuitem:=luaclass_getClassObject(L);
|
||||
if lua_gettop(L)>=2 then
|
||||
begin
|
||||
menuitem:=lua_touserdata(L,1);
|
||||
index:=lua_tointeger(L, 2);
|
||||
menuitem2:=lua_touserdata(L,3);
|
||||
lua_pop(L, parameters);
|
||||
|
||||
index:=lua_tointeger(L, -2);
|
||||
menuitem2:=lua_ToCEUserData(L,-1);
|
||||
menuitem.Insert(index, menuitem2);
|
||||
end else lua_pop(L, parameters);
|
||||
end;
|
||||
end;
|
||||
|
||||
function menuItem_delete(L: PLua_State): integer; cdecl;
|
||||
@ -241,20 +188,25 @@ var
|
||||
index: integer;
|
||||
begin
|
||||
result:=0;
|
||||
parameters:=lua_gettop(L);
|
||||
if parameters=2 then
|
||||
menuitem:=luaclass_getClassObject(L);
|
||||
if lua_gettop(L)>=1 then
|
||||
begin
|
||||
menuitem:=lua_touserdata(L,-2);
|
||||
index:=lua_toInteger(L,-1);
|
||||
lua_pop(L, parameters);
|
||||
|
||||
menuitem.Delete(index);
|
||||
end else lua_pop(L, parameters);
|
||||
end;
|
||||
end;
|
||||
|
||||
function menuitem_onClick(L: PLua_State): integer; cdecl; //for some reason the menuitem has it's own fonclick variable
|
||||
function menuitem_getOnClick(L: PLua_State): integer; cdecl;
|
||||
var
|
||||
c: Tmenuitem;
|
||||
begin
|
||||
c:=luaclass_getClassObject(L);
|
||||
LuaCaller_pushMethodProperty(L, TMethod(c.OnClick), 'TNotifyEvent');
|
||||
result:=1;
|
||||
end;
|
||||
|
||||
function menuitem_setOnClick(L: PLua_State): integer; cdecl; //for some reason the menuitem has it's own fonclick variable
|
||||
var
|
||||
parameters: integer;
|
||||
control: Tmenuitem;
|
||||
f: integer;
|
||||
routine: string;
|
||||
@ -262,11 +214,9 @@ var
|
||||
lc: TLuaCaller;
|
||||
begin
|
||||
result:=0;
|
||||
parameters:=lua_gettop(L);
|
||||
if parameters=2 then
|
||||
control:=luaclass_getClassObject(L);
|
||||
if lua_gettop(L)>=1 then
|
||||
begin
|
||||
control:=lua_touserdata(L,-2);
|
||||
|
||||
CleanupLuaCall(tmethod(control.onClick));
|
||||
control.onClick:=nil;
|
||||
|
||||
@ -289,28 +239,49 @@ begin
|
||||
end;
|
||||
|
||||
end;
|
||||
|
||||
lua_pop(L, parameters);
|
||||
end;
|
||||
|
||||
function menuItem_doClick(L: PLua_State): integer; cdecl;
|
||||
var
|
||||
parameters: integer;
|
||||
mi: TMenuItem;
|
||||
Color: integer;
|
||||
begin
|
||||
result:=0;
|
||||
parameters:=lua_gettop(L);
|
||||
if parameters=1 then
|
||||
begin
|
||||
mi:=lua_touserdata(L,1);
|
||||
if assigned(mi.onclick) then
|
||||
mi.OnClick(mi);
|
||||
end;
|
||||
|
||||
lua_pop(L, parameters);
|
||||
mi:=luaclass_getClassObject(L);
|
||||
if assigned(mi.onclick) then
|
||||
mi.OnClick(mi);
|
||||
end;
|
||||
|
||||
procedure menu_addMetaData(L: PLua_state; metatable: integer; userdata: integer );
|
||||
begin
|
||||
component_addMetaData(L, metatable, userdata);
|
||||
luaclass_addClassFunctionToTable(L, metatable, userdata, 'menu_getItems', menu_getItems);
|
||||
luaclass_addPropertyToTable(L, metatable, userdata, 'Items', menu_getItems, nil);
|
||||
end;
|
||||
|
||||
procedure menuitem_addMetaData(L: PLua_state; metatable: integer; userdata: integer );
|
||||
begin
|
||||
component_addMetaData(L, metatable, userdata);
|
||||
luaclass_addClassFunctionToTable(L, metatable, userdata, 'getCaption', menuItem_getCaption);
|
||||
luaclass_addClassFunctionToTable(L, metatable, userdata, 'setCaption', menuItem_setCaption);
|
||||
luaclass_addClassFunctionToTable(L, metatable, userdata, 'getShortcut', menuItem_getShortcut);
|
||||
luaclass_addClassFunctionToTable(L, metatable, userdata, 'setShortcut', menuItem_setShortcut);
|
||||
luaclass_addClassFunctionToTable(L, metatable, userdata, 'getCount', menuItem_getCount);
|
||||
luaclass_addClassFunctionToTable(L, metatable, userdata, 'getItem', menuItem_getItem);
|
||||
luaclass_addClassFunctionToTable(L, metatable, userdata, 'add', menuItem_add);
|
||||
luaclass_addClassFunctionToTable(L, metatable, userdata, 'insert', menuItem_insert);
|
||||
luaclass_addClassFunctionToTable(L, metatable, userdata, 'delete', menuItem_delete);
|
||||
luaclass_addClassFunctionToTable(L, metatable, userdata, 'setOnClick', menuItem_setOnClick);
|
||||
luaclass_addClassFunctionToTable(L, metatable, userdata, 'getOnClick', menuItem_getOnClick);
|
||||
luaclass_addClassFunctionToTable(L, metatable, userdata, 'doClick', menuItem_doClick);
|
||||
|
||||
luaclass_addPropertyToTable(L, metatable, userdata, 'Caption', menuItem_getCaption, menuItem_setCaption);
|
||||
luaclass_addPropertyToTable(L, metatable, userdata, 'Shortcut', menuItem_getShortcut, menuItem_setShortcut);
|
||||
luaclass_addPropertyToTable(L, metatable, userdata, 'Count', menuItem_getCount, nil);
|
||||
luaclass_addArrayPropertyToTable(L, metatable, userdata, 'Item', menuItem_getItem);
|
||||
luaclass_addPropertyToTable(L, metatable, userdata, 'OnClick', menuItem_getOnClick, menuItem_setOnClick);
|
||||
end;
|
||||
|
||||
|
||||
procedure initializeLuaMenu;
|
||||
begin
|
||||
lua_register(LuaVM, 'menu_getItems', menu_getItems);
|
||||
@ -327,9 +298,13 @@ begin
|
||||
lua_register(LuaVM, 'menuItem_add', menuItem_add);
|
||||
lua_register(LuaVM, 'menuItem_insert', menuItem_insert);
|
||||
lua_register(LuaVM, 'menuItem_delete', menuItem_delete);
|
||||
lua_register(LuaVM, 'menuItem_onClick', menuItem_onClick);
|
||||
lua_register(LuaVM, 'menuItem_onClick', menuItem_setOnClick);
|
||||
lua_register(LuaVM, 'menuItem_doClick', menuItem_doClick);
|
||||
end;
|
||||
|
||||
initialization
|
||||
luaclass_register(TMenu, Menu_addMetaData);
|
||||
luaclass_register(TMenuItem, MenuItem_addMetaData);
|
||||
|
||||
end.
|
||||
|
||||
|
@ -8,6 +8,7 @@ uses
|
||||
Classes, SysUtils, controls, lua, lualib, lauxlib,LuaHandler, graphics;
|
||||
|
||||
procedure initializeLuaWinControl;
|
||||
procedure wincontrol_addMetaData(L: PLua_state; metatable: integer; userdata: integer );
|
||||
|
||||
implementation
|
||||
|
||||
|
@ -328,7 +328,7 @@ methods:
|
||||
getOnClick(): Gets the onclick function
|
||||
doClick(): Executes the current function under onClick
|
||||
|
||||
GraphicsObject :
|
||||
GraphicsObject : (GraphicsObject->Object)
|
||||
|
||||
|
||||
|
||||
@ -379,7 +379,10 @@ menuItem_doClick(menuitem): Executes the onClick method if one is assigned
|
||||
|
||||
|
||||
Menu Class: (Inheritance: Component->Object)
|
||||
menu_getItems(menu) : Returns the MenuItem of this Menu
|
||||
properties
|
||||
Items : MenuItem - The base MenuItem class of this menu (readonly)
|
||||
methods
|
||||
getItems() : Returns the main MenuItem of this Menu
|
||||
|
||||
MainMenu Class: (Inheritance: Menu->Component->Object)
|
||||
createMainMenu(form)
|
||||
@ -387,7 +390,7 @@ createMainMenu(form)
|
||||
|
||||
PopupMenu Class: (Inheritance: Menu->Component->Object)
|
||||
createPopupMenu(owner)
|
||||
The popup menu is the menu that popus up when showing the (rightclick) context of an control
|
||||
The popup menu is the menu that pops up when showing the (rightclick) context of an control
|
||||
|
||||
|
||||
Strings Class: (Inheritance : Object) (Mostly an abstract class)
|
||||
|
File diff suppressed because it is too large
Load Diff
Binary file not shown.
@ -39,6 +39,7 @@ type
|
||||
tracecount: integer;
|
||||
traceWindow: TfrmTracer;
|
||||
traceQuitCondition: string;
|
||||
traceStepOver: boolean; //perhaps also trace branches ?
|
||||
//------------------
|
||||
|
||||
WaitingToContinue: boolean; //set to true when it's waiting for the user to continue
|
||||
@ -273,6 +274,11 @@ BP can be nil if it's a single step breakpoint
|
||||
|
||||
}
|
||||
var oldprotect,bw: dword;
|
||||
d: TDisassembler;
|
||||
nexteip: ptruint;
|
||||
t: string;
|
||||
|
||||
b: PBreakpoint;
|
||||
begin
|
||||
context.EFlags:=eflags_setTF(context.EFlags,0);
|
||||
|
||||
@ -347,14 +353,37 @@ begin
|
||||
|
||||
end;
|
||||
|
||||
co_stepinto:
|
||||
|
||||
|
||||
co_stepinto, co_stepover:
|
||||
begin
|
||||
//single step
|
||||
singlestepping:=true;
|
||||
if (bp=nil) or (bp.breakpointMethod=bpmDebugRegister) then
|
||||
context.EFlags:=eflags_setRF(context.EFlags,1);//don't break on the current instruction
|
||||
|
||||
context.EFlags:=eflags_setTF(context.EFlags,1); //set the trap flag
|
||||
if continueoption=co_stepinto then
|
||||
context.EFlags:=eflags_setTF(context.EFlags,1) //set the trap flag
|
||||
else
|
||||
begin
|
||||
//check if the current instruction is a call, if not, single step, else set a "run till" breakpoint (that doesn't cancel the stepping)
|
||||
d:=TDisassembler.Create;
|
||||
nexteip:=context.{$ifdef cpu64}rip{$else}eip{$endif};
|
||||
d.disassemble(nexteip, t);
|
||||
if d.LastDisassembleData.iscall then
|
||||
begin
|
||||
//set an execute breakpoint for this thread only at the next instruction and run till there
|
||||
|
||||
|
||||
b:=TDebuggerthread(debuggerthread).SetOnExecuteBreakpoint(nexteip , false, ThreadId);
|
||||
b.breakpointAction:=bo_BreakAndTrace;
|
||||
//b.OneTimeOnly:=true;
|
||||
end
|
||||
else //if not, single step
|
||||
context.EFlags:=eflags_setTF(context.EFlags,1);
|
||||
|
||||
|
||||
end;
|
||||
end;
|
||||
|
||||
//the other event types are just setting of one time breakpoints
|
||||
@ -411,8 +440,10 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
ContinueFromBreakpoint(nil, co_stepinto);
|
||||
if tracestepover then
|
||||
ContinueFromBreakpoint(nil, co_stepover)
|
||||
else
|
||||
ContinueFromBreakpoint(nil, co_stepinto);
|
||||
end
|
||||
else
|
||||
begin
|
||||
@ -605,14 +636,15 @@ begin
|
||||
isTracing:=true;
|
||||
tracecount:=bpp.TraceCount;
|
||||
traceWindow:=bpp.frmTracer;
|
||||
traceStepOver:=bpp.tracestepOver;
|
||||
if bpp.traceendcondition<>nil then
|
||||
traceQuitCondition:=bpp.traceendcondition
|
||||
else
|
||||
traceQuitCondition:='';
|
||||
|
||||
TdebuggerThread(debuggerthread).RemoveBreakpoint(bpp);
|
||||
end;
|
||||
|
||||
TdebuggerThread(debuggerthread).RemoveBreakpoint(bpp); //there can be only one
|
||||
|
||||
handleTrace;
|
||||
end;
|
||||
|
||||
|
@ -179,6 +179,7 @@ type
|
||||
frmTracer: TfrmTracer;
|
||||
tracecount: integer;
|
||||
traceendcondition: pchar;
|
||||
tracestepOver: boolean; //when set the tracer will step over instead of single step
|
||||
|
||||
//set if it's a bpaFetchRegistersandcontinue set on memory access
|
||||
//ChangedAddresses: TfrmChangedAddresses; //set if it's a bpaFetchRegistersandcontinue set on execute
|
||||
|
@ -78,7 +78,7 @@ type
|
||||
function isBreakpoint(address: uint_ptr; address2: uint_ptr=0; includeinactive: boolean=false): PBreakpoint;
|
||||
function CodeFinderStop(codefinder: TFoundCodeDialog): boolean;
|
||||
function setChangeRegBreakpoint(regmod: PRegisterModificationBP): PBreakpoint;
|
||||
procedure setBreakAndTraceBreakpoint(frmTracer: TFrmTracer; address: ptrUint; BreakpointTrigger: TBreakpointTrigger; bpsize: integer; count: integer; condition:string='');
|
||||
procedure setBreakAndTraceBreakpoint(frmTracer: TFrmTracer; address: ptrUint; BreakpointTrigger: TBreakpointTrigger; bpsize: integer; count: integer; condition:string=''; stepover: boolean=false);
|
||||
function stopBreakAndTrace(frmTracer: TFrmTracer): boolean;
|
||||
procedure FindWhatCodeAccesses(address: uint_ptr);
|
||||
function FindWhatCodeAccessesStop(frmchangedaddresses: Tfrmchangedaddresses): boolean;
|
||||
@ -1331,7 +1331,7 @@ begin
|
||||
|
||||
end;
|
||||
|
||||
procedure TDebuggerthread.setBreakAndTraceBreakpoint(frmTracer: TFrmTracer; address: ptrUint; BreakpointTrigger: TBreakpointTrigger; bpsize: integer; count: integer; condition:string='');
|
||||
procedure TDebuggerthread.setBreakAndTraceBreakpoint(frmTracer: TFrmTracer; address: ptrUint; BreakpointTrigger: TBreakpointTrigger; bpsize: integer; count: integer; condition:string=''; stepover: boolean=false);
|
||||
var
|
||||
method: TBreakpointMethod;
|
||||
useddebugregister: integer;
|
||||
@ -1375,7 +1375,10 @@ begin
|
||||
bp:=AddBreakpoint(nil, address, bpsize, BreakpointTrigger, method, bo_BreakAndTrace, usedDebugRegister, nil, 0, nil,frmTracer,count);
|
||||
|
||||
if bp<>nil then
|
||||
begin
|
||||
bp.traceendcondition:=strnew(pchar(condition));
|
||||
bp.traceStepOver:=stepover;
|
||||
end;
|
||||
|
||||
|
||||
for i:=1 to length(bplist)-1 do
|
||||
@ -1385,6 +1388,7 @@ begin
|
||||
|
||||
bpsecondary:=AddBreakpoint(bp, bplist[i].address, bplist[i].size, BreakpointTrigger, method, bo_BreakAndTrace, usedDebugregister, nil, 0, nil,frmTracer,count);
|
||||
bpsecondary.traceendcondition:=strnew(pchar(condition));
|
||||
bpsecondary.traceStepOver:=stepover;
|
||||
end;
|
||||
|
||||
|
||||
|
@ -1,15 +1,15 @@
|
||||
object frmTracerConfig: TfrmTracerConfig
|
||||
Left = 555
|
||||
Height = 206
|
||||
Height = 220
|
||||
Top = 113
|
||||
Width = 231
|
||||
BorderStyle = bsSingle
|
||||
Caption = 'Break and Trace config'
|
||||
ClientHeight = 206
|
||||
ClientHeight = 220
|
||||
ClientWidth = 231
|
||||
OnShow = FormShow
|
||||
Position = poScreenCenter
|
||||
LCLVersion = '0.9.31'
|
||||
LCLVersion = '1.1'
|
||||
object edtMaxTrace: TEdit
|
||||
Left = 16
|
||||
Height = 23
|
||||
@ -20,17 +20,17 @@ object frmTracerConfig: TfrmTracerConfig
|
||||
end
|
||||
object Label1: TLabel
|
||||
Left = 16
|
||||
Height = 16
|
||||
Height = 15
|
||||
Top = 8
|
||||
Width = 112
|
||||
Width = 111
|
||||
Caption = 'Maximal trace count:'
|
||||
ParentColor = False
|
||||
end
|
||||
object Label2: TLabel
|
||||
Left = 16
|
||||
Height = 16
|
||||
Height = 15
|
||||
Top = 56
|
||||
Width = 203
|
||||
Width = 202
|
||||
Caption = 'Stop condition (Optional, LUA format)'
|
||||
ParentColor = False
|
||||
end
|
||||
@ -44,7 +44,7 @@ object frmTracerConfig: TfrmTracerConfig
|
||||
object btnOK: TButton
|
||||
Left = 40
|
||||
Height = 25
|
||||
Top = 176
|
||||
Top = 192
|
||||
Width = 75
|
||||
Caption = 'OK'
|
||||
Default = True
|
||||
@ -54,7 +54,7 @@ object frmTracerConfig: TfrmTracerConfig
|
||||
object btnCancel: TButton
|
||||
Left = 132
|
||||
Height = 25
|
||||
Top = 176
|
||||
Top = 192
|
||||
Width = 75
|
||||
Cancel = True
|
||||
Caption = 'Cancel'
|
||||
@ -82,7 +82,7 @@ object frmTracerConfig: TfrmTracerConfig
|
||||
object rbBreakOnAccess: TRadioButton
|
||||
Left = 16
|
||||
Height = 19
|
||||
Top = 152
|
||||
Top = 168
|
||||
Width = 105
|
||||
Caption = 'Break on Access'
|
||||
TabOrder = 6
|
||||
@ -91,7 +91,7 @@ object frmTracerConfig: TfrmTracerConfig
|
||||
object rbBreakOnWrite: TRadioButton
|
||||
Left = 128
|
||||
Height = 19
|
||||
Top = 152
|
||||
Top = 168
|
||||
Width = 97
|
||||
Caption = 'Break on Write'
|
||||
Checked = True
|
||||
@ -99,4 +99,12 @@ object frmTracerConfig: TfrmTracerConfig
|
||||
TabStop = True
|
||||
Visible = False
|
||||
end
|
||||
object cbStepOver: TCheckBox
|
||||
Left = 17
|
||||
Height = 19
|
||||
Top = 149
|
||||
Width = 183
|
||||
Caption = 'Step over instead of single step'
|
||||
TabOrder = 8
|
||||
end
|
||||
end
|
||||
|
@ -8,3 +8,4 @@ TFRMTRACERCONFIG.CBDEREFERENCEADDRESSES.CAPTION=Dereference Addresses (Slows dow
|
||||
TFRMTRACERCONFIG.CBSAVESTACK.CAPTION=Save stack snapshots (Eats memory)
|
||||
TFRMTRACERCONFIG.RBBREAKONACCESS.CAPTION=Break on Access
|
||||
TFRMTRACERCONFIG.RBBREAKONWRITE.CAPTION=Break on Write
|
||||
TFRMTRACERCONFIG.CBSTEPOVER.CAPTION=Step over instead of single step
|
||||
|
@ -17,6 +17,7 @@ type
|
||||
btnCancel: TButton;
|
||||
cbDereferenceAddresses: TCheckBox;
|
||||
cbSaveStack: TCheckBox;
|
||||
cbStepOver: TCheckBox;
|
||||
edtMaxTrace: TEdit;
|
||||
edtCondition: TEdit;
|
||||
Label1: TLabel;
|
||||
|
@ -128,6 +128,8 @@ type
|
||||
|
||||
fDataTrace: boolean;
|
||||
|
||||
stepover: boolean;
|
||||
|
||||
procedure configuredisplay;
|
||||
procedure setSavestack(x: boolean);
|
||||
procedure updatestackview;
|
||||
@ -298,7 +300,7 @@ begin
|
||||
else
|
||||
thisnode:=lvTracer.Items.AddObject(nil,s,d);
|
||||
|
||||
if defaultDisassembler.LastDisassembleData.iscall then
|
||||
if not stepover and defaultDisassembler.LastDisassembleData.iscall then
|
||||
currentAppendage:=thisnode;
|
||||
|
||||
if defaultDisassembler.LastDisassembleData.isret then
|
||||
@ -380,6 +382,7 @@ begin
|
||||
|
||||
tcount:=strtoint(edtMaxTrace.text);
|
||||
condition:=edtCondition.text;
|
||||
stepover:=cbStepOver.checked;
|
||||
|
||||
if startdebuggerifneeded then
|
||||
begin
|
||||
@ -398,14 +401,14 @@ begin
|
||||
memorybrowser.hexview.GetSelectionRange(fromaddress,toaddress);
|
||||
|
||||
//set the breakpoint
|
||||
debuggerthread.setBreakAndTraceBreakpoint(self, fromaddress, bpTrigger, 1+(toaddress-fromaddress), tcount, condition);
|
||||
debuggerthread.setBreakAndTraceBreakpoint(self, fromaddress, bpTrigger, 1+(toaddress-fromaddress), tcount, condition, stepover);
|
||||
end
|
||||
else
|
||||
begin
|
||||
if (owner is TMemoryBrowser) then
|
||||
debuggerthread.setBreakAndTraceBreakpoint(self, (owner as TMemoryBrowser).disassemblerview.SelectedAddress, bptExecute, 1, tcount, condition)
|
||||
debuggerthread.setBreakAndTraceBreakpoint(self, (owner as TMemoryBrowser).disassemblerview.SelectedAddress, bptExecute, 1, tcount, condition, StepOver)
|
||||
else
|
||||
debuggerthread.setBreakAndTraceBreakpoint(self, memorybrowser.disassemblerview.SelectedAddress, bptExecute,1, tcount, condition);
|
||||
debuggerthread.setBreakAndTraceBreakpoint(self, memorybrowser.disassemblerview.SelectedAddress, bptExecute,1, tcount, condition, StepOver);
|
||||
end;
|
||||
end;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user