Skip to content

Commit 61d8cb5

Browse files
authored
Merge pull request #51 from zhangjiequan/feat/extend_all_lua_types_for_pr
Extend queryHelper
2 parents 261c623 + 005e38a commit 61d8cb5

File tree

9 files changed

+80
-6
lines changed

9 files changed

+80
-6
lines changed

emmy_core/src/emmy_core.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ static const luaL_Reg lib[] = {
3131
{"breakHere", breakHere},
3232
{"stop", stop},
3333
{"tcpSharedListen", tcpSharedListen},
34+
{"registerTypeName", registerTypeName},
3435
{nullptr, nullptr}
3536
};
3637

emmy_debugger/include/emmy_debugger/debugger/emmy_debugger.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include <functional>
2323
#include <memory>
2424
#include <set>
25+
#include <bitset>
2526

2627
#include "emmy_debugger/api/lua_api.h"
2728
#include "hook_state.h"
@@ -94,6 +95,8 @@ class Debugger: public std::enable_shared_from_this<Debugger>
9495

9596
void ClearVariableArenaRef();
9697

98+
bool RegisterTypeName(const std::string& typeName, std::string& err);
99+
97100
private:
98101
std::shared_ptr<BreakPoint> FindBreakPoint(lua_Debug* ar);
99102
std::shared_ptr<BreakPoint> FindBreakPoint(const std::string& file, int line);
@@ -112,6 +115,8 @@ class Debugger: public std::enable_shared_from_this<Debugger>
112115
// bool HasCacheValue(int valueIndex) const;
113116
void ClearCache() const;
114117

118+
int GetTypeFromName(const char* typeName);
119+
115120
lua_State* currentL;
116121
lua_State* mainL;
117122

@@ -137,4 +142,6 @@ class Debugger: public std::enable_shared_from_this<Debugger>
137142
std::queue<std::shared_ptr<EvalContext>> evalQueue;
138143

139144
Arena<Variable> *arenaRef;
145+
146+
std::bitset<LUA_TTHREAD+1> registeredTypes;
140147
};

emmy_debugger/include/emmy_debugger/debugger/emmy_debugger_lib.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@ int tcpSharedListen(lua_State* L);
2828
// emmy.stop()
2929
int stop(lua_State* L);
3030

31+
// emmy.registerTypeName(typeName: string): bool
32+
int registerTypeName(lua_State* L);
33+
3134
bool install_emmy_debugger(struct lua_State* L);
3235

3336
std::string prepareEvalExpr(const std::string& eval);

emmy_debugger/include/emmy_debugger/debugger/extension_point.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@ class ExtensionPoint {
1313
void Initialize(lua_State *L);
1414
//
1515
bool QueryVariable(lua_State *L, Idx<Variable> variable, const char *typeName, int object, int depth);
16+
bool QueryVariableCustom(lua_State *L, Idx<Variable> variable, const char *typeName, int object, int depth);
1617

1718
lua_State *QueryParentThread(lua_State *L);
19+
20+
private:
21+
bool QueryVariableGeneric(lua_State *L, Idx<Variable> variable, const char *typeName, int object, int depth, const char* queryFunction);
1822
};

emmy_debugger/include/emmy_debugger/emmy_facade.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ class EmmyFacade
5858
bool PipeListen(lua_State* L, const std::string& name, std::string& err);
5959
bool PipeConnect(lua_State* L, const std::string& name, std::string& err);
6060
int BreakHere(lua_State* L);
61+
bool RegisterTypeName(lua_State *L, const std::string &typeName, std::string &err);
6162

6263
int OnConnect(bool suc);
6364
int OnDisconnect();

