243 lines
5.5 KiB
ObjectPascal
243 lines
5.5 KiB
ObjectPascal
unit LuaSymbolListHandler;
|
|
|
|
{$mode delphi}
|
|
|
|
interface
|
|
|
|
uses
|
|
Classes, SysUtils, lua, lualib, LuaClass, SymbolListHandler;
|
|
|
|
procedure initializeLuaSymbolListHandler;
|
|
|
|
procedure pushSymbol(L: PLua_state; si: PCESymbolInfo);
|
|
|
|
implementation
|
|
|
|
uses LuaHandler, LuaObject, symbolhandler;
|
|
|
|
function createSymbolList(L: Plua_State): integer; cdecl;
|
|
begin
|
|
result:=1;
|
|
luaclass_newClass(L, TSymbolListHandler.create);
|
|
end;
|
|
|
|
function SymbolList_clear(L: Plua_State): integer; cdecl;
|
|
var
|
|
sl: TSymbolListHandler;
|
|
begin
|
|
sl:=luaclass_getClassObject(L);
|
|
sl.clear;
|
|
result:=0;
|
|
end;
|
|
|
|
function SymbolList_register(L: Plua_State): integer; cdecl;
|
|
var
|
|
sl: TSymbolListHandler;
|
|
begin
|
|
sl:=luaclass_getClassObject(L);
|
|
symhandler.AddSymbolList(sl);
|
|
result:=0;
|
|
end;
|
|
|
|
function SymbolList_unregister(L: Plua_State): integer; cdecl;
|
|
var
|
|
sl: TSymbolListHandler;
|
|
begin
|
|
sl:=luaclass_getClassObject(L);
|
|
symhandler.RemoveSymbolList(sl);
|
|
result:=0;
|
|
end;
|
|
|
|
procedure pushSymbol(L: PLua_state; si: PCESymbolInfo);
|
|
var tableindex: integer;
|
|
begin
|
|
lua_newtable(L);
|
|
tableindex:=lua_gettop(L);
|
|
|
|
lua_pushstring(L,'modulename');
|
|
lua_pushstring(L,si.module);
|
|
lua_settable(L, tableindex);
|
|
|
|
lua_pushstring(L,'searchkey');
|
|
lua_pushstring(L,si.originalstring);
|
|
lua_settable(L, tableindex);
|
|
|
|
lua_pushstring(L,'address');
|
|
lua_pushinteger(L,si.address);
|
|
lua_settable(L, tableindex);
|
|
|
|
lua_pushstring(L,'symbolsize');
|
|
lua_pushinteger(L,si.size);
|
|
lua_settable(L, tableindex);
|
|
end;
|
|
|
|
function SymbolList_GetSymbolFromAddress(L: Plua_State): integer; cdecl;
|
|
var
|
|
sl: TSymbolListHandler;
|
|
si: PCESymbolInfo;
|
|
begin
|
|
result:=0;
|
|
sl:=luaclass_getClassObject(L);
|
|
|
|
si:=sl.FindAddress(lua_tointeger(L, 1));
|
|
if si<>nil then
|
|
begin
|
|
pushSymbol(L, si);
|
|
result:=1;
|
|
end;
|
|
end;
|
|
|
|
function SymbolList_getSymbolFromString(L: Plua_State): integer; cdecl;
|
|
var
|
|
sl: TSymbolListHandler;
|
|
si: PCESymbolInfo;
|
|
begin
|
|
result:=0;
|
|
sl:=luaclass_getClassObject(L);
|
|
|
|
si:=sl.FindSymbol(lua_tostring(L, 1));
|
|
if si<>nil then
|
|
begin
|
|
pushSymbol(L, si);
|
|
result:=1;
|
|
end;
|
|
end;
|
|
|
|
function SymbolList_addSymbol(L: Plua_State): integer; cdecl;
|
|
var
|
|
sl: TSymbolListHandler;
|
|
si: PCESymbolInfo;
|
|
|
|
modulename: string;
|
|
searchkey: string;
|
|
address: qword;
|
|
size: integer;
|
|
skipAddressToSymbol: boolean;
|
|
|
|
esd: TExtraSymbolData;
|
|
returntype: string;
|
|
parameters: string;
|
|
begin
|
|
result:=0;
|
|
sl:=luaclass_getClassObject(L);
|
|
esd:=nil;
|
|
|
|
if lua_gettop(L)>=4 then //modulename, searchkey, address, symbolsize, skipAddressToSymbol
|
|
begin
|
|
modulename:=lua_tostring(L, 1);
|
|
searchkey:=lua_tostring(L, 2);
|
|
address:=lua_tointeger(L, 3);
|
|
size:=lua_tointeger(L, 4);
|
|
|
|
if lua_gettop(L)>=5 then
|
|
skipAddressToSymbol:=lua_toboolean(L, 5)
|
|
else
|
|
skipAddressToSymbol:=false;
|
|
|
|
if lua_gettop(L)>=6 then
|
|
begin
|
|
if lua_istable(L, 6) then
|
|
begin
|
|
lua_pushstring(L, 'returntype');
|
|
lua_gettable(L, 6);
|
|
|
|
returntype:=Lua_ToString(L, -1);
|
|
lua_pop(L,1);
|
|
|
|
lua_pushstring(L, 'parameters');
|
|
lua_gettable(L, 6);
|
|
|
|
parameters:=Lua_ToString(L, -1);
|
|
lua_pop(L,1);
|
|
|
|
if (returntype<>'') or (parameters<>'') then
|
|
begin
|
|
esd:=TExtraSymbolData.create;
|
|
esd.return:=returntype;
|
|
esd.simpleparameters:=parameters;
|
|
|
|
esd.filledin:=true;
|
|
|
|
sl.AddExtraSymbolData(esd);
|
|
end;
|
|
|
|
end;
|
|
|
|
end
|
|
else
|
|
parameters:='';
|
|
|
|
|
|
si:=sl.AddSymbol(modulename, searchkey, address, size, skipAddressToSymbol, esd);
|
|
|
|
if esd<>nil then
|
|
esd.free;
|
|
|
|
pushSymbol(L, si);
|
|
result:=1;
|
|
end;
|
|
end;
|
|
|
|
function SymbolList_deleteSymbol(L: Plua_State): integer; cdecl;
|
|
var
|
|
sl: TSymbolListHandler;
|
|
si: PCESymbolInfo;
|
|
begin
|
|
result:=0;
|
|
sl:=luaclass_getClassObject(L);
|
|
|
|
|
|
if lua_type(L,1)=LUA_TNUMBER then
|
|
begin
|
|
si:=sl.FindAddress(lua_tointeger(L, 1));
|
|
if si<>nil then
|
|
begin
|
|
if si.extra<>nil then
|
|
begin
|
|
sl.RemoveExtraSymbolData(si.extra);
|
|
si.extra.free;
|
|
end;
|
|
|
|
sl.DeleteSymbol(lua_tointeger(L, 1))
|
|
end;
|
|
end
|
|
else
|
|
begin
|
|
si:=sl.FindSymbol(lua_tostring(L, 1));
|
|
if si<>nil then
|
|
begin
|
|
if si.extra<>nil then
|
|
begin
|
|
sl.RemoveExtraSymbolData(si.extra);
|
|
si.extra.free;
|
|
end;
|
|
|
|
sl.DeleteSymbol(lua_tostring(L, 1))
|
|
end;
|
|
|
|
end;
|
|
end;
|
|
|
|
procedure SymbolList_addMetaData(L: PLua_state; metatable: integer; userdata: integer );
|
|
begin
|
|
object_addMetaData(L, metatable, userdata);
|
|
luaclass_addClassFunctionToTable(L, metatable, userdata, 'clear', SymbolList_clear);
|
|
luaclass_addClassFunctionToTable(L, metatable, userdata, 'getSymbolFromAddress', SymbolList_GetSymbolFromAddress);
|
|
luaclass_addClassFunctionToTable(L, metatable, userdata, 'getSymbolFromString', SymbolList_getSymbolFromString);
|
|
luaclass_addClassFunctionToTable(L, metatable, userdata, 'addSymbol', SymbolList_addSymbol);
|
|
luaclass_addClassFunctionToTable(L, metatable, userdata, 'deleteSymbol', SymbolList_deleteSymbol);
|
|
luaclass_addClassFunctionToTable(L, metatable, userdata, 'register', SymbolList_register);
|
|
luaclass_addClassFunctionToTable(L, metatable, userdata, 'unregister', SymbolList_unregister);
|
|
end;
|
|
|
|
procedure initializeLuaSymbolListHandler;
|
|
begin
|
|
lua_register(LuaVM, 'createSymbolList', createSymbolList);
|
|
end;
|
|
|
|
initialization
|
|
luaclass_register(TSymbolListHandler, SymbolList_addMetaData);
|
|
|
|
end.
|
|
|