emmy_debugger/src/debugger/emmy_debugger.cpp

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -370,9 +370,13 @@ void Debugger::GetVariable(lua_State *L, Idx<Variable> variable, int index, int
370370
variable->valueTypeName = typeName;
371371
variable->valueType = type;
372372

373-
374-
if (queryHelper && (type == LUA_TTABLE || type == LUA_TUSERDATA || type == LUA_TFUNCTION)) {
375-
if (manager->extension.QueryVariable(L, variable, typeName, index, depth)) {
373+
if (queryHelper) {
374+
if (type >= 0 && type < registeredTypes.size() && registeredTypes.test(type)
375+
&& manager->extension.QueryVariableCustom(L, variable, typeName, index, depth)) {
376+
return;
377+
}
378+
else if ((type == LUA_TTABLE || type == LUA_TUSERDATA || type == LUA_TFUNCTION)
379+
&& manager->extension.QueryVariable(L, variable, typeName, index, depth)) {
376380
return;
377381
}
378382
}
@@ -1424,3 +1428,26 @@ void Debugger::ExecuteOnLuaThread(const Executor &exec) {
14241428
std::unique_lock<std::mutex> lock(luaThreadMtx);
14251429
luaThreadExecutors.push_back(exec);
14261430
}
1431+
1432+
int Debugger::GetTypeFromName(const char* typeName) {
1433+
if (strcmp(typeName, "nil") == 0) return LUA_TNIL;
1434+
if (strcmp(typeName, "boolean") == 0) return LUA_TBOOLEAN;
1435+
if (strcmp(typeName, "lightuserdata") == 0) return LUA_TLIGHTUSERDATA;
1436+
if (strcmp(typeName, "number") == 0) return LUA_TNUMBER;
1437+
if (strcmp(typeName, "string") == 0) return LUA_TSTRING;
1438+
if (strcmp(typeName, "table") == 0) return LUA_TTABLE;
1439+
if (strcmp(typeName, "function") == 0) return LUA_TFUNCTION;
1440+
if (strcmp(typeName, "userdata") == 0) return LUA_TUSERDATA;
1441+
if (strcmp(typeName, "thread") == 0) return LUA_TTHREAD;
1442+
return -1; // 未知类型
1443+
}
1444+
1445+
bool Debugger::RegisterTypeName(const std::string& typeName, std::string& err) {
1446+
int type = GetTypeFromName(typeName.c_str());
1447+
if (type == -1) {
1448+
err = "Unknown type name: " + typeName;
1449+
return false;
1450+
}
1451+
registeredTypes.set(type);
1452+
return true;
1453+
}

emmy_debugger/src/debugger/emmy_debugger_lib.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,19 @@ int stop(lua_State* L)
117117
return 0;
118118
}
119119

120+
// emmy.registerTypeName(typeName: string): bool
121+
int registerTypeName(lua_State* L)
122+
{
123+
luaL_checkstring(L, 1);
124+
std::string err;
125+
const auto typeName = lua_tostring(L, 1);
126+
const auto suc = EmmyFacade::Get().RegisterTypeName(L, typeName, err);
127+
lua_pushboolean(L, suc);
128+
if (suc) return 1;
129+
lua_pushstring(L, err.c_str());
130+
return 2;
131+
}
132+
120133
int gc(lua_State* L)
121134
{
122135
EmmyFacade::Get().OnLuaStateGC(L);

emmy_debugger/src/debugger/extension_point.cpp

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -122,14 +122,14 @@ void ExtensionPoint::Initialize(lua_State *L) {
122122
lua_rawset(L, LUA_REGISTRYINDEX);
123123
}
124124

125-
bool ExtensionPoint::QueryVariable(lua_State *L, Idx<Variable> variable, const char *typeName, int object, int depth) {
125+
bool ExtensionPoint::QueryVariableGeneric(lua_State *L, Idx<Variable> variable, const char *typeName, int object, int depth, const char* queryFunction) {
126126
bool result = false;
127127
object = lua_absindex(L, object);
128128
const int t = lua_gettop(L);
129129
lua_getglobal(L, ExtensionTable.c_str());
130130

131131
if (lua_istable(L, -1)) {
132-
lua_getfield(L, -1, "queryVariable");
132+
lua_getfield(L, -1, queryFunction);
133133
if (lua_isfunction(L, -1)) {
134134
pushVariable(L, variable);
135135
lua_pushvalue(L, object);
@@ -140,7 +140,7 @@ bool ExtensionPoint::QueryVariable(lua_State *L, Idx<Variable> variable, const c
140140
result = lua_toboolean(L, -1);
141141
} else {
142142
const auto err = lua_tostring(L, -1);
143-
printf("query error: %s\n", err);
143+
printf("query error in %s: %s\n", queryFunction, err);
144144
}
145145
}
146146
}
@@ -149,6 +149,14 @@ bool ExtensionPoint::QueryVariable(lua_State *L, Idx<Variable> variable, const c
149149
return result;
150150
}
151151

152+
bool ExtensionPoint::QueryVariable(lua_State *L, Idx<Variable> variable, const char *typeName, int object, int depth) {
153+
return QueryVariableGeneric(L, variable, typeName, object, depth, "queryVariable");
154+
}
155+
156+
bool ExtensionPoint::QueryVariableCustom(lua_State *L, Idx<Variable> variable, const char *typeName, int object, int depth) {
157+
return QueryVariableGeneric(L, variable, typeName, object, depth, "queryVariableCustom");
158+
}
159+
152160
lua_State *ExtensionPoint::QueryParentThread(lua_State *L) {
153161
lua_State *PL = nullptr;
154162
const int t = lua_gettop(L);

emmy_debugger/src/emmy_facade.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -396,3 +396,13 @@ void EmmyFacade::Attach(lua_State *L) {
396396

397397
lua_sethook(L, EmmyFacade::HookLua, LUA_MASKCALL | LUA_MASKLINE | LUA_MASKRET, 0);
398398
}
399+
400+
bool EmmyFacade::RegisterTypeName(lua_State *L, const std::string &typeName, std::string &err) {
401+
auto debugger = GetDebugger(L);
402+
if (!debugger) {
403+
err = "Debugger does not exist";
404+
return false;
405+
}
406+
const auto suc = debugger->RegisterTypeName(typeName, err);
407+
return suc;
408+
}

0 commit comments

Comments
 (0)