新结算页面

master
罗家炜 2025-04-15 14:59:43 +08:00
parent 728a07e106
commit 9f240c2ae2
45 changed files with 4950 additions and 5745 deletions

View File

@ -2,7 +2,7 @@
--author-- --author--
-- a net client -- a net client
NetClient = { NetClient= {
} }
ConnectionProtocol = { ConnectionProtocol = {
@ -59,21 +59,21 @@ local LuaNetClient = taurus.unity.LuaNetClient
-- @param #string game -- @param #string game
-- @param #number protocol -- @param #number protocol
-- @return #NetClient the created NetClient -- @return #NetClient the created NetClient
function NetClient.new(host, game, protocol) function NetClient.new(host, game,protocol)
local self = {} local self = {}
self.host = host or "" self.host = host or ""
self.game = game or "" self.game = game or ""
self.protocol = protocol or ConnectionProtocol.Tcp self.protocol = protocol or ConnectionProtocol.Tcp
-- self.responseMap = {} -- self.responseMap = {}
self.onevent = event("onevent", false) self.onevent = event("onevent",false)
self.onconnect = event("onconnect", false) self.onconnect = event("onconnect",false)
---- print("222222222222222222222222222222222222222222 ",host," ",host," ",game," ",self.protocol) --print("222222222222222222222222222222222222222222 ",host," ",host," ",game," ",self.protocol)
self.c__netClient = LuaNetClient(host, game, self, self.protocol) self.c__netClient = LuaNetClient(host,game,self,self.protocol)
self.c__netClient:SetCallBackListener(R.c__ondata) self.c__netClient:SetCallBackListener(R.c__ondata)
self.c__netClient:SetNetEventListener(R.c__onevent) self.c__netClient:SetNetEventListener(R.c__onevent)
self.c__netClient:SetNetConnectListener(R.c__onconnect) self.c__netClient:SetNetConnectListener(R.c__onconnect)
setmetatable(self, { __index = R }) setmetatable(self, {__index = R})
return self return self
end end
@ -83,16 +83,15 @@ function R.connect(self)
end end
self.c__netClient:Connect() self.c__netClient:Connect()
end end
local TYPE_STRING = "string" local TYPE_STRING = "string"
local TYPE_FUNC = "function" local TYPE_FUNC = "function"
local TYPE_TABLE = "table" local TYPE_TABLE = "table"
local NULL_JSON = "{}" local NULL_JSON = "{}"
--- send --- send
function R.send(self, cmd, data, callback) function R.send(self,cmd, data, callback)
if (debug_print) then if(debug_print) then
-- print("send host:" .. self.host) print("send host:"..self.host)
end end
if self.c__netClient == nil then if self.c__netClient == nil then
return return
@ -105,11 +104,12 @@ function R.send(self, cmd, data, callback)
if data then if data then
str = json.encode(data) str = json.encode(data)
end end
self.c__netClient:Send(cmd, str, callback) self.c__netClient:Send(cmd,str,callback)
end end
---c#网络层回调函数 ---c#网络层回调函数
function R.c__ondata(self, cmd, result, data, func) function R.c__ondata(self,cmd,result,data,func)
local _response = nil local _response = nil
if type(data) == TYPE_STRING and string.len(data) > 0 then if type(data) == TYPE_STRING and string.len(data) > 0 then
@ -120,7 +120,7 @@ function R.c__ondata(self, cmd, result, data, func)
new_response.Data = _response new_response.Data = _response
if self.holdCallback ~= nil then if self.holdCallback ~=nil then
if self.holdCallback(new_response) then if self.holdCallback(new_response) then
return return
end end
@ -129,8 +129,8 @@ function R.c__ondata(self, cmd, result, data, func)
func(new_response) func(new_response)
end end
function R.setSession(self, session) function R.setSession(self,session)
printlog("setSession==>>>", session) printlog("setSession==>>>",session)
self.session = session self.session = session
if self.c__netClient == nil then if self.c__netClient == nil then
@ -140,7 +140,7 @@ function R.setSession(self, session)
end end
function R.getSession(self) function R.getSession(self)
printlog("getSession===>>>", self.session) printlog("getSession===>>>",self.session)
return self.session return self.session
end end
@ -151,13 +151,15 @@ function R.getAveragePingTime(self)
return self.c__netClient.AveragePingTime return self.c__netClient.AveragePingTime
end end
---c#网络层回调函数 ---c#网络层回调函数
function R.c__onevent(self, cmd, data) function R.c__onevent(self,cmd,data)
local new_response = {} local new_response = {}
local _response = data and json.decode(data) or nil local _response = data and json.decode(data) or nil
new_response.Command = cmd new_response.Command = cmd
new_response.Data = _response new_response.Data = _response
self.onevent(new_response) self.onevent(new_response)
end end
function R.clearActionQueue(self) function R.clearActionQueue(self)
@ -168,9 +170,9 @@ function R.clearActionQueue(self)
end end
---c#网络层回调函数 ---c#网络层回调函数
function R.c__onconnect(self, code) function R.c__onconnect(self,code)
if (debug_print) then if(debug_print) then
-- print("codeccccccccccccccccccccccccccccccccccccccc" .. code) print("codeccccccccccccccccccccccccccccccccccccccc"..code)
end end
self.onconnect(code) self.onconnect(code)
end end
@ -180,7 +182,7 @@ function R.clearEvent(self)
self.onconnect:Clear() self.onconnect:Clear()
end end
function R.setHold(self, func) function R.setHold(self,func)
self.holdcallback = func self.holdcallback = func
end end
@ -188,5 +190,5 @@ function R.destroy(self)
if self.c__netClient then self.c__netClient:Destroy() end if self.c__netClient then self.c__netClient:Destroy() end
self.onconnect:Clear() self.onconnect:Clear()
self.onevent:Clear() self.onevent:Clear()
self.c__netClient = nil self.c__netClient=nil
end end

View File

@ -3,7 +3,7 @@ Queue = {}
function Queue.new(capacity) function Queue.new(capacity)
local self = {} local self = {}
setmetatable(self, { __index = Queue }) setmetatable(self,{__index = Queue})
self.capacity = capacity self.capacity = capacity
self.queue = {} self.queue = {}
self.size_ = 0 self.size_ = 0
@ -20,11 +20,11 @@ function Queue:Enqueue(element)
self.queue[self.rear] = element self.queue[self.rear] = element
else else
local temp = (self.rear + 1) % self.capacity local temp = (self.rear + 1) % self.capacity
---- print("1111111111111111111====>>>>") --print("1111111111111111111====>>>>")
---- print(temp) --print(temp)
if temp == self.head then if temp == self.head then
error("Error: capacity is full.") error("Error: capacity is full.")
ViewUtil.ErrorTip(10001, "Error: capacity is full.") ViewUtil.ErrorTip(10001,"Error: capacity is full.")
return return
else else
self.rear = temp self.rear = temp
@ -33,11 +33,12 @@ function Queue:Enqueue(element)
self.queue[self.rear] = element self.queue[self.rear] = element
self.size_ = self.size_ + 1 self.size_ = self.size_ + 1
end end
end end
function Queue:Dequeue() function Queue:Dequeue()
if self:IsEmpty() then if self:IsEmpty() then
ViewUtil.ErrorTip(10002, "Error: The Queue is empty.") ViewUtil.ErrorTip(10002,"Error: The Queue is empty.")
error("Error: The Queue is empty.") error("Error: The Queue is empty.")
return return
end end
@ -73,16 +74,16 @@ function Queue:dump()
local first_flag = true local first_flag = true
while h ~= r do while h ~= r do
if first_flag == true then if first_flag == true then
str = "{" .. self.queue[h] str = "{"..self.queue[h]
h = (h + 1) % self.capacity h = (h + 1) % self.capacity
first_flag = false first_flag = false
else else
str = str .. "," .. self.queue[h] str = str..","..self.queue[h]
h = (h + 1) % self.capacity h = (h + 1) % self.capacity
end end
end end
str = str .. "," .. self.queue[r] .. "}" str = str..","..self.queue[r].."}"
if (debug_print) then if(debug_print) then
-- print(str) print(str)
end end
end end

View File

@ -5,131 +5,132 @@
bit = bit or {} bit = bit or {}
function bit.init32() function bit.init32()
bit.data32 = {} bit.data32 = {}
for i = 1, 32 do for i=1,32 do
bit.data32[i] = 2 ^ (32 - i) bit.data32[i]=2^(32-i)
end end
end end
bit.init32() bit.init32()
function bit:d2b(arg) --bit:d2b function bit:d2b(arg) --bit:d2b
local tr = {} local tr={}
for i = 1, 32 do for i=1,32 do
if arg >= self.data32[i] then if arg >= self.data32[i] then
tr[i] = 1 tr[i]=1
arg = arg - self.data32[i] arg=arg-self.data32[i]
else else
tr[i] = 0 tr[i]=0
end end
end end
return tr return tr
end end
function bit:b2d(arg) --bit:b2d function bit:b2d(arg) --bit:b2d
local nr = 0 local nr=0
for i = 1, 32 do for i=1,32 do
if arg[i] == 1 then if arg[i] ==1 then
nr = nr + 2 ^ (32 - i) nr=nr+2^(32-i)
end end
end end
return nr return nr
end end
function bit:_xor(a, b) --bit:xor function bit:_xor(a,b) --bit:xor
local op1 = self:d2b(a) local op1=self:d2b(a)
local op2 = self:d2b(b) local op2=self:d2b(b)
local r = {} local r={}
for i = 1, 32 do for i=1,32 do
if op1[i] == op2[i] then if op1[i]==op2[i] then
r[i] = 0 r[i]=0
else else
r[i] = 1 r[i]=1
end end
end end
return self:b2d(r) return self:b2d(r)
end end
function bit:_and(a, b) --bit:_and function bit:_and(a,b) --bit:_and
local op1 = self:d2b(a) local op1=self:d2b(a)
local op2 = self:d2b(b) local op2=self:d2b(b)
local r = {} local r={}
for i = 1, 32 do for i=1,32 do
if op1[i] == 1 and op2[i] == 1 then if op1[i]==1 and op2[i]==1 then
r[i] = 1 r[i]=1
else else
r[i] = 0 r[i]=0
end end
end end
return self:b2d(r) return self:b2d(r)
end end
function bit:_or(a, b) --bit:_or function bit:_or(a,b) --bit:_or
local op1 = self:d2b(a) local op1=self:d2b(a)
local op2 = self:d2b(b) local op2=self:d2b(b)
local r = {} local r={}
for i = 1, 32 do for i=1,32 do
if op1[i] == 1 or op2[i] == 1 then if op1[i]==1 or op2[i]==1 then
r[i] = 1 r[i]=1
else else
r[i] = 0 r[i]=0
end end
end end
return self:b2d(r) return self:b2d(r)
end end
function bit:_not(a) --bit:_not function bit:_not(a) --bit:_not
local op1 = self:d2b(a) local op1=self:d2b(a)
local r = {} local r={}
for i = 1, 32 do for i=1,32 do
if op1[i] == 1 then if op1[i]==1 then
r[i] = 0 r[i]=0
else else
r[i] = 1 r[i]=1
end end
end end
return self:b2d(r) return self:b2d(r)
end end
function bit:_rshift(a, n) --bit:_rshift function bit:_rshift(a,n) --bit:_rshift
local op1 = self:d2b(a) local op1=self:d2b(a)
local r = self:d2b(0) local r=self:d2b(0)
if n < 32 and n > 0 then if n < 32 and n > 0 then
for i = 1, n do for i=1,n do
for i = 31, 1, -1 do for i=31,1,-1 do
op1[i + 1] = op1[i] op1[i+1]=op1[i]
end end
op1[1] = 0 op1[1]=0
end end
r = op1 r=op1
end end
return self:b2d(r) return self:b2d(r)
end end
function bit:_lshift(a, n) --bit:_lshift function bit:_lshift(a,n) --bit:_lshift
local op1 = self:d2b(a) local op1=self:d2b(a)
local r = self:d2b(0) local r=self:d2b(0)
if n < 32 and n > 0 then if n < 32 and n > 0 then
for i = 1, n do for i=1,n do
for i = 1, 31 do for i=1,31 do
op1[i] = op1[i + 1] op1[i]=op1[i+1]
end end
op1[32] = 0 op1[32]=0
end end
r = op1 r=op1
end end
return self:b2d(r) return self:b2d(r)
end end
function bit:print(ta) function bit:print(ta)
local sr = "" local sr=""
for i = 1, 32 do for i=1,32 do
sr = sr .. ta[i] sr=sr..ta[i]
end end
-- print(sr) print(sr)
end end

View File

@ -1,3 +1,5 @@
string._htmlspecialchars_set = {} string._htmlspecialchars_set = {}
string._htmlspecialchars_set["&"] = "&amp;" string._htmlspecialchars_set["&"] = "&amp;"
string._htmlspecialchars_set["\""] = "&quot;" string._htmlspecialchars_set["\""] = "&quot;"
@ -8,7 +10,7 @@ string._htmlspecialchars_set[">"] = "&gt;"
--[[-- --[[--
HTML HTML
~~~ lua ~~~ lua
-- print(string.htmlspecialchars("<ABC>")) print(string.htmlspecialchars("<ABC>"))
-- 输出 &lt;ABC&gt; -- 输出 &lt;ABC&gt;
~~~ ~~~
@param string input @param string input
@ -24,7 +26,7 @@ end
--[[-- --[[--
HTML string.htmlspecialchars() HTML string.htmlspecialchars()
~~~ lua ~~~ lua
-- print(string.restorehtmlspecialchars("&lt;ABC&gt;")) print(string.restorehtmlspecialchars("&lt;ABC&gt;"))
-- 输出 <ABC> -- 输出 <ABC>
~~~ ~~~
@param string input @param string input
@ -40,7 +42,7 @@ end
--[[-- --[[--
\n HTML \n HTML
~~~ lua ~~~ lua
-- print(string.nl2br("Hello\nWorld")) print(string.nl2br("Hello\nWorld"))
-- 输出 -- 输出
-- Hello<br />World -- Hello<br />World
~~~ ~~~
@ -54,7 +56,7 @@ end
--[[-- --[[--
\n HTML \n HTML
~~~ lua ~~~ lua
-- print(string.nl2br("<Hello>\nWorld")) print(string.nl2br("<Hello>\nWorld"))
-- 输出 -- 输出
-- &lt;Hello&gt;<br />World -- &lt;Hello&gt;<br />World
~~~ ~~~
@ -86,10 +88,10 @@ local res = string.split(input, "-+-")
function string.split(input, delimiter) function string.split(input, delimiter)
input = tostring(input) input = tostring(input)
delimiter = tostring(delimiter) delimiter = tostring(delimiter)
if (delimiter == '') then return false end if (delimiter=='') then return false end
local pos, arr = 0, {} local pos,arr = 0, {}
-- for each divider found -- for each divider found
for st, sp in function() return string.find(input, delimiter, pos, true) end do for st,sp in function() return string.find(input, delimiter, pos, true) end do
table.insert(arr, string.sub(input, pos, st - 1)) table.insert(arr, string.sub(input, pos, st - 1))
pos = sp + 1 pos = sp + 1
end end
@ -101,7 +103,7 @@ end
~~~ lua ~~~ lua
local input = " ABC" local input = " ABC"
-- print(string.ltrim(input)) print(string.ltrim(input))
-- 输出 ABC输入字符串前面的两个空格被去掉了 -- 输出 ABC输入字符串前面的两个空格被去掉了
~~~ ~~~
@ -121,7 +123,7 @@ end
~~~ lua ~~~ lua
local input = "ABC " local input = "ABC "
-- print(string.ltrim(input)) print(string.ltrim(input))
-- 输出 ABC输入字符串最后的两个空格被去掉了 -- 输出 ABC输入字符串最后的两个空格被去掉了
~~~ ~~~
@param string input @param string input
@ -147,7 +149,7 @@ end
~~~ lua ~~~ lua
local input = "hello" local input = "hello"
-- print(string.ucfirst(input)) print(string.ucfirst(input))
-- 输出 Hello -- 输出 Hello
~~~ ~~~
@param string input @param string input
@ -165,7 +167,7 @@ end
URL URL
~~~ lua ~~~ lua
local input = "hello world" local input = "hello world"
-- print(string.urlencode(input)) print(string.urlencode(input))
-- 输出 -- 输出
-- hello%20world -- hello%20world
~~~ ~~~
@ -186,7 +188,7 @@ end
URL URL
~~~ lua ~~~ lua
local input = "hello%20world" local input = "hello%20world"
-- print(string.urldecode(input)) print(string.urldecode(input))
-- 输出 -- 输出
-- hello world -- hello world
~~~ ~~~
@ -195,9 +197,9 @@ local input = "hello%20world"
@see string.urlencode @see string.urlencode
]] ]]
function string.urldecode(input) function string.urldecode(input)
input = string.gsub(input, "+", " ") input = string.gsub (input, "+", " ")
input = string.gsub(input, "%%(%x%x)", function(h) return string.char(checknumber(h, 16)) end) input = string.gsub (input, "%%(%x%x)", function(h) return string.char(checknumber(h,16)) end)
input = string.gsub(input, "\r\n", "\n") input = string.gsub (input, "\r\n", "\n")
return input return input
end end
@ -205,7 +207,7 @@ end
UTF8 UTF8
~~~ lua ~~~ lua
local input = "你好World" local input = "你好World"
-- print(string.utf8len(input)) print(string.utf8len(input))
-- 输出 7 -- 输出 7
~~~ ~~~
@param string input @param string input
@ -217,7 +219,7 @@ function string.utf8len(input)
local len = string.len(input) local len = string.len(input)
local left = len local left = len
local cnt = 0 local cnt = 0
local arr = { 0, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc } local arr = {0, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc}
while left ~= 0 do while left ~= 0 do
local tmp = string.byte(input, -left) local tmp = string.byte(input, -left)
local i = #arr local i = #arr
@ -249,7 +251,7 @@ function string.utf8sub(input, index, endIndex)
local left = len local left = len
local cnt = 0 local cnt = 0
local head, tail = 0, 0 local head, tail = 0, 0
local arr = { 0, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc } local arr = {0, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc}
while left ~= 0 do while left ~= 0 do
if cnt + 1 == index then if cnt + 1 == index then
head = len - left + 1 head = len - left + 1
@ -276,7 +278,7 @@ end
--[[-- --[[--
~~~ lua ~~~ lua
-- print(string.formatnumberthousands(1924235)) print(string.formatnumberthousands(1924235))
-- 输出 1,924,235 -- 输出 1,924,235
~~~ ~~~
@param number num @param number num
@ -292,11 +294,12 @@ function string.formatnumberthousands(num)
return formatted return formatted
end end
function string.concat(...)
function string.concat( ... )
local str = {} local str = {}
local tem = { ... } local tem = {...}
for _, v in ipairs(tem) do for _,v in ipairs(tem) do
str[#str + 1] = v str[#str + 1] = v
end end
return table.concat(str, "") return table.concat(str , "")
end end

View File

@ -48,11 +48,11 @@ OnInit、DoHideAnimation、DoShowAnimation、OnShown、OnHide。
MyWinClass = fgui.window_class() MyWinClass = fgui.window_class()
function MyWinClass:ctor() function MyWinClass:ctor()
-- print('MyWinClass-ctor') print('MyWinClass-ctor')
self.contentPane = UIPackage.CreateObject("Basics", "WindowA") self.contentPane = UIPackage.CreateObject("Basics", "WindowA")
end end
function MyWinClass:OnShown() function MyWinClass:OnShown()
-- print('MyWinClass-onShown') print('MyWinClass-onShown')
end end
local win = MyWinClass.New() local win = MyWinClass.New()
win:Show() win:Show()
@ -74,7 +74,7 @@ function fgui.window_class(base)
tolua.setpeer(ins, t) tolua.setpeer(ins, t)
ins:SetLuaPeer(t) ins:SetLuaPeer(t)
if t.ctor then if t.ctor then
t.ctor(ins, ...) t.ctor(ins,...)
end end
return ins return ins
@ -92,12 +92,12 @@ MyButton = fgui.extension_class(GButton)
fgui.register_extension("ui://包名/我的按钮", MyButton) fgui.register_extension("ui://包名/我的按钮", MyButton)
function MyButton:ctor() --当组件构建完成时此方法被调用 function MyButton:ctor() --当组件构建完成时此方法被调用
-- print(self:GetChild("n1")) print(self:GetChild("n1"))
end end
--添加自定义的方法和字段 --添加自定义的方法和字段
function MyButton:Test() function MyButton:Test()
-- print('test') print('test')
end end
local get = tolua.initget(MyButton) local get = tolua.initget(MyButton)
@ -133,7 +133,7 @@ function fgui.extension_class(base)
o.Extend = function(ins) o.Extend = function(ins)
local t = {} local t = {}
setmetatable(t, o) setmetatable(t, o)
tolua.setpeer(ins, t) tolua.setpeer(ins,t)
return t return t
end end

View File

@ -30,8 +30,8 @@ function ControllerManager.Init()
_controllerMap[GroupMgrController] = GroupMgrController.new() _controllerMap[GroupMgrController] = GroupMgrController.new()
local hostIp = GetGameInfo("login_url") local hostIp = GetGameInfo("login_url")
if (debug_print) then if(debug_print) then
-- print("hostIp:::" .. hostIp) print("hostIp:::"..hostIp)
end end
ControllerManager.WebClient = NetClient.new(hostIp, "majiang", ConnectionProtocol.Web) ControllerManager.WebClient = NetClient.new(hostIp, "majiang", ConnectionProtocol.Web)
--ControllerManager.GroupClient = nil--NetClient.new("http://192.168.0.1:8081/", "web_group", ConnectionProtocol.Web) --ControllerManager.GroupClient = nil--NetClient.new("http://192.168.0.1:8081/", "web_group", ConnectionProtocol.Web)
@ -76,7 +76,6 @@ function ControllerManager.SetGameNetClient(client)
end end
function ControllerManager.OnConnect(code) function ControllerManager.OnConnect(code)
-- print("=======================================ControllerManager", code)
if (code ~= SocketCode.Connect) then if (code ~= SocketCode.Connect) then
ControllerManager.SetGameNetClient(nil) ControllerManager.SetGameNetClient(nil)
if code ~= SocketCode.DisconnectByServer then if code ~= SocketCode.DisconnectByServer then

View File

@ -49,7 +49,7 @@ end
function TableBG.GetTableBG(game_id) function TableBG.GetTableBG(game_id)
local id = -1 local id = -1
local json_data = Utils.LoadLocalFile(DataManager.SelfUser.account_id .. DataManager.SelfUser.invite_code) local json_data = Utils.LoadLocalFile(DataManager.SelfUser.account_id .. DataManager.SelfUser.invite_code)
-- -- print(DataManager.SelfUser.invite_code, DataManager.SelfUser.account_id) -- print(DataManager.SelfUser.invite_code, DataManager.SelfUser.account_id)
if json_data ~= nil then if json_data ~= nil then
local config_data = json.decode(json_data) local config_data = json.decode(json_data)
id = GetBG(config_data, game_id) id = GetBG(config_data, game_id)

View File

@ -303,9 +303,6 @@ function M:UpdateFamilyRoom(fgCtr, id)
} }
end end
local roomList = self._group.rooms local roomList = self._group.rooms
-- print("=========================playList,rooms")
pt(playList)
pt(roomList)
local roomCtr = ControllerManager.GetController(RoomController) local roomCtr = ControllerManager.GetController(RoomController)
list_room.itemRenderer = function(index, obj) list_room.itemRenderer = function(index, obj)
if index < #roomList then if index < #roomList then

View File

@ -53,7 +53,7 @@ local function __NetTip(txt_msg)
end end
local function __OnGameConnectAction(state) local function __OnGameConnectAction(state)
---- print("state:"..state) --print("state:"..state)
NetResetConnectWindow.CloseNetReset() NetResetConnectWindow.CloseNetReset()
if state == SocketCode.Connect then if state == SocketCode.Connect then
ViewManager.ChangeView(ViewManager.View_Main, DataManager.CurrenRoom.game_id) ViewManager.ChangeView(ViewManager.View_Main, DataManager.CurrenRoom.game_id)
@ -150,14 +150,14 @@ function ViewManager.ChangeView(id, game_id, callback)
end end
function ViewManager.OnApplicationPause() function ViewManager.OnApplicationPause()
-- -- print("game pause") -- print("game pause")
if (_currenView ~= nil) then if (_currenView ~= nil) then
_currenView:OnApplicationPause() _currenView:OnApplicationPause()
end end
end end
function ViewManager.OnApplicationActive() function ViewManager.OnApplicationActive()
-- -- print("game active") -- print("game active")
if (_currenView ~= nil) then if (_currenView ~= nil) then
_currenView:OnApplicationActive() _currenView:OnApplicationActive()
end end

View File

@ -1,7 +1,7 @@
local debugger_reLoadFile = nil local debugger_reLoadFile =nil
xpcall(function() xpcall(function()
debugger_reLoadFile = require("luaideReLoadFile") debugger_reLoadFile = require("luaideReLoadFile")
end, function() end,function()
debugger_reLoadFile = function() print("未实现代码重载") end debugger_reLoadFile = function() print("未实现代码重载") end
end) end)
local debugger_stackInfo = nil local debugger_stackInfo = nil
@ -392,7 +392,6 @@ local function createJson()
function json.null() function json.null()
return json.null -- so json.null() will also return null ;-) return json.null -- so json.null() will also return null ;-)
end end
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
-- Internal, PRIVATE functions. -- Internal, PRIVATE functions.
-- Following a Python-like convention, I have prefixed all these 'PRIVATE' -- Following a Python-like convention, I have prefixed all these 'PRIVATE'
@ -450,8 +449,8 @@ local function createJson()
-- @return object, int The object (true, false or nil) and the position at which the next character should be -- @return object, int The object (true, false or nil) and the position at which the next character should be
-- scanned. -- scanned.
function decode_scanConstant(s, startPos) function decode_scanConstant(s, startPos)
local consts = { ["true"] = true, ["false"] = false, ["null"] = nil } local consts = {["true"] = true, ["false"] = false, ["null"] = nil}
local constNames = { "true", "false", "null" } local constNames = {"true", "false", "null"}
for i, k in pairs(constNames) do for i, k in pairs(constNames) do
if string.sub(s, startPos, startPos + string.len(k) - 1) == k then if string.sub(s, startPos, startPos + string.len(k) - 1) == k then
@ -777,17 +776,17 @@ function print(...)
end end
if (LuaDebugger.isProntToConsole == 1 or LuaDebugger.isProntToConsole == 2) then if (LuaDebugger.isProntToConsole == 1 or LuaDebugger.isProntToConsole == 2) then
if (debug_server) then if (debug_server) then
local arg = { ... } --这里的...和{}符号中间需要有空格号,否则会出错 local arg = {...} --这里的...和{}符号中间需要有空格号,否则会出错
local str = "" local str = ""
if (#arg == 0) then if (#arg == 0) then
arg = { "nil" } arg = {"nil"}
end end
for k, v in pairs(arg) do for k, v in pairs(arg) do
str = str .. tostring(v) .. "\t" str = str .. tostring(v) .. "\t"
end end
local sendMsg = { local sendMsg = {
event = LuaDebugger.event.C2S_LuaPrint, event = LuaDebugger.event.C2S_LuaPrint,
data = { msg = ZZBase64.encode(str), type = 1 } data = {msg = ZZBase64.encode(str), type = 1}
} }
local sendStr = json.encode(sendMsg) local sendStr = json.encode(sendMsg)
debug_server:send(sendStr .. "__debugger_k0204__") debug_server:send(sendStr .. "__debugger_k0204__")
@ -801,48 +800,46 @@ function luaIdePrintWarn(...)
end end
if (LuaDebugger.isProntToConsole == 1 or LuaDebugger.isProntToConsole == 2) then if (LuaDebugger.isProntToConsole == 1 or LuaDebugger.isProntToConsole == 2) then
if (debug_server) then if (debug_server) then
local arg = { ... } --这里的...和{}符号中间需要有空格号,否则会出错 local arg = {...} --这里的...和{}符号中间需要有空格号,否则会出错
local str = "" local str = ""
if (#arg == 0) then if (#arg == 0) then
arg = { "nil" } arg = {"nil"}
end end
for k, v in pairs(arg) do for k, v in pairs(arg) do
str = str .. tostring(v) .. "\t" str = str .. tostring(v) .. "\t"
end end
local sendMsg = { local sendMsg = {
event = LuaDebugger.event.C2S_LuaPrint, event = LuaDebugger.event.C2S_LuaPrint,
data = { msg = ZZBase64.encode(str), type = 2 } data = {msg = ZZBase64.encode(str), type = 2}
} }
local sendStr = json.encode(sendMsg) local sendStr = json.encode(sendMsg)
debug_server:send(sendStr .. "__debugger_k0204__") debug_server:send(sendStr .. "__debugger_k0204__")
end end
end end
end end
function luaIdePrintErr(...) function luaIdePrintErr(...)
if (LuaDebugger.isProntToConsole == 1 or LuaDebugger.isProntToConsole == 3) then if (LuaDebugger.isProntToConsole == 1 or LuaDebugger.isProntToConsole == 3) then
debugger_print(...) debugger_print(...)
end end
if (LuaDebugger.isProntToConsole == 1 or LuaDebugger.isProntToConsole == 2) then if (LuaDebugger.isProntToConsole == 1 or LuaDebugger.isProntToConsole == 2) then
if (debug_server) then if (debug_server) then
local arg = { ... } --这里的...和{}符号中间需要有空格号,否则会出错 local arg = {...} --这里的...和{}符号中间需要有空格号,否则会出错
local str = "" local str = ""
if (#arg == 0) then if (#arg == 0) then
arg = { "nil" } arg = {"nil"}
end end
for k, v in pairs(arg) do for k, v in pairs(arg) do
str = str .. tostring(v) .. "\t" str = str .. tostring(v) .. "\t"
end end
local sendMsg = { local sendMsg = {
event = LuaDebugger.event.C2S_LuaPrint, event = LuaDebugger.event.C2S_LuaPrint,
data = { msg = ZZBase64.encode(str), type = 3 } data = {msg = ZZBase64.encode(str), type = 3}
} }
local sendStr = json.encode(sendMsg) local sendStr = json.encode(sendMsg)
debug_server:send(sendStr .. "__debugger_k0204__") debug_server:send(sendStr .. "__debugger_k0204__")
end end
end end
end end
--@endregion --@endregion
--@region 辅助方法 --@region 辅助方法
@ -980,7 +977,7 @@ local function debugger_dump(value, desciption, nesting)
return tostring(v) return tostring(v)
end end
local traceback = debugger_strSplit(debug.traceback("", 2), "\n") local traceback = debugger_strSplit(debug.traceback("", 2), "\n")
-- print("dump from: " .. debugger_strTrim(traceback[3])) print("dump from: " .. debugger_strTrim(traceback[3]))
local function _dump(value, desciption, indent, nest, keylen) local function _dump(value, desciption, indent, nest, keylen)
desciption = desciption or "<var>" desciption = desciption or "<var>"
local spc = "" local spc = ""
@ -1029,7 +1026,7 @@ local function debugger_dump(value, desciption, nesting)
end end
_dump(value, desciption, "- ", 1) _dump(value, desciption, "- ", 1)
for i, line in ipairs(result) do for i, line in ipairs(result) do
-- print(line) print(line)
end end
end end
--@endregion --@endregion
@ -1038,7 +1035,9 @@ local function debugger_valueToString(v)
local vstr = nil local vstr = nil
if (vtype == "userdata") then if (vtype == "userdata") then
if (LuaDebugger.isFoxGloryProject) then if (LuaDebugger.isFoxGloryProject) then
return "userdata", vtype
return "userdata",vtype
else else
return tostring(v), vtype return tostring(v), vtype
end end
@ -1046,11 +1045,11 @@ local function debugger_valueToString(v)
local value = vtype local value = vtype
xpcall(function() xpcall(function()
value = tostring(v) value = tostring(v)
end, function() end,function()
value = vtype value = vtype
end) end)
return value, vtype return value, vtype
elseif (vtype == "number" or vtype == "string") then elseif (vtype == "number" or vtype == "string" ) then
return v, vtype return v, vtype
else else
return tostring(v), vtype return tostring(v), vtype
@ -1058,12 +1057,12 @@ local function debugger_valueToString(v)
end end
local function debugger_setVarInfo(name, value) local function debugger_setVarInfo(name, value)
local valueStr, valueType = debugger_valueToString(value) local valueStr, valueType = debugger_valueToString(value)
local nameStr, nameType = debugger_valueToString(name) local nameStr,nameType = debugger_valueToString(name)
if (valueStr == nil) then if(valueStr == nil) then
valueStr = valueType valueStr = valueType
end end
local valueInfo = { local valueInfo = {
name = nameStr, name =nameStr,
valueType = valueType, valueType = valueType,
valueStr = ZZBase64.encode(valueStr) valueStr = ZZBase64.encode(valueStr)
} }
@ -1101,7 +1100,7 @@ local function debugger_getvalue(f)
i = i + 1 i = i + 1
end end
return { locals = locals, ups = ups } return {locals = locals, ups = ups}
end end
--获取堆栈 --获取堆栈
debugger_stackInfo = debugger_stackInfo =
@ -1147,7 +1146,7 @@ debugger_stackInfo =
end end
end end
local stackInfo = { stack = stack, vars = varInfos, funcs = funcs } local stackInfo = {stack = stack, vars = varInfos, funcs = funcs}
local data = { local data = {
stack = stackInfo.stack, stack = stackInfo.stack,
vars = stackInfo.vars, vars = stackInfo.vars,
@ -1158,7 +1157,7 @@ debugger_stackInfo =
} }
LuaDebugger.currentTempFunc = data.funcs[1] LuaDebugger.currentTempFunc = data.funcs[1]
return data return data
end end
--===========================点断信息================================================== --===========================点断信息==================================================
--根据不同的游戏引擎进行定时获取断点信息 --根据不同的游戏引擎进行定时获取断点信息
@ -1168,12 +1167,12 @@ local function debugger_receiveDebugBreakInfo()
if (jit) then if (jit) then
if (LuaDebugger.debugLuaType ~= "jit") then if (LuaDebugger.debugLuaType ~= "jit") then
local msg = "当前luajit版本为: " .. jit.version .. " 请使用LuaDebugjit 进行调试!" local msg = "当前luajit版本为: " .. jit.version .. " 请使用LuaDebugjit 进行调试!"
-- print(msg) print(msg)
end end
end end
if (breakInfoSocket) then if (breakInfoSocket) then
local msg, status = breakInfoSocket:receive() local msg, status = breakInfoSocket:receive()
if (LuaDebugger.isLaunch and status == "closed") then if(LuaDebugger.isLaunch and status == "closed") then
os.exit() os.exit()
end end
if (msg) then if (msg) then
@ -1183,12 +1182,12 @@ local function debugger_receiveDebugBreakInfo()
elseif netData.event == LuaDebugger.event.S2C_LoadLuaScript then elseif netData.event == LuaDebugger.event.S2C_LoadLuaScript then
LuaDebugger.loadScriptBody = netData.data LuaDebugger.loadScriptBody = netData.data
debugger_exeLuaString() debugger_exeLuaString()
debugger_sendMsg(breakInfoSocket, LuaDebugger.event.C2S_LoadLuaScript, LuaDebugger.loadScriptBody) debugger_sendMsg(breakInfoSocket,LuaDebugger.event.C2S_LoadLuaScript,LuaDebugger.loadScriptBody)
elseif netData.event == LuaDebugger.event.S2C_ReLoadFile then elseif netData.event == LuaDebugger.event.S2C_ReLoadFile then
LuaDebugger.reLoadFileBody = netData.data LuaDebugger.reLoadFileBody = netData.data
LuaDebugger.isReLoadFile = false LuaDebugger.isReLoadFile = false
LuaDebugger.reLoadFileBody.isReLoad = debugger_reLoadFile(LuaDebugger.reLoadFileBody) LuaDebugger.reLoadFileBody.isReLoad = debugger_reLoadFile(LuaDebugger.reLoadFileBody)
-- print("重载结果:",LuaDebugger.reLoadFileBody.isReLoad) print("重载结果:",LuaDebugger.reLoadFileBody.isReLoad)
LuaDebugger.reLoadFileBody.script = nil LuaDebugger.reLoadFileBody.script = nil
debugger_sendMsg( debugger_sendMsg(
breakInfoSocket, breakInfoSocket,
@ -1291,7 +1290,7 @@ debugger_setBreak =
end end
LuaDebugger.isHook = false LuaDebugger.isHook = false
end end
end end
local function debugger_checkFileIsBreak(fileName) local function debugger_checkFileIsBreak(fileName)
return LuaDebugger.breakInfos[fileName] return LuaDebugger.breakInfos[fileName]
end end
@ -1323,7 +1322,7 @@ function debugger_conditionStr(condition, vars, callBack)
currentTabble[k] = v currentTabble[k] = v
end end
end end
setmetatable(currentTabble, { __index = _G }) setmetatable(currentTabble, {__index = _G})
local fun = loadstring("return " .. condition) local fun = loadstring("return " .. condition)
setfenv(fun, currentTabble) setfenv(fun, currentTabble)
return fun() return fun()
@ -1333,20 +1332,21 @@ function debugger_conditionStr(condition, vars, callBack)
xpcall( xpcall(
loadScript, loadScript,
function(error) function(error)
-- print(error) print(error)
end end
) )
if (status and msg) then if (status and msg) then
callBack() callBack()
end end
end end
--执行lua字符串 --执行lua字符串
debugger_exeLuaString = function() debugger_exeLuaString = function()
local function loadScript() local function loadScript()
local script = LuaDebugger.loadScriptBody.script local script = LuaDebugger.loadScriptBody.script
if (LuaDebugger.loadScriptBody.isBreak) then if (LuaDebugger.loadScriptBody.isBreak) then
local currentTabble = { _G = _G } local currentTabble = {_G = _G}
local frameId = LuaDebugger.loadScriptBody.frameId local frameId = LuaDebugger.loadScriptBody.frameId
frameId = frameId frameId = frameId
local func = LuaDebugger.currentDebuggerData.funcs[frameId] local func = LuaDebugger.currentDebuggerData.funcs[frameId]
@ -1359,7 +1359,7 @@ debugger_exeLuaString = function()
for k, v in pairs(locals) do for k, v in pairs(locals) do
currentTabble[k] = v currentTabble[k] = v
end end
setmetatable(currentTabble, { __index = _G }) setmetatable(currentTabble, {__index = _G})
local fun = loadstring(script) local fun = loadstring(script)
setfenv(fun, currentTabble) setfenv(fun, currentTabble)
@ -1374,47 +1374,50 @@ debugger_exeLuaString = function()
xpcall( xpcall(
loadScript, loadScript,
function(error) function(error)
-- debugger_sendMsg(debug_server, LuaDebugger.event.C2S_LoadLuaScript, LuaDebugger.loadScriptBody) -- debugger_sendMsg(debug_server, LuaDebugger.event.C2S_LoadLuaScript, LuaDebugger.loadScriptBody)
end end
) )
LuaDebugger.loadScriptBody.script = nil LuaDebugger.loadScriptBody.script = nil
if (LuaDebugger.loadScriptBody.isBreak) then if (LuaDebugger.loadScriptBody.isBreak) then
LuaDebugger.serVarLevel = LuaDebugger.serVarLevel + 1 LuaDebugger.serVarLevel = LuaDebugger.serVarLevel+1
LuaDebugger.currentDebuggerData = debugger_stackInfo(LuaDebugger.serVarLevel, LuaDebugger.event LuaDebugger.currentDebuggerData = debugger_stackInfo(LuaDebugger.serVarLevel, LuaDebugger.event.C2S_HITBreakPoint)
.C2S_HITBreakPoint)
LuaDebugger.loadScriptBody.stack = LuaDebugger.currentDebuggerData.stack LuaDebugger.loadScriptBody.stack = LuaDebugger.currentDebuggerData.stack
end end
LuaDebugger.loadScriptBody.complete = true LuaDebugger.loadScriptBody.complete = true
end end
--@region 调试中修改变量值 --@region 调试中修改变量值
--根据key 值在 value 查找 --根据key 值在 value 查找
local function debugger_getTablekey(key, keyType, value) local function debugger_getTablekey(key,keyType,value)
if (keyType == -1) then if(keyType == -1) then
return key return key
elseif (keyType == 1) then elseif(keyType == 1) then
return tonumber(key) return tonumber(key)
elseif (keyType == 2) then elseif(keyType == 2) then
local valueKey = nil local valueKey = nil
for k, v in pairs(value) do for k,v in pairs(value) do
local nameType = type(k) local nameType = type(k)
if (nameType == "userdata" or nameType == "table") then if(nameType == "userdata" or nameType == "table") then
if (not LuaDebugger.isFoxGloryProject) then if (not LuaDebugger.isFoxGloryProject) then
valueKey = tostring(k) valueKey = tostring(k)
if (key == valueKey) then if(key == valueKey) then
return k return k
end end
break break
end end
end end
end end
end end
end end
local function debugger_setVarValue(server, data) local function debugger_setVarValue(server, data)
local newValue = nil local newValue = nil
local level = LuaDebugger.serVarLevel + LuaDebugger.setVarBody.frameId local level = LuaDebugger.serVarLevel+LuaDebugger.setVarBody.frameId
local firstKeyName = data.keys[1] local firstKeyName = data.keys[1]
--@region vars check --@region vars check
local localValueChangeIndex = -1 local localValueChangeIndex = -1
@ -1429,7 +1432,7 @@ local function debugger_setVarValue(server, data)
if not name then if not name then
break break
end end
if (firstKeyName == name) then if(firstKeyName == name) then
localValueChangeIndex = i localValueChangeIndex = i
oldValue = value oldValue = value
end end
@ -1447,7 +1450,7 @@ local function debugger_setVarValue(server, data)
if not name then if not name then
break break
end end
if (localValueChangeIndex == -1 and firstKeyName == name) then if(localValueChangeIndex == -1 and firstKeyName == name) then
upValueFun = func upValueFun = func
oldValue = value oldValue = value
upValueChangeIndex = i upValueChangeIndex = i
@ -1459,8 +1462,8 @@ local function debugger_setVarValue(server, data)
end end
i = i + 1 i = i + 1
end end
--@endregion --@endregion
local vars = { locals = locals, ups = ups } local vars = {locals = locals, ups = ups}
local function loadScript() local function loadScript()
local currentTabble = {} local currentTabble = {}
@ -1477,7 +1480,7 @@ local function debugger_setVarValue(server, data)
currentTabble[k] = v currentTabble[k] = v
end end
end end
setmetatable(currentTabble, { __index = _G }) setmetatable(currentTabble, {__index = _G})
local fun = loadstring("return " .. data.value) local fun = loadstring("return " .. data.value)
setfenv(fun, currentTabble) setfenv(fun, currentTabble)
newValue = fun() newValue = fun()
@ -1487,7 +1490,7 @@ local function debugger_setVarValue(server, data)
xpcall( xpcall(
loadScript, loadScript,
function(error) function(error)
-- print(error, "============================") print(error, "============================")
end end
) )
@ -1496,37 +1499,39 @@ local function debugger_setVarValue(server, data)
-- local 查找并替换 -- local 查找并替换
local keyLength = #data.keys local keyLength = #data.keys
if (keyLength == 1) then if(keyLength == 1) then
if (localValueChangeIndex ~= -1) then if(localValueChangeIndex ~= -1) then
debug.setlocal(level, localValueChangeIndex, newValue) debug.setlocal(level, localValueChangeIndex, newValue)
elseif (upValueFun ~= nil) then elseif(upValueFun ~= nil) then
debug.setupvalue(upValueFun, upValueChangeIndex, newValue) debug.setupvalue( upValueFun, upValueChangeIndex, newValue )
else else
--全局变量查找 --全局变量查找
if (_G[firstKeyName]) then if(_G[firstKeyName]) then
_G[firstKeyName] = newValue _G[firstKeyName] = newValue
end end
end end
else else
if (not oldValue) then if(not oldValue) then
if (_G[firstKeyName]) then if(_G[firstKeyName]) then
oldValue = _G[firstKeyName] oldValue = _G[firstKeyName]
end end
end end
local tempValue = oldValue local tempValue = oldValue
for i = 2, keyLength - 1 do for i=2,keyLength-1 do
if (tempValue) then if(tempValue) then
oldValue = oldValue[debugger_getTablekey(data.keys[i], data.numberTypes[i], oldValue)] oldValue = oldValue[debugger_getTablekey(data.keys[i],data.numberTypes[i],oldValue)]
end end
end end
if (tempValue) then if(tempValue) then
oldValue[debugger_getTablekey(data.keys[keyLength], data.numberTypes[keyLength], oldValue)] = newValue oldValue[debugger_getTablekey(data.keys[keyLength],data.numberTypes[keyLength],oldValue)] = newValue
end end
end end
local varInfo = debugger_setVarInfo(data.varName, newValue) local varInfo = debugger_setVarInfo(data.varName, newValue)
data.varInfo = varInfo data.varInfo = varInfo
LuaDebugger.serVarLevel = LuaDebugger.serVarLevel + 1 LuaDebugger.serVarLevel = LuaDebugger.serVarLevel+1
LuaDebugger.currentDebuggerData = debugger_stackInfo(LuaDebugger.serVarLevel, LuaDebugger.event.C2S_HITBreakPoint) LuaDebugger.currentDebuggerData = debugger_stackInfo(LuaDebugger.serVarLevel, LuaDebugger.event.C2S_HITBreakPoint)
end end
--@endregion --@endregion
@ -1538,41 +1543,41 @@ checkSetVar =
function() function()
if (LuaDebugger.isSetVar) then if (LuaDebugger.isSetVar) then
LuaDebugger.isSetVar = false LuaDebugger.isSetVar = false
debugger_setVarValue(debug_server, LuaDebugger.setVarBody) debugger_setVarValue(debug_server,LuaDebugger.setVarBody)
LuaDebugger.serVarLevel = LuaDebugger.serVarLevel + 1 LuaDebugger.serVarLevel = LuaDebugger.serVarLevel+1
_resume(coro_debugger, LuaDebugger.setVarBody) _resume(coro_debugger, LuaDebugger.setVarBody)
xpcall( xpcall(
checkSetVar, checkSetVar,
function(error) function(error)
-- print("设置变量", error) print("设置变量", error)
end end
) )
elseif (LuaDebugger.isLoadLuaScript) then elseif(LuaDebugger.isLoadLuaScript) then
LuaDebugger.isLoadLuaScript = false LuaDebugger.isLoadLuaScript = false
debugger_exeLuaString() debugger_exeLuaString()
LuaDebugger.serVarLevel = LuaDebugger.serVarLevel + 1 LuaDebugger.serVarLevel = LuaDebugger.serVarLevel+1
_resume(coro_debugger, LuaDebugger.reLoadFileBody) _resume(coro_debugger, LuaDebugger.reLoadFileBody)
xpcall( xpcall(
checkSetVar, checkSetVar,
function(error) function(error)
-- print("执行代码", error) print("执行代码", error)
end end
) )
elseif (LuaDebugger.isReLoadFile) then elseif(LuaDebugger.isReLoadFile) then
LuaDebugger.isReLoadFile = false LuaDebugger.isReLoadFile = false
LuaDebugger.reLoadFileBody.isReLoad = debugger_reLoadFile(LuaDebugger.reLoadFileBody) LuaDebugger.reLoadFileBody.isReLoad = debugger_reLoadFile(LuaDebugger.reLoadFileBody)
-- print("重载结果:",LuaDebugger.reLoadFileBody.isReLoad) print("重载结果:",LuaDebugger.reLoadFileBody.isReLoad)
LuaDebugger.reLoadFileBody.script = nil LuaDebugger.reLoadFileBody.script = nil
LuaDebugger.serVarLevel = LuaDebugger.serVarLevel + 1 LuaDebugger.serVarLevel = LuaDebugger.serVarLevel+1
_resume(coro_debugger, LuaDebugger.reLoadFileBody) _resume(coro_debugger, LuaDebugger.reLoadFileBody)
xpcall( xpcall(
checkSetVar, checkSetVar,
function(error) function(error)
-- print("重新加载文件", error) print("重新加载文件", error)
end end
) )
end end
end end
@ -1622,7 +1627,7 @@ local function debugger_getValueByScript(value, script)
val = fun() val = fun()
end, end,
function(error) function(error)
-- print(error, "====>") print(error, "====>")
val = nil val = nil
end end
) )
@ -1889,6 +1894,7 @@ local function debugger_sendTableValues(value, server, variablesReference, debug
vinfos = {} vinfos = {}
end end
end end
end end
else else
m = getmetatable(value) m = getmetatable(value)
@ -1938,6 +1944,7 @@ local function debugger_getBreakVar(body, server)
if (value) then if (value) then
local valueType = type(value) local valueType = type(value)
if (valueType == "table" or valueType == "userdata") then if (valueType == "table" or valueType == "userdata") then
debugger_sendTableValues(value, server, variablesReference, debugSpeedIndex) debugger_sendTableValues(value, server, variablesReference, debugSpeedIndex)
else else
if (valueType == "function") then if (valueType == "function") then
@ -1972,9 +1979,9 @@ local function debugger_getBreakVar(body, server)
xpcall( xpcall(
exe, exe,
function(error) function(error)
-- -- print("获取变量错误 错误消息-----------------") -- print("获取变量错误 错误消息-----------------")
-- -- print(error) -- print(error)
-- -- print(debug.traceback("", 2)) -- print(debug.traceback("", 2))
debugger_sendMsg( debugger_sendMsg(
server, server,
LuaDebugger.event.C2S_ReqVar, LuaDebugger.event.C2S_ReqVar,
@ -2011,7 +2018,7 @@ local function debugger_loop(server)
while true do while true do
local line, status = server:receive() local line, status = server:receive()
if (status == "closed") then if (status == "closed") then
if (LuaDebugger.isLaunch) then if(LuaDebugger.isLaunch) then
os.exit() os.exit()
else else
debug.sethook() debug.sethook()
@ -2023,12 +2030,13 @@ local function debugger_loop(server)
local event = netData.event local event = netData.event
local body = netData.data local body = netData.data
if (event == LuaDebugger.event.S2C_DebugClose) then if (event == LuaDebugger.event.S2C_DebugClose) then
if (LuaDebugger.isLaunch) then if(LuaDebugger.isLaunch) then
os.exit() os.exit()
else else
debug.sethook() debug.sethook()
coroutine.yield() coroutine.yield()
end end
elseif event == LuaDebugger.event.S2C_SetBreakPoints then elseif event == LuaDebugger.event.S2C_SetBreakPoints then
--设置断点信息 --设置断点信息
local function setB() local function setB()
@ -2037,7 +2045,7 @@ local function debugger_loop(server)
xpcall( xpcall(
setB, setB,
function(error) function(error)
-- print(error) print(error)
end end
) )
elseif event == LuaDebugger.event.S2C_RUN then --开始运行 elseif event == LuaDebugger.event.S2C_RUN then --开始运行
@ -2148,26 +2156,29 @@ local function debugger_loop(server)
end end
coro_debugger = coroutine.create(debugger_loop) coro_debugger = coroutine.create(debugger_loop)
debug_hook = function(event, line) debug_hook = function(event, line)
if (not LuaDebugger.isHook) then
if(not LuaDebugger.isHook) then
return return
end end
if (LuaDebugger.Run) then if(LuaDebugger.Run) then
if (event == "line") then if(event == "line") then
local isCheck = false local isCheck = false
for k, breakInfo in pairs(LuaDebugger.breakInfos) do for k, breakInfo in pairs(LuaDebugger.breakInfos) do
for bk, linesInfo in pairs(breakInfo) do for bk, linesInfo in pairs(breakInfo) do
if (linesInfo.lines and linesInfo.lines[line]) then
if(linesInfo.lines and linesInfo.lines[line]) then
isCheck = true isCheck = true
break break
end end
end end
if (isCheck) then if(isCheck) then
break break
end end
end end
if (not isCheck) then if(not isCheck) then
return return
end end
else else
@ -2198,7 +2209,7 @@ debug_hook = function(event, line)
return return
end end
-- debugger_dump(LuaDebugger,"LuaDebugger") -- debugger_dump(LuaDebugger,"LuaDebugger")
-- -- print(LuaDebugger.StepNextLevel,"LuaDebugger.StepNextLevel") -- print(LuaDebugger.StepNextLevel,"LuaDebugger.StepNextLevel")
local file = nil local file = nil
if (event == "call") then if (event == "call") then
-- end -- end
@ -2206,7 +2217,7 @@ debug_hook = function(event, line)
if (not LuaDebugger.Run) then if (not LuaDebugger.Run) then
LuaDebugger.StepNextLevel = LuaDebugger.StepNextLevel + 1 LuaDebugger.StepNextLevel = LuaDebugger.StepNextLevel + 1
end end
-- -- print("stepIn",LuaDebugger.StepNextLevel) -- print("stepIn",LuaDebugger.StepNextLevel)
local stepInfo = getinfo(2, "S") local stepInfo = getinfo(2, "S")
local source = stepInfo.source local source = stepInfo.source
@ -2248,6 +2259,7 @@ debug_hook = function(event, line)
local breakInfo = LuaDebugger.breakInfos[file] local breakInfo = LuaDebugger.breakInfos[file]
local breakData = nil local breakData = nil
if (breakInfo) then if (breakInfo) then
local ischeck = false local ischeck = false
for k, lineInfo in pairs(breakInfo) do for k, lineInfo in pairs(breakInfo) do
local lines = lineInfo.lines local lines = lineInfo.lines
@ -2287,13 +2299,13 @@ debug_hook = function(event, line)
end end
pathNamesCount = pathNamesCount - 1 pathNamesCount = pathNamesCount - 1
hitPathNamesCount = hitPathNamesCount - 1 hitPathNamesCount = hitPathNamesCount - 1
checkCount = checkCount + 1 checkCount = checkCount+1
if (pathNamesCount <= 0 or hitPathNamesCount <= 0) then if (pathNamesCount <= 0 or hitPathNamesCount <= 0) then
break break
end end
end end
if (checkCount > 0) then if(checkCount>0) then
break; break;
end end
else else
@ -2372,7 +2384,7 @@ end
local function debugger_xpcall() local function debugger_xpcall()
--调用 coro_debugger 并传入 参数 --调用 coro_debugger 并传入 参数
local data = debugger_stackInfo(4, LuaDebugger.event.C2S_HITBreakPoint) local data = debugger_stackInfo(4, LuaDebugger.event.C2S_HITBreakPoint)
if (data.stack and data.stack[1]) then if(data.stack and data.stack[1]) then
data.stack[1].isXpCall = true data.stack[1].isXpCall = true
end end
--挂起等待调试器作出反应 --挂起等待调试器作出反应
@ -2384,8 +2396,8 @@ local function start()
local fullName, dirName, fileName = debugger_getFilePathInfo(getinfo(1).source) local fullName, dirName, fileName = debugger_getFilePathInfo(getinfo(1).source)
LuaDebugger.DebugLuaFie = fileName LuaDebugger.DebugLuaFie = fileName
local socket = createSocket() local socket = createSocket()
-- print(controller_host) print(controller_host)
-- print(controller_port) print(controller_port)
local server = socket.connect(controller_host, controller_port) local server = socket.connect(controller_host, controller_port)
debug_server = server debug_server = server
@ -2415,15 +2427,15 @@ local function start()
debug.sethook(debug_hook, "lrc") debug.sethook(debug_hook, "lrc")
end, end,
function(error) function(error)
-- print("error:", error) print("error:", error)
end end
) )
if (jit) then if (jit) then
if (LuaDebugger.debugLuaType ~= "jit") then if (LuaDebugger.debugLuaType ~= "jit") then
-- print("error======================================================") print("error======================================================")
local msg = "当前luajit版本为: " .. jit.version .. " 请使用LuaDebugjit 进行调试!" local msg = "当前luajit版本为: " .. jit.version .. " 请使用LuaDebugjit 进行调试!"
-- print(msg) print(msg)
end end
end end
_resume(coro_debugger, server) _resume(coro_debugger, server)
@ -2432,16 +2444,16 @@ local function start()
end end
function StartDebug(host, port) function StartDebug(host, port)
if (not host) then if (not host) then
-- print("error host nil") print("error host nil")
end end
if (not port) then if (not port) then
-- print("error prot nil") print("error prot nil")
end end
if (type(host) ~= "string") then if (type(host) ~= "string") then
-- print("error host not string") print("error host not string")
end end
if (type(port) ~= "number") then if (type(port) ~= "number") then
-- print("error host not number") print("error host not number")
end end
controller_host = host controller_host = host
controller_port = port controller_port = port
@ -2449,7 +2461,7 @@ function StartDebug(host, port)
start, start,
function(error) function(error)
-- body -- body
-- print(error) print(error)
end end
) )
return debugger_receiveDebugBreakInfo, debugger_xpcall return debugger_receiveDebugBreakInfo, debugger_xpcall
@ -2466,8 +2478,8 @@ ZZBase64.__code = {
'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/',
}; };
ZZBase64.__decode = {} ZZBase64.__decode = {}
for k, v in pairs(ZZBase64.__code) do for k,v in pairs(ZZBase64.__code) do
ZZBase64.__decode[string.byte(v, 1)] = k - 1 ZZBase64.__decode[string.byte(v,1)] = k - 1
end end
function ZZBase64.encode(text) function ZZBase64.encode(text)
@ -2477,14 +2489,14 @@ function ZZBase64.encode(text)
local res = {} local res = {}
local index = 1 local index = 1
for i = 1, len, 3 do for i = 1, len, 3 do
local a = string.byte(text, i) local a = string.byte(text, i )
local b = string.byte(text, i + 1) local b = string.byte(text, i + 1)
local c = string.byte(text, i + 2) local c = string.byte(text, i + 2)
-- num = a<<16 + b<<8 + c -- num = a<<16 + b<<8 + c
local num = a * 65536 + b * 256 + c local num = a * 65536 + b * 256 + c
for j = 1, 4 do for j = 1, 4 do
--tmp = num >> ((4 -j) * 6) --tmp = num >> ((4 -j) * 6)
local tmp = math.floor(num / (2 ^ ((4 - j) * 6))) local tmp = math.floor(num / (2 ^ ((4-j) * 6)))
--curPos = tmp&0x3f --curPos = tmp&0x3f
local curPos = tmp % 64 + 1 local curPos = tmp % 64 + 1
res[index] = ZZBase64.__code[curPos] res[index] = ZZBase64.__code[curPos]
@ -2521,13 +2533,13 @@ function ZZBase64.__left2(res, index, text, len)
res[index + 3] = "=" res[index + 3] = "="
end end
function ZZBase64.__left1(res, index, text, len) function ZZBase64.__left1(res, index,text, len)
local num = string.byte(text, len + 1) local num = string.byte(text, len + 1)
num = num * 16 num = num * 16
local tmp = math.floor(num / 64) local tmp = math.floor(num / 64)
local curPos = tmp % 64 + 1 local curPos = tmp % 64 + 1
res[index] = ZZBase64.__code[curPos] res[index ] = ZZBase64.__code[curPos]
curPos = num % 64 + 1 curPos = num % 64 + 1
res[index + 1] = ZZBase64.__code[curPos] res[index + 1] = ZZBase64.__code[curPos]
@ -2550,11 +2562,11 @@ function ZZBase64.decode(text)
local res = {} local res = {}
local index = 1 local index = 1
local decode = ZZBase64.__decode local decode = ZZBase64.__decode
for i = 1, len, 4 do for i =1, len, 4 do
local a = decode[string.byte(text, i)] local a = decode[string.byte(text,i )]
local b = decode[string.byte(text, i + 1)] local b = decode[string.byte(text,i + 1)]
local c = decode[string.byte(text, i + 2)] local c = decode[string.byte(text,i + 2)]
local d = decode[string.byte(text, i + 3)] local d = decode[string.byte(text,i + 3)]
--num = a<<18 + b<<12 + c<<6 + d --num = a<<18 + b<<12 + c<<6 + d
local num = a * 262144 + b * 4096 + c * 64 + d local num = a * 262144 + b * 4096 + c * 64 + d
@ -2563,7 +2575,7 @@ function ZZBase64.decode(text)
num = math.floor(num / 256) num = math.floor(num / 256)
local f = string.char(num % 256) local f = string.char(num % 256)
num = math.floor(num / 256) num = math.floor(num / 256)
res[index] = string.char(num % 256) res[index ] = string.char(num % 256)
res[index + 1] = f res[index + 1] = f
res[index + 2] = e res[index + 2] = e
index = index + 3 index = index + 3
@ -2599,4 +2611,7 @@ function ZZBase64.__decodeLeft2(res, index, text, len)
res[index] = string.char(num) res[index] = string.char(num)
end end
return StartDebug return StartDebug

View File

@ -1,7 +1,7 @@
local debugger_reLoadFile = nil local debugger_reLoadFile =nil
xpcall(function() xpcall(function()
debugger_reLoadFile = require("luaideReLoadFile") debugger_reLoadFile = require("luaideReLoadFile")
end, function() end,function()
debugger_reLoadFile = function() print("未实现代码重载") end debugger_reLoadFile = function() print("未实现代码重载") end
end) end)
local sethook = debug.sethook local sethook = debug.sethook
@ -13,9 +13,9 @@ local checkSetVar = nil
local loadstring_ = nil local loadstring_ = nil
local debugger_sendMsg = nil local debugger_sendMsg = nil
if (loadstring) then if (loadstring) then
loadstring_ = loadstring loadstring_ = loadstring
else else
loadstring_ = load loadstring_ = load
end end
local ZZBase64 = {} local ZZBase64 = {}
local LuaDebugTool_ = nil local LuaDebugTool_ = nil
@ -366,7 +366,6 @@ local function createJson()
function json.null() function json.null()
return json.null -- so json.null() will also return null ;-) return json.null -- so json.null() will also return null ;-)
end end
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
-- Internal, PRIVATE functions. -- Internal, PRIVATE functions.
-- Following a Python-like convention, I have prefixed all these 'PRIVATE' -- Following a Python-like convention, I have prefixed all these 'PRIVATE'
@ -424,8 +423,8 @@ local function createJson()
-- @return object, int The object (true, false or nil) and the position at which the next character should be -- @return object, int The object (true, false or nil) and the position at which the next character should be
-- scanned. -- scanned.
function decode_scanConstant(s, startPos) function decode_scanConstant(s, startPos)
local consts = { ["true"] = true, ["false"] = false, ["null"] = nil } local consts = {["true"] = true, ["false"] = false, ["null"] = nil}
local constNames = { "true", "false", "null" } local constNames = {"true", "false", "null"}
for i, k in pairs(constNames) do for i, k in pairs(constNames) do
if string.sub(s, startPos, startPos + string.len(k) - 1) == k then if string.sub(s, startPos, startPos + string.len(k) - 1) == k then
@ -695,7 +694,7 @@ local LuaDebugger = {
runLineCount = 0, runLineCount = 0,
--分割字符串缓存 --分割字符串缓存
splitFilePaths = {}, splitFilePaths = {},
version = "0.9.3", version="0.9.3",
serVarLevel = 4 serVarLevel = 4
} }
local debug_hook = nil local debug_hook = nil
@ -748,17 +747,17 @@ function print(...)
end end
if (LuaDebugger.isProntToConsole == 1 or LuaDebugger.isProntToConsole == 2) then if (LuaDebugger.isProntToConsole == 1 or LuaDebugger.isProntToConsole == 2) then
if (debug_server) then if (debug_server) then
local arg = { ... } --这里的...和{}符号中间需要有空格号,否则会出错 local arg = {...} --这里的...和{}符号中间需要有空格号,否则会出错
local str = "" local str = ""
if (#arg == 0) then if (#arg == 0) then
arg = { "nil" } arg = {"nil"}
end end
for k, v in pairs(arg) do for k, v in pairs(arg) do
str = str .. tostring(v) .. "\t" str = str .. tostring(v) .. "\t"
end end
local sendMsg = { local sendMsg = {
event = LuaDebugger.event.C2S_LuaPrint, event = LuaDebugger.event.C2S_LuaPrint,
data = { msg = ZZBase64.encode(str), type = 1 } data = {msg = ZZBase64.encode(str), type = 1}
} }
local sendStr = json.encode(sendMsg) local sendStr = json.encode(sendMsg)
debug_server:send(sendStr .. "__debugger_k0204__") debug_server:send(sendStr .. "__debugger_k0204__")
@ -772,48 +771,46 @@ function luaIdePrintWarn(...)
end end
if (LuaDebugger.isProntToConsole == 1 or LuaDebugger.isProntToConsole == 2) then if (LuaDebugger.isProntToConsole == 1 or LuaDebugger.isProntToConsole == 2) then
if (debug_server) then if (debug_server) then
local arg = { ... } --这里的...和{}符号中间需要有空格号,否则会出错 local arg = {...} --这里的...和{}符号中间需要有空格号,否则会出错
local str = "" local str = ""
if (#arg == 0) then if (#arg == 0) then
arg = { "nil" } arg = {"nil"}
end end
for k, v in pairs(arg) do for k, v in pairs(arg) do
str = str .. tostring(v) .. "\t" str = str .. tostring(v) .. "\t"
end end
local sendMsg = { local sendMsg = {
event = LuaDebugger.event.C2S_LuaPrint, event = LuaDebugger.event.C2S_LuaPrint,
data = { msg = ZZBase64.encode(str), type = 2 } data = {msg = ZZBase64.encode(str), type = 2}
} }
local sendStr = json.encode(sendMsg) local sendStr = json.encode(sendMsg)
debug_server:send(sendStr .. "__debugger_k0204__") debug_server:send(sendStr .. "__debugger_k0204__")
end end
end end
end end
function luaIdePrintErr(...) function luaIdePrintErr(...)
if (LuaDebugger.isProntToConsole == 1 or LuaDebugger.isProntToConsole == 3) then if (LuaDebugger.isProntToConsole == 1 or LuaDebugger.isProntToConsole == 3) then
debugger_print(...) debugger_print(...)
end end
if (LuaDebugger.isProntToConsole == 1 or LuaDebugger.isProntToConsole == 2) then if (LuaDebugger.isProntToConsole == 1 or LuaDebugger.isProntToConsole == 2) then
if (debug_server) then if (debug_server) then
local arg = { ... } --这里的...和{}符号中间需要有空格号,否则会出错 local arg = {...} --这里的...和{}符号中间需要有空格号,否则会出错
local str = "" local str = ""
if (#arg == 0) then if (#arg == 0) then
arg = { "nil" } arg = {"nil"}
end end
for k, v in pairs(arg) do for k, v in pairs(arg) do
str = str .. tostring(v) .. "\t" str = str .. tostring(v) .. "\t"
end end
local sendMsg = { local sendMsg = {
event = LuaDebugger.event.C2S_LuaPrint, event = LuaDebugger.event.C2S_LuaPrint,
data = { msg = ZZBase64.encode(str), type = 3 } data = {msg = ZZBase64.encode(str), type = 3}
} }
local sendStr = json.encode(sendMsg) local sendStr = json.encode(sendMsg)
debug_server:send(sendStr .. "__debugger_k0204__") debug_server:send(sendStr .. "__debugger_k0204__")
end end
end end
end end
--@endregion --@endregion
--@region 辅助方法 --@region 辅助方法
@ -951,7 +948,7 @@ local function debugger_dump(value, desciption, nesting)
return tostring(v) return tostring(v)
end end
local traceback = debugger_strSplit(debug.traceback("", 2), "\n") local traceback = debugger_strSplit(debug.traceback("", 2), "\n")
-- print("dump from: " .. debugger_strTrim(traceback[3])) print("dump from: " .. debugger_strTrim(traceback[3]))
local function _dump(value, desciption, indent, nest, keylen) local function _dump(value, desciption, indent, nest, keylen)
desciption = desciption or "<var>" desciption = desciption or "<var>"
local spc = "" local spc = ""
@ -1000,7 +997,7 @@ local function debugger_dump(value, desciption, nesting)
end end
_dump(value, desciption, "- ", 1) _dump(value, desciption, "- ", 1)
for i, line in ipairs(result) do for i, line in ipairs(result) do
-- print(line) print(line)
end end
end end
--@endregion --@endregion
@ -1008,24 +1005,27 @@ local function debugger_valueToString(v)
local vtype = type(v) local vtype = type(v)
local vstr = nil local vstr = nil
if (vtype == "userdata") then if (vtype == "userdata") then
if (LuaDebugger.isFoxGloryProject) then if (LuaDebugger.isFoxGloryProject ) then
return "userdata", vtype
return "userdata",vtype
else else
return tostring(v), vtype return tostring(v), vtype
end end
elseif (vtype == "table" or vtype == "function" or vtype == "boolean") then elseif (vtype == "table" or vtype == "function" or vtype == "boolean") then
local value = vtype local value = vtype
xpcall(function() xpcall(function()
if (LuaDebugger.isFoxGloryProject) then if(LuaDebugger.isFoxGloryProject) then
value = vtype value = vtype
else else
value = tostring(v) value = tostring(v)
end end
end, function()
end,function()
value = vtype value = vtype
end) end)
return value, vtype return value, vtype
elseif (vtype == "number" or vtype == "string") then elseif (vtype == "number" or vtype == "string" ) then
return v, vtype return v, vtype
else else
return tostring(v), vtype return tostring(v), vtype
@ -1033,12 +1033,12 @@ local function debugger_valueToString(v)
end end
local function debugger_setVarInfo(name, value) local function debugger_setVarInfo(name, value)
local valueStr, valueType = debugger_valueToString(value) local valueStr, valueType = debugger_valueToString(value)
local nameStr, nameType = debugger_valueToString(name) local nameStr,nameType = debugger_valueToString(name)
if (valueStr == nil) then if(valueStr == nil) then
valueStr = valueType valueStr = valueType
end end
local valueInfo = { local valueInfo = {
name = nameStr, name =nameStr,
valueType = valueType, valueType = valueType,
valueStr = ZZBase64.encode(valueStr) valueStr = ZZBase64.encode(valueStr)
} }
@ -1076,7 +1076,7 @@ local function debugger_getvalue(f)
i = i + 1 i = i + 1
end end
return { locals = locals, ups = ups } return {locals = locals, ups = ups}
end end
--获取堆栈 --获取堆栈
debugger_stackInfo = debugger_stackInfo =
@ -1122,7 +1122,7 @@ debugger_stackInfo =
end end
end end
local stackInfo = { stack = stack, vars = varInfos, funcs = funcs } local stackInfo = {stack = stack, vars = varInfos, funcs = funcs}
local data = { local data = {
stack = stackInfo.stack, stack = stackInfo.stack,
vars = stackInfo.vars, vars = stackInfo.vars,
@ -1133,23 +1133,23 @@ debugger_stackInfo =
} }
return data return data
end end
--==============================工具方法 end====================================================== --==============================工具方法 end======================================================
--===========================点断信息================================================== --===========================点断信息==================================================
--根据不同的游戏引擎进行定时获取断点信息 --根据不同的游戏引擎进行定时获取断点信息
--CCDirector:sharedDirector():getScheduler() --CCDirector:sharedDirector():getScheduler()
local debugger_setBreak = nil local debugger_setBreak = nil
local function debugger_receiveDebugBreakInfo() local function debugger_receiveDebugBreakInfo()
if (not jit) then if(not jit) then
if (_VERSION) then if(_VERSION)then
-- print("当前lua版本为: ".._VERSION.." 请使用 -----LuaDebug.lua----- 进行调试!") print("当前lua版本为: ".._VERSION.." 请使用 -----LuaDebug.lua----- 进行调试!")
else else
-- print("当前为lua版本,请使用-----LuaDebug.lua-----进行调试!") print("当前为lua版本,请使用-----LuaDebug.lua-----进行调试!")
end end
end end
if (breakInfoSocket) then if (breakInfoSocket) then
local msg, status = breakInfoSocket:receive() local msg, status = breakInfoSocket:receive()
if (LuaDebugger.isLaunch == true and status == "closed") then if(LuaDebugger.isLaunch == true and status == "closed") then
os.exit() os.exit()
end end
if (msg) then if (msg) then
@ -1159,7 +1159,7 @@ local function debugger_receiveDebugBreakInfo()
elseif netData.event == LuaDebugger.event.S2C_LoadLuaScript then elseif netData.event == LuaDebugger.event.S2C_LoadLuaScript then
LuaDebugger.loadScriptBody = netData.data LuaDebugger.loadScriptBody = netData.data
debugger_exeLuaString() debugger_exeLuaString()
debugger_sendMsg(breakInfoSocket, LuaDebugger.event.C2S_LoadLuaScript, LuaDebugger.loadScriptBody) debugger_sendMsg(breakInfoSocket,LuaDebugger.event.C2S_LoadLuaScript,LuaDebugger.loadScriptBody)
elseif netData.event == LuaDebugger.event.S2C_ReLoadFile then elseif netData.event == LuaDebugger.event.S2C_ReLoadFile then
LuaDebugger.reLoadFileBody = netData.data LuaDebugger.reLoadFileBody = netData.data
LuaDebugger.isReLoadFile = false LuaDebugger.isReLoadFile = false
@ -1267,7 +1267,7 @@ debugger_setBreak =
end end
LuaDebugger.isHook = false LuaDebugger.isHook = false
end end
end end
local function debugger_checkFileIsBreak(fileName) local function debugger_checkFileIsBreak(fileName)
return LuaDebugger.breakInfos[fileName] return LuaDebugger.breakInfos[fileName]
end end
@ -1299,7 +1299,7 @@ function debugger_conditionStr(condition, vars, callBack)
currentTabble[k] = v currentTabble[k] = v
end end
end end
setmetatable(currentTabble, { __index = _G }) setmetatable(currentTabble, {__index = _G})
local fun = loadstring("return " .. condition) local fun = loadstring("return " .. condition)
setfenv(fun, currentTabble) setfenv(fun, currentTabble)
return fun() return fun()
@ -1309,20 +1309,21 @@ function debugger_conditionStr(condition, vars, callBack)
xpcall( xpcall(
loadScript, loadScript,
function(error) function(error)
-- print(error) print(error)
end end
) )
if (status and msg) then if (status and msg) then
callBack() callBack()
end end
end end
--执行lua字符串 --执行lua字符串
debugger_exeLuaString = function() debugger_exeLuaString = function()
local function loadScript() local function loadScript()
local script = LuaDebugger.loadScriptBody.script local script = LuaDebugger.loadScriptBody.script
if (LuaDebugger.loadScriptBody.isBreak) then if (LuaDebugger.loadScriptBody.isBreak) then
local currentTabble = { _G = _G } local currentTabble = {_G = _G}
local frameId = LuaDebugger.loadScriptBody.frameId local frameId = LuaDebugger.loadScriptBody.frameId
frameId = frameId frameId = frameId
local func = LuaDebugger.currentDebuggerData.funcs[frameId] local func = LuaDebugger.currentDebuggerData.funcs[frameId]
@ -1335,7 +1336,7 @@ debugger_exeLuaString = function()
for k, v in pairs(locals) do for k, v in pairs(locals) do
currentTabble[k] = v currentTabble[k] = v
end end
setmetatable(currentTabble, { __index = _G }) setmetatable(currentTabble, {__index = _G})
local fun = loadstring(script) local fun = loadstring(script)
setfenv(fun, currentTabble) setfenv(fun, currentTabble)
@ -1350,47 +1351,50 @@ debugger_exeLuaString = function()
xpcall( xpcall(
loadScript, loadScript,
function(error) function(error)
-- debugger_sendMsg(debug_server, LuaDebugger.event.C2S_LoadLuaScript, LuaDebugger.loadScriptBody) -- debugger_sendMsg(debug_server, LuaDebugger.event.C2S_LoadLuaScript, LuaDebugger.loadScriptBody)
end end
) )
LuaDebugger.loadScriptBody.script = nil LuaDebugger.loadScriptBody.script = nil
if (LuaDebugger.loadScriptBody.isBreak) then if (LuaDebugger.loadScriptBody.isBreak) then
LuaDebugger.serVarLevel = LuaDebugger.serVarLevel + 1 LuaDebugger.serVarLevel = LuaDebugger.serVarLevel+1
LuaDebugger.currentDebuggerData = debugger_stackInfo(LuaDebugger.serVarLevel, LuaDebugger.event LuaDebugger.currentDebuggerData = debugger_stackInfo(LuaDebugger.serVarLevel, LuaDebugger.event.C2S_HITBreakPoint)
.C2S_HITBreakPoint)
LuaDebugger.loadScriptBody.stack = LuaDebugger.currentDebuggerData.stack LuaDebugger.loadScriptBody.stack = LuaDebugger.currentDebuggerData.stack
end end
LuaDebugger.loadScriptBody.complete = true LuaDebugger.loadScriptBody.complete = true
end end
--@region 调试中修改变量值 --@region 调试中修改变量值
--根据key 值在 value 查找 --根据key 值在 value 查找
local function debugger_getTablekey(key, keyType, value) local function debugger_getTablekey(key,keyType,value)
if (keyType == -1) then if(keyType == -1) then
return key return key
elseif (keyType == 1) then elseif(keyType == 1) then
return tonumber(key) return tonumber(key)
elseif (keyType == 2) then elseif(keyType == 2) then
local valueKey = nil local valueKey = nil
for k, v in pairs(value) do for k,v in pairs(value) do
local nameType = type(k) local nameType = type(k)
if (nameType == "userdata" or nameType == "table") then if(nameType == "userdata" or nameType == "table") then
if (not LuaDebugger.isFoxGloryProject) then if (not LuaDebugger.isFoxGloryProject) then
valueKey = tostring(k) valueKey = tostring(k)
if (key == valueKey) then if(key == valueKey) then
return k return k
end end
break break
end end
end end
end end
end end
end end
local function debugger_setVarValue(server, data) local function debugger_setVarValue(server, data)
local newValue = nil local newValue = nil
local level = LuaDebugger.serVarLevel + LuaDebugger.setVarBody.frameId local level = LuaDebugger.serVarLevel+LuaDebugger.setVarBody.frameId
local firstKeyName = data.keys[1] local firstKeyName = data.keys[1]
--@region vars check --@region vars check
local localValueChangeIndex = -1 local localValueChangeIndex = -1
@ -1405,7 +1409,7 @@ local function debugger_setVarValue(server, data)
if not name then if not name then
break break
end end
if (firstKeyName == name) then if(firstKeyName == name) then
localValueChangeIndex = i localValueChangeIndex = i
oldValue = value oldValue = value
end end
@ -1423,7 +1427,7 @@ local function debugger_setVarValue(server, data)
if not name then if not name then
break break
end end
if (localValueChangeIndex == -1 and firstKeyName == name) then if(localValueChangeIndex == -1 and firstKeyName == name) then
upValueFun = func upValueFun = func
oldValue = value oldValue = value
upValueChangeIndex = i upValueChangeIndex = i
@ -1435,8 +1439,8 @@ local function debugger_setVarValue(server, data)
end end
i = i + 1 i = i + 1
end end
--@endregion --@endregion
local vars = { locals = locals, ups = ups } local vars = {locals = locals, ups = ups}
local function loadScript() local function loadScript()
local currentTabble = {} local currentTabble = {}
@ -1453,7 +1457,7 @@ local function debugger_setVarValue(server, data)
currentTabble[k] = v currentTabble[k] = v
end end
end end
setmetatable(currentTabble, { __index = _G }) setmetatable(currentTabble, {__index = _G})
local fun = loadstring("return " .. data.value) local fun = loadstring("return " .. data.value)
setfenv(fun, currentTabble) setfenv(fun, currentTabble)
newValue = fun() newValue = fun()
@ -1463,7 +1467,7 @@ local function debugger_setVarValue(server, data)
xpcall( xpcall(
loadScript, loadScript,
function(error) function(error)
-- print(error, "============================") print(error, "============================")
end end
) )
@ -1472,37 +1476,39 @@ local function debugger_setVarValue(server, data)
-- local 查找并替换 -- local 查找并替换
local keyLength = #data.keys local keyLength = #data.keys
if (keyLength == 1) then if(keyLength == 1) then
if (localValueChangeIndex ~= -1) then if(localValueChangeIndex ~= -1) then
debug.setlocal(level, localValueChangeIndex, newValue) debug.setlocal(level, localValueChangeIndex, newValue)
elseif (upValueFun ~= nil) then elseif(upValueFun ~= nil) then
debug.setupvalue(upValueFun, upValueChangeIndex, newValue) debug.setupvalue( upValueFun, upValueChangeIndex, newValue )
else else
--全局变量查找 --全局变量查找
if (_G[firstKeyName]) then if(_G[firstKeyName]) then
_G[firstKeyName] = newValue _G[firstKeyName] = newValue
end end
end end
else else
if (not oldValue) then if(not oldValue) then
if (_G[firstKeyName]) then if(_G[firstKeyName]) then
oldValue = _G[firstKeyName] oldValue = _G[firstKeyName]
end end
end end
local tempValue = oldValue local tempValue = oldValue
for i = 2, keyLength - 1 do for i=2,keyLength-1 do
if (tempValue) then if(tempValue) then
oldValue = oldValue[debugger_getTablekey(data.keys[i], data.numberTypes[i], oldValue)] oldValue = oldValue[debugger_getTablekey(data.keys[i],data.numberTypes[i],oldValue)]
end end
end end
if (tempValue) then if(tempValue) then
oldValue[debugger_getTablekey(data.keys[keyLength], data.numberTypes[keyLength], oldValue)] = newValue oldValue[debugger_getTablekey(data.keys[keyLength],data.numberTypes[keyLength],oldValue)] = newValue
end end
end end
local varInfo = debugger_setVarInfo(data.varName, newValue) local varInfo = debugger_setVarInfo(data.varName, newValue)
data.varInfo = varInfo data.varInfo = varInfo
LuaDebugger.serVarLevel = LuaDebugger.serVarLevel + 1 LuaDebugger.serVarLevel = LuaDebugger.serVarLevel+1
LuaDebugger.currentDebuggerData = debugger_stackInfo(LuaDebugger.serVarLevel, LuaDebugger.event.C2S_HITBreakPoint) LuaDebugger.currentDebuggerData = debugger_stackInfo(LuaDebugger.serVarLevel, LuaDebugger.event.C2S_HITBreakPoint)
end end
--@endregion --@endregion
@ -1514,41 +1520,41 @@ checkSetVar =
function() function()
if (LuaDebugger.isSetVar) then if (LuaDebugger.isSetVar) then
LuaDebugger.isSetVar = false LuaDebugger.isSetVar = false
debugger_setVarValue(debug_server, LuaDebugger.setVarBody) debugger_setVarValue(debug_server,LuaDebugger.setVarBody)
LuaDebugger.serVarLevel = LuaDebugger.serVarLevel + 1 LuaDebugger.serVarLevel = LuaDebugger.serVarLevel+1
_resume(coro_debugger, LuaDebugger.setVarBody) _resume(coro_debugger, LuaDebugger.setVarBody)
xpcall( xpcall(
checkSetVar, checkSetVar,
function(error) function(error)
-- print("设置变量", error) print("设置变量", error)
end end
) )
elseif (LuaDebugger.isLoadLuaScript) then elseif(LuaDebugger.isLoadLuaScript) then
LuaDebugger.isLoadLuaScript = false LuaDebugger.isLoadLuaScript = false
debugger_exeLuaString() debugger_exeLuaString()
LuaDebugger.serVarLevel = LuaDebugger.serVarLevel + 1 LuaDebugger.serVarLevel = LuaDebugger.serVarLevel+1
_resume(coro_debugger, LuaDebugger.reLoadFileBody) _resume(coro_debugger, LuaDebugger.reLoadFileBody)
xpcall( xpcall(
checkSetVar, checkSetVar,
function(error) function(error)
-- print("执行代码", error) print("执行代码", error)
end end
) )
elseif (LuaDebugger.isReLoadFile) then elseif(LuaDebugger.isReLoadFile) then
LuaDebugger.isReLoadFile = false LuaDebugger.isReLoadFile = false
LuaDebugger.reLoadFileBody.isReLoad = debugger_reLoadFile(LuaDebugger.reLoadFileBody) LuaDebugger.reLoadFileBody.isReLoad = debugger_reLoadFile(LuaDebugger.reLoadFileBody)
-- print("重载结果:",LuaDebugger.reLoadFileBody.isReLoad) print("重载结果:",LuaDebugger.reLoadFileBody.isReLoad)
LuaDebugger.reLoadFileBody.script = nil LuaDebugger.reLoadFileBody.script = nil
LuaDebugger.serVarLevel = LuaDebugger.serVarLevel + 1 LuaDebugger.serVarLevel = LuaDebugger.serVarLevel+1
_resume(coro_debugger, LuaDebugger.reLoadFileBody) _resume(coro_debugger, LuaDebugger.reLoadFileBody)
xpcall( xpcall(
checkSetVar, checkSetVar,
function(error) function(error)
-- print("重新加载文件", error) print("重新加载文件", error)
end end
) )
end end
end end
@ -1598,7 +1604,7 @@ local function debugger_getValueByScript(value, script)
val = fun() val = fun()
end, end,
function(error) function(error)
-- print(error, "====>") print(error, "====>")
val = nil val = nil
end end
) )
@ -1739,6 +1745,7 @@ end
return return
]] ]]
local function debugger_getmetatable(value, metatable, vinfos, server, variablesReference, debugSpeedIndex, metatables) local function debugger_getmetatable(value, metatable, vinfos, server, variablesReference, debugSpeedIndex, metatables)
for i, mtable in ipairs(metatables) do for i, mtable in ipairs(metatables) do
if (metatable == mtable) then if (metatable == mtable) then
return vinfos return vinfos
@ -1794,6 +1801,7 @@ local function debugger_getmetatable(value, metatable, vinfos, server, variables
else else
return vinfos return vinfos
end end
end end
local function debugger_sendTableField(luatable, vinfos, server, variablesReference, debugSpeedIndex, valueType) local function debugger_sendTableField(luatable, vinfos, server, variablesReference, debugSpeedIndex, valueType)
if (valueType == "userdata") then if (valueType == "userdata") then
@ -1866,6 +1874,7 @@ local function debugger_sendTableValues(value, server, variablesReference, debug
vinfos = {} vinfos = {}
end end
end end
end end
else else
m = getmetatable(value) m = getmetatable(value)
@ -1915,10 +1924,11 @@ local function debugger_getBreakVar(body, server)
if (value) then if (value) then
local valueType = type(value) local valueType = type(value)
if (valueType == "table" or valueType == "userdata") then if (valueType == "table" or valueType == "userdata") then
debugger_sendTableValues(value, server, variablesReference, debugSpeedIndex) debugger_sendTableValues(value, server, variablesReference, debugSpeedIndex)
else else
if (valueType == "function") then if (valueType == "function") then
if (LuaDebugger.isFoxGloryProject) then if(LuaDebugger.isFoxGloryProject) then
value = "function" value = "function"
else else
value = tostring(value) value = tostring(value)
@ -1953,9 +1963,9 @@ local function debugger_getBreakVar(body, server)
xpcall( xpcall(
exe, exe,
function(error) function(error)
-- -- print("获取变量错误 错误消息-----------------") -- print("获取变量错误 错误消息-----------------")
-- -- print(error) -- print(error)
-- -- print(debug.traceback("", 2)) -- print(debug.traceback("", 2))
debugger_sendMsg( debugger_sendMsg(
server, server,
LuaDebugger.event.C2S_ReqVar, LuaDebugger.event.C2S_ReqVar,
@ -1981,6 +1991,7 @@ local function ResetDebugInfo()
LuaDebugger.StepIn = false LuaDebugger.StepIn = false
LuaDebugger.StepNext = false LuaDebugger.StepNext = false
LuaDebugger.StepOut = false LuaDebugger.StepOut = false
end end
local function debugger_loop(server) local function debugger_loop(server)
server = debug_server server = debug_server
@ -1991,7 +2002,7 @@ local function debugger_loop(server)
while true do while true do
local line, status = server:receive() local line, status = server:receive()
if (status == "closed") then if (status == "closed") then
if (LuaDebugger.isLaunch) then if(LuaDebugger.isLaunch) then
os.exit() os.exit()
else else
debug.sethook() debug.sethook()
@ -2003,12 +2014,13 @@ local function debugger_loop(server)
local event = netData.event local event = netData.event
local body = netData.data local body = netData.data
if (event == LuaDebugger.event.S2C_DebugClose) then if (event == LuaDebugger.event.S2C_DebugClose) then
if (LuaDebugger.isLaunch) then if(LuaDebugger.isLaunch) then
os.exit() os.exit()
else else
debug.sethook() debug.sethook()
coroutine.yield() coroutine.yield()
end end
elseif event == LuaDebugger.event.S2C_SetBreakPoints then elseif event == LuaDebugger.event.S2C_SetBreakPoints then
--设置断点信息 --设置断点信息
local function setB() local function setB()
@ -2017,7 +2029,7 @@ local function debugger_loop(server)
xpcall( xpcall(
setB, setB,
function(error) function(error)
-- print(error) print(error)
end end
) )
elseif event == LuaDebugger.event.S2C_RUN then --开始运行 elseif event == LuaDebugger.event.S2C_RUN then --开始运行
@ -2029,7 +2041,7 @@ local function debugger_loop(server)
LuaDebugger.currentDebuggerData = nil LuaDebugger.currentDebuggerData = nil
LuaDebugger.Run = true LuaDebugger.Run = true
LuaDebugger.tempRunFlag = true LuaDebugger.tempRunFlag = true
LuaDebugger.currentLine = nil LuaDebugger.currentLine= nil
local data = coroutine.yield() local data = coroutine.yield()
LuaDebugger.serVarLevel = 4 LuaDebugger.serVarLevel = 4
LuaDebugger.currentDebuggerData = data LuaDebugger.currentDebuggerData = data
@ -2130,37 +2142,42 @@ local function debugger_loop(server)
end end
coro_debugger = coroutine.create(debugger_loop) coro_debugger = coroutine.create(debugger_loop)
debug_hook = function(event, line) debug_hook = function(event, line)
if (not LuaDebugger.isHook) then
if(not LuaDebugger.isHook) then
return return
end end
if (LuaDebugger.Run) then if(LuaDebugger.Run) then
if (event == "line") then if(event == "line") then
local isCheck = false local isCheck = false
for k, breakInfo in pairs(LuaDebugger.breakInfos) do for k, breakInfo in pairs(LuaDebugger.breakInfos) do
for bk, linesInfo in pairs(breakInfo) do for bk, linesInfo in pairs(breakInfo) do
if (linesInfo.lines and linesInfo.lines[line]) then
if(linesInfo.lines and linesInfo.lines[line]) then
isCheck = true isCheck = true
break break
end end
end end
if (isCheck) then if(isCheck) then
break break
end end
end end
if (not isCheck) then if(not isCheck) then
return return
end end
end end
end end
local file = nil local file = nil
if (event == "line") then if(event == "line") then
local funs = nil local funs = nil
local funlength = 0 local funlength =0
if (LuaDebugger.currentDebuggerData) then if(LuaDebugger.currentDebuggerData) then
funs = LuaDebugger.currentDebuggerData.funcs funs = LuaDebugger.currentDebuggerData.funcs
funlength = #funs funlength = #funs
end end
@ -2168,44 +2185,47 @@ debug_hook = function(event, line)
local tempFunc = stepInfo.func local tempFunc = stepInfo.func
local source = stepInfo.source local source = stepInfo.source
file = getSource(source); file = getSource(source);
if (source == "=[C]" or source:find(LuaDebugger.DebugLuaFie)) then return end if(source == "=[C]" or source:find(LuaDebugger.DebugLuaFie)) then return end
if (funlength > 0 and funs[1] == tempFunc and LuaDebugger.currentLine ~= line) then if(funlength > 0 and funs[1] == tempFunc and LuaDebugger.currentLine ~= line) then
LuaDebugger.runLineCount = LuaDebugger.runLineCount + 1 LuaDebugger.runLineCount = LuaDebugger.runLineCount+1
end end
local breakInfo = LuaDebugger.breakInfos[file] local breakInfo = LuaDebugger.breakInfos[file]
local breakData = nil local breakData = nil
local ischeck = false local ischeck = false
if (breakInfo) then if(breakInfo) then
for k, lineInfo in pairs(breakInfo) do for k, lineInfo in pairs(breakInfo) do
local lines = lineInfo.lines local lines = lineInfo.lines
if (lines and lines[line]) then if(lines and lines[line]) then
ischeck = true ischeck = true
break break
end end
end end
end end
local isHit = false local isHit = false
if (ischeck) then if(ischeck) then
--并且在断点中 --并且在断点中
local info = stepInfo local info = stepInfo
local source = string.lower(info.source) local source = string.lower( info.source )
local fullName, dir, fileName = debugger_getFilePathInfo(source) local fullName,dir,fileName = debugger_getFilePathInfo(source)
local hitPathNames = splitFilePath(fullName) local hitPathNames = splitFilePath(fullName)
local hitCounts = {} local hitCounts = {}
local debugHitCounts = nil local debugHitCounts = nil
for k, lineInfo in pairs(breakInfo) do for k, lineInfo in pairs(breakInfo) do
local lines = lineInfo.lines local lines = lineInfo.lines
local pathNames = lineInfo.pathNames local pathNames = lineInfo.pathNames
debugHitCounts = lineInfo.hitCounts debugHitCounts = lineInfo.hitCounts
if (lines and lines[line]) then if(lines and lines[line]) then
breakData = lines[line] breakData = lines[line]
--判断路径 --判断路径
hitCounts[k] = 0 hitCounts[k] = 0
local hitPathNamesCount = #hitPathNames local hitPathNamesCount = #hitPathNames
local pathNamesCount = #pathNames local pathNamesCount = #pathNames
local checkCount = 0; local checkCount = 0;
while (true) do while(true) do
if (pathNames[pathNamesCount] ~= hitPathNames[hitPathNamesCount]) then if (pathNames[pathNamesCount] ~= hitPathNames[hitPathNamesCount]) then
break break
else else
@ -2213,55 +2233,57 @@ debug_hook = function(event, line)
end end
pathNamesCount = pathNamesCount - 1 pathNamesCount = pathNamesCount - 1
hitPathNamesCount = hitPathNamesCount - 1 hitPathNamesCount = hitPathNamesCount - 1
checkCount = checkCount + 1 checkCount = checkCount+1
if (pathNamesCount <= 0 or hitPathNamesCount <= 0) then if(pathNamesCount <= 0 or hitPathNamesCount <= 0) then
break break
end end
end end
if (checkCount > 0) then if(checkCount>0) then
break; break;
end end
else else
breakData = nil breakData = nil
end end
end end
if (breakData) then if(breakData) then
local hitFieName = "" local hitFieName = ""
local maxCount = 0 local maxCount = 0
for k, v in pairs(hitCounts) do for k, v in pairs(hitCounts) do
if (v > maxCount) then if(v > maxCount) then
maxCount = v maxCount = v
hitFieName = k; hitFieName = k;
end end
end end
local hitPathNamesLength = #hitPathNames local hitPathNamesLength = #hitPathNames
if (hitPathNamesLength == 1 or (hitPathNamesLength > 1 and maxCount > 1)) then if (hitPathNamesLength == 1 or (hitPathNamesLength > 1 and maxCount > 1)) then
if (hitFieName ~= "") then if(hitFieName ~= "") then
local hitCount = breakData.hitCondition local hitCount = breakData.hitCondition
local clientHitCount = debugHitCounts[breakData.line] local clientHitCount = debugHitCounts[breakData.line]
clientHitCount = clientHitCount + 1 clientHitCount = clientHitCount + 1
debugHitCounts[breakData.line] = clientHitCount debugHitCounts[breakData.line] = clientHitCount
if (funs and funs[1] == tempFunc and LuaDebugger.runLineCount == 0) then if(funs and funs[1] == tempFunc and LuaDebugger.runLineCount == 0) then
LuaDebugger.runLineCount = 0 LuaDebugger.runLineCount = 0
elseif (LuaDebugger.tempRunFlag and LuaDebugger.currentLine == line) then elseif(LuaDebugger.tempRunFlag and LuaDebugger.currentLine == line) then
LuaDebugger.runLineCount = 0 LuaDebugger.runLineCount = 0
LuaDebugger.tempRunFlag = nil LuaDebugger.tempRunFlag = nil
elseif (clientHitCount >= hitCount) then elseif(clientHitCount >= hitCount) then
isHit = true isHit = true
end end
end end
end end
end end
end end
if (LuaDebugger.StepOut) then if(LuaDebugger.StepOut) then
if (funlength == 1) then if(funlength == 1) then
ResetDebugInfo(); ResetDebugInfo();
LuaDebugger.Run = true LuaDebugger.Run = true
return return
else else
if (funs[2] == tempFunc) then if(funs[2] == tempFunc) then
local data = debugger_stackInfo(3, LuaDebugger.event.C2S_StepInResponse) local data = debugger_stackInfo(3, LuaDebugger.event.C2S_StepInResponse)
-- -- print("StepIn 挂起") -- print("StepIn 挂起")
--挂起等待调试器作出反应 --挂起等待调试器作出反应
_resume(coro_debugger, data) _resume(coro_debugger, data)
checkSetVar() checkSetVar()
@ -2270,34 +2292,35 @@ debug_hook = function(event, line)
end end
end end
if (LuaDebugger.StepIn) then if(LuaDebugger.StepIn) then
if (funs[1] == tempFunc and LuaDebugger.runLineCount == 0) then if(funs[1] == tempFunc and LuaDebugger.runLineCount == 0) then
return return
end end
local data = debugger_stackInfo(3, LuaDebugger.event.C2S_StepInResponse) local data = debugger_stackInfo(3, LuaDebugger.event.C2S_StepInResponse)
-- -- print("StepIn 挂起") -- print("StepIn 挂起")
--挂起等待调试器作出反应 --挂起等待调试器作出反应
_resume(coro_debugger, data) _resume(coro_debugger, data)
checkSetVar() checkSetVar()
return return
end end
if (LuaDebugger.StepNext) then if(LuaDebugger.StepNext ) then
local isNext = false local isNext = false
if (funs) then if(funs) then
for i, f in ipairs(funs) do for i,f in ipairs(funs) do
if (tempFunc == f) then if(tempFunc == f) then
if (LuaDebugger.currentLine == line) then if(LuaDebugger.currentLine == line) then
return return
end end
isNext = true isNext =true
break; break;
end end
end end
else else
isNext = true
isNext =true
end end
if (isNext) then if(isNext) then
local data = debugger_stackInfo(3, LuaDebugger.event.C2S_NextResponse) local data = debugger_stackInfo(3, LuaDebugger.event.C2S_NextResponse)
LuaDebugger.runLineCount = 0 LuaDebugger.runLineCount = 0
LuaDebugger.currentLine = line LuaDebugger.currentLine = line
@ -2312,15 +2335,17 @@ debug_hook = function(event, line)
--断点判断 --断点判断
if (isHit) then if(isHit) then
LuaDebugger.runLineCount = 0 LuaDebugger.runLineCount = 0
LuaDebugger.currentLine = line LuaDebugger.currentLine = line
sevent = LuaDebugger.event.C2S_HITBreakPoint sevent = LuaDebugger.event.C2S_HITBreakPoint
--调用 coro_debugger 并传入 参数 --调用 coro_debugger 并传入 参数
local data = debugger_stackInfo(3, sevent) local data = debugger_stackInfo(3, sevent)
--挂起等待调试器作出反应 --挂起等待调试器作出反应
if (breakData and breakData.condition) then if(breakData and breakData.condition) then
debugger_conditionStr(breakData.condition, data.vars, function() debugger_conditionStr(breakData.condition,data.vars,function()
_resume(coro_debugger, data) _resume(coro_debugger, data)
checkSetVar() checkSetVar()
end) end)
@ -2337,7 +2362,7 @@ end
local function debugger_xpcall() local function debugger_xpcall()
--调用 coro_debugger 并传入 参数 --调用 coro_debugger 并传入 参数
local data = debugger_stackInfo(4, LuaDebugger.event.C2S_HITBreakPoint) local data = debugger_stackInfo(4, LuaDebugger.event.C2S_HITBreakPoint)
if (data.stack and data.stack[1]) then if(data.stack and data.stack[1]) then
data.stack[1].isXpCall = true data.stack[1].isXpCall = true
end end
--挂起等待调试器作出反应 --挂起等待调试器作出反应
@ -2346,11 +2371,12 @@ local function debugger_xpcall()
end end
--调试开始 --调试开始
local function start() local function start()
local socket = createSocket()
-- print(controller_host)
-- print(controller_port)
local fullName, dirName, fileName = debugger_getFilePathInfo(getinfo(1).source) local socket = createSocket()
print(controller_host)
print(controller_port)
local fullName,dirName,fileName = debugger_getFilePathInfo(getinfo(1).source)
LuaDebugger.DebugLuaFie = fileName LuaDebugger.DebugLuaFie = fileName
local server = socket.connect(controller_host, controller_port) local server = socket.connect(controller_host, controller_port)
debug_server = server; debug_server = server;
@ -2358,7 +2384,7 @@ local function start()
--创建breakInfo socket --创建breakInfo socket
socket = createSocket() socket = createSocket()
breakInfoSocket = socket.connect(controller_host, controller_port) breakInfoSocket = socket.connect(controller_host, controller_port)
if (breakInfoSocket) then if(breakInfoSocket) then
breakInfoSocket:settimeout(0) breakInfoSocket:settimeout(0)
debugger_sendMsg(breakInfoSocket, LuaDebugger.event.C2S_SetSocketName, { debugger_sendMsg(breakInfoSocket, LuaDebugger.event.C2S_SetSocketName, {
name = "breakPointSocket" name = "breakPointSocket"
@ -2373,41 +2399,46 @@ local function start()
xpcall(function() xpcall(function()
sethook(debug_hook, "lrc") sethook(debug_hook, "lrc")
end, function(error) end, function(error)
-- print("error:", error) print("error:", error)
end) end)
if (not jit) then if(not jit) then
if (_VERSION) then if(_VERSION)then
-- print("当前lua版本为: ".._VERSION.." 请使用LuaDebug 进行调试!") print("当前lua版本为: ".._VERSION.." 请使用LuaDebug 进行调试!")
else else
-- print("当前为lua版本,请使用LuaDebug 进行调试!") print("当前为lua版本,请使用LuaDebug 进行调试!")
end end
end end
_resume(coro_debugger, server) _resume(coro_debugger, server)
end end
end end
end end
function StartDebug(host, port) function StartDebug(host, port)
if (not host) then
-- print("error host nil")
if(not host) then
print("error host nil")
end end
if (not port) then if(not port) then
-- print("error prot nil") print("error prot nil")
end end
if (type(host) ~= "string") then if(type(host) ~= "string") then
-- print("error host not string") print("error host not string")
end end
if (type(port) ~= "number") then if(type(port) ~= "number") then
-- print("error host not number") print("error host not number")
end end
controller_host = host controller_host = host
controller_port = port controller_port = port
xpcall(start, function(error) xpcall(start, function(error)
-- body -- body
-- print(error) print(error)
end) end)
return debugger_receiveDebugBreakInfo, debugger_xpcall return debugger_receiveDebugBreakInfo, debugger_xpcall
end end
--base64 --base64
local string = string local string = string
@ -2417,10 +2448,10 @@ ZZBase64.__code = {
'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',
'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/',
}; };
ZZBase64.__decode = {} ZZBase64.__decode = {}
for k, v in pairs(ZZBase64.__code) do for k,v in pairs(ZZBase64.__code) do
ZZBase64.__decode[string.byte(v, 1)] = k - 1 ZZBase64.__decode[string.byte(v,1)] = k - 1
end end
function ZZBase64.encode(text) function ZZBase64.encode(text)
@ -2430,14 +2461,14 @@ function ZZBase64.encode(text)
local res = {} local res = {}
local index = 1 local index = 1
for i = 1, len, 3 do for i = 1, len, 3 do
local a = string.byte(text, i) local a = string.byte(text, i )
local b = string.byte(text, i + 1) local b = string.byte(text, i + 1)
local c = string.byte(text, i + 2) local c = string.byte(text, i + 2)
-- num = a<<16 + b<<8 + c -- num = a<<16 + b<<8 + c
local num = a * 65536 + b * 256 + c local num = a * 65536 + b * 256 + c
for j = 1, 4 do for j = 1, 4 do
--tmp = num >> ((4 -j) * 6) --tmp = num >> ((4 -j) * 6)
local tmp = math.floor(num / (2 ^ ((4 - j) * 6))) local tmp = math.floor(num / (2 ^ ((4-j) * 6)))
--curPos = tmp&0x3f --curPos = tmp&0x3f
local curPos = tmp % 64 + 1 local curPos = tmp % 64 + 1
res[index] = ZZBase64.__code[curPos] res[index] = ZZBase64.__code[curPos]
@ -2474,13 +2505,13 @@ function ZZBase64.__left2(res, index, text, len)
res[index + 3] = "=" res[index + 3] = "="
end end
function ZZBase64.__left1(res, index, text, len) function ZZBase64.__left1(res, index,text, len)
local num = string.byte(text, len + 1) local num = string.byte(text, len + 1)
num = num * 16 num = num * 16
local tmp = math.floor(num / 64) local tmp = math.floor(num / 64)
local curPos = tmp % 64 + 1 local curPos = tmp % 64 + 1
res[index] = ZZBase64.__code[curPos] res[index ] = ZZBase64.__code[curPos]
curPos = num % 64 + 1 curPos = num % 64 + 1
res[index + 1] = ZZBase64.__code[curPos] res[index + 1] = ZZBase64.__code[curPos]
@ -2503,11 +2534,11 @@ function ZZBase64.decode(text)
local res = {} local res = {}
local index = 1 local index = 1
local decode = ZZBase64.__decode local decode = ZZBase64.__decode
for i = 1, len, 4 do for i =1, len, 4 do
local a = decode[string.byte(text, i)] local a = decode[string.byte(text,i )]
local b = decode[string.byte(text, i + 1)] local b = decode[string.byte(text,i + 1)]
local c = decode[string.byte(text, i + 2)] local c = decode[string.byte(text,i + 2)]
local d = decode[string.byte(text, i + 3)] local d = decode[string.byte(text,i + 3)]
--num = a<<18 + b<<12 + c<<6 + d --num = a<<18 + b<<12 + c<<6 + d
local num = a * 262144 + b * 4096 + c * 64 + d local num = a * 262144 + b * 4096 + c * 64 + d
@ -2516,7 +2547,7 @@ function ZZBase64.decode(text)
num = math.floor(num / 256) num = math.floor(num / 256)
local f = string.char(num % 256) local f = string.char(num % 256)
num = math.floor(num / 256) num = math.floor(num / 256)
res[index] = string.char(num % 256) res[index ] = string.char(num % 256)
res[index + 1] = f res[index + 1] = f
res[index + 2] = e res[index + 2] = e
index = index + 3 index = index + 3
@ -2552,4 +2583,7 @@ function ZZBase64.__decodeLeft2(res, index, text, len)
res[index] = string.char(num) res[index] = string.char(num)
end end
return StartDebug return StartDebug

View File

@ -152,34 +152,34 @@ function ShareScreenShot(n, callback)
end) end)
end end
function shareQRCodePicture(url, secene) function shareQRCodePicture(url,secene)
---- print(debug.traceback()) --print(debug.traceback())
-- print(url) print(url)
-- print(secene) print(secene)
local json_data = {} local json_data = {}
json_data["title"] = "湘北联赛" json_data["title"] = "湘北联赛"
local mediaObject = {} local mediaObject = {}
local filename = "qrcode" .. DataManager.SelfUser.account_id local filename = "qrcode" .. DataManager.SelfUser.account_id
-- print(Application.persistentDataPath) print(Application.persistentDataPath)
mediaObject["path"] = Application.persistentDataPath mediaObject["path"] = Application.persistentDataPath
mediaObject["filename"] = filename mediaObject["filename"] = filename
mediaObject["type"] = 1 mediaObject["type"] = 1
json_data["mediaObject"] = mediaObject json_data["mediaObject"] = mediaObject
json_data["description"] = "一款现实中朋友约局休闲娱乐的场所!速度约朋友一起来玩吧!" json_data["description"] = "一款现实中朋友约局休闲娱乐的场所!速度约朋友一起来玩吧!"
json_data["scene"] = secene json_data["scene"] = secene
-- print("json_data==================") print("json_data==================")
local json_str = json.encode(json_data) local json_str = json.encode(json_data)
pt(json_str) pt(json_str)
local tex2 = QRCodePicture.GenerateQRcode(url, 250, 250) local tex2 = QRCodePicture.GenerateQRcode(url, 250, 250)
local tex1 = ResourcesManager.LoadObject("base/lobby/bg/bg.png", typeof(UnityEngine.Texture2D)) local tex1 = ResourcesManager.LoadObject("base/lobby/bg/bg.png",typeof(UnityEngine.Texture2D))
filename = filename .. ".jpg" filename = filename ..".jpg"
-- print("text2==========") print("text2==========")
-- print(tex2) print(tex2)
-- print("text1==========") print("text1==========")
-- print(tex1) print(tex1)
-- print("filename==========") print("filename==========")
-- print(filename) print(filename)
QRCodePicture.CombanitePicture(tex1, tex2, 393, 1334 - 802 - 250, filename) QRCodePicture.CombanitePicture(tex1,tex2,393,1334-802-250,filename)
GameApplication.Instance:ShareLink(1, json_str, nil) GameApplication.Instance:ShareLink(1, json_str, nil)
end end
@ -201,9 +201,7 @@ local bg_url = nil
function LoadGameBg(url, main_view) function LoadGameBg(url, main_view)
local win_mode = main_view:GetChild("win_mode") local win_mode = main_view:GetChild("win_mode")
win_mode:RemoveChildren(0, -1, true) win_mode:RemoveChildren(0, -1, true)
local tex_bg = ResourcesManager.LoadObjectByGroup(url .. ".png", typeof(UnityEngine.Texture), url) local tex_bg = ResourcesManager.LoadObjectByGroup(url..".png",typeof(UnityEngine.Texture), url)
-- print("===========================mainbg")
-- print(url..".png",typeof(UnityEngine.Texture), url)
local bg = GImage() local bg = GImage()
bg.texture = FairyGUI.NTexture(tex_bg) bg.texture = FairyGUI.NTexture(tex_bg)
bg.width = win_mode.width bg.width = win_mode.width
@ -365,6 +363,6 @@ end
function printlog(...) function printlog(...)
if debug_print then if debug_print then
-- print(...) print(...)
end end
end end

View File

@ -1,7 +1,7 @@
local debugger_reLoadFile = nil local debugger_reLoadFile =nil
xpcall(function() xpcall(function()
debugger_reLoadFile = require("luaideReLoadFile") debugger_reLoadFile = require("luaideReLoadFile")
end, function() end,function()
debugger_reLoadFile = function() print("未实现代码重载") end debugger_reLoadFile = function() print("未实现代码重载") end
end) end)
local debugger_stackInfo = nil local debugger_stackInfo = nil
@ -392,7 +392,6 @@ local function createJson()
function json.null() function json.null()
return json.null -- so json.null() will also return null ;-) return json.null -- so json.null() will also return null ;-)
end end
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
-- Internal, PRIVATE functions. -- Internal, PRIVATE functions.
-- Following a Python-like convention, I have prefixed all these 'PRIVATE' -- Following a Python-like convention, I have prefixed all these 'PRIVATE'
@ -450,8 +449,8 @@ local function createJson()
-- @return object, int The object (true, false or nil) and the position at which the next character should be -- @return object, int The object (true, false or nil) and the position at which the next character should be
-- scanned. -- scanned.
function decode_scanConstant(s, startPos) function decode_scanConstant(s, startPos)
local consts = { ["true"] = true, ["false"] = false, ["null"] = nil } local consts = {["true"] = true, ["false"] = false, ["null"] = nil}
local constNames = { "true", "false", "null" } local constNames = {"true", "false", "null"}
for i, k in pairs(constNames) do for i, k in pairs(constNames) do
if string.sub(s, startPos, startPos + string.len(k) - 1) == k then if string.sub(s, startPos, startPos + string.len(k) - 1) == k then
@ -777,17 +776,17 @@ function print(...)
end end
if (LuaDebugger.isProntToConsole == 1 or LuaDebugger.isProntToConsole == 2) then if (LuaDebugger.isProntToConsole == 1 or LuaDebugger.isProntToConsole == 2) then
if (debug_server) then if (debug_server) then
local arg = { ... } --这里的...和{}符号中间需要有空格号,否则会出错 local arg = {...} --这里的...和{}符号中间需要有空格号,否则会出错
local str = "" local str = ""
if (#arg == 0) then if (#arg == 0) then
arg = { "nil" } arg = {"nil"}
end end
for k, v in pairs(arg) do for k, v in pairs(arg) do
str = str .. tostring(v) .. "\t" str = str .. tostring(v) .. "\t"
end end
local sendMsg = { local sendMsg = {
event = LuaDebugger.event.C2S_LuaPrint, event = LuaDebugger.event.C2S_LuaPrint,
data = { msg = ZZBase64.encode(str), type = 1 } data = {msg = ZZBase64.encode(str), type = 1}
} }
local sendStr = json.encode(sendMsg) local sendStr = json.encode(sendMsg)
debug_server:send(sendStr .. "__debugger_k0204__") debug_server:send(sendStr .. "__debugger_k0204__")
@ -801,48 +800,46 @@ function luaIdePrintWarn(...)
end end
if (LuaDebugger.isProntToConsole == 1 or LuaDebugger.isProntToConsole == 2) then if (LuaDebugger.isProntToConsole == 1 or LuaDebugger.isProntToConsole == 2) then
if (debug_server) then if (debug_server) then
local arg = { ... } --这里的...和{}符号中间需要有空格号,否则会出错 local arg = {...} --这里的...和{}符号中间需要有空格号,否则会出错
local str = "" local str = ""
if (#arg == 0) then if (#arg == 0) then
arg = { "nil" } arg = {"nil"}
end end
for k, v in pairs(arg) do for k, v in pairs(arg) do
str = str .. tostring(v) .. "\t" str = str .. tostring(v) .. "\t"
end end
local sendMsg = { local sendMsg = {
event = LuaDebugger.event.C2S_LuaPrint, event = LuaDebugger.event.C2S_LuaPrint,
data = { msg = ZZBase64.encode(str), type = 2 } data = {msg = ZZBase64.encode(str), type = 2}
} }
local sendStr = json.encode(sendMsg) local sendStr = json.encode(sendMsg)
debug_server:send(sendStr .. "__debugger_k0204__") debug_server:send(sendStr .. "__debugger_k0204__")
end end
end end
end end
function luaIdePrintErr(...) function luaIdePrintErr(...)
if (LuaDebugger.isProntToConsole == 1 or LuaDebugger.isProntToConsole == 3) then if (LuaDebugger.isProntToConsole == 1 or LuaDebugger.isProntToConsole == 3) then
debugger_print(...) debugger_print(...)
end end
if (LuaDebugger.isProntToConsole == 1 or LuaDebugger.isProntToConsole == 2) then if (LuaDebugger.isProntToConsole == 1 or LuaDebugger.isProntToConsole == 2) then
if (debug_server) then if (debug_server) then
local arg = { ... } --这里的...和{}符号中间需要有空格号,否则会出错 local arg = {...} --这里的...和{}符号中间需要有空格号,否则会出错
local str = "" local str = ""
if (#arg == 0) then if (#arg == 0) then
arg = { "nil" } arg = {"nil"}
end end
for k, v in pairs(arg) do for k, v in pairs(arg) do
str = str .. tostring(v) .. "\t" str = str .. tostring(v) .. "\t"
end end
local sendMsg = { local sendMsg = {
event = LuaDebugger.event.C2S_LuaPrint, event = LuaDebugger.event.C2S_LuaPrint,
data = { msg = ZZBase64.encode(str), type = 3 } data = {msg = ZZBase64.encode(str), type = 3}
} }
local sendStr = json.encode(sendMsg) local sendStr = json.encode(sendMsg)
debug_server:send(sendStr .. "__debugger_k0204__") debug_server:send(sendStr .. "__debugger_k0204__")
end end
end end
end end
--@endregion --@endregion
--@region 辅助方法 --@region 辅助方法
@ -980,7 +977,7 @@ local function debugger_dump(value, desciption, nesting)
return tostring(v) return tostring(v)
end end
local traceback = debugger_strSplit(debug.traceback("", 2), "\n") local traceback = debugger_strSplit(debug.traceback("", 2), "\n")
-- print("dump from: " .. debugger_strTrim(traceback[3])) print("dump from: " .. debugger_strTrim(traceback[3]))
local function _dump(value, desciption, indent, nest, keylen) local function _dump(value, desciption, indent, nest, keylen)
desciption = desciption or "<var>" desciption = desciption or "<var>"
local spc = "" local spc = ""
@ -1029,7 +1026,7 @@ local function debugger_dump(value, desciption, nesting)
end end
_dump(value, desciption, "- ", 1) _dump(value, desciption, "- ", 1)
for i, line in ipairs(result) do for i, line in ipairs(result) do
-- print(line) print(line)
end end
end end
--@endregion --@endregion
@ -1038,7 +1035,9 @@ local function debugger_valueToString(v)
local vstr = nil local vstr = nil
if (vtype == "userdata") then if (vtype == "userdata") then
if (LuaDebugger.isFoxGloryProject) then if (LuaDebugger.isFoxGloryProject) then
return "userdata", vtype
return "userdata",vtype
else else
return tostring(v), vtype return tostring(v), vtype
end end
@ -1046,11 +1045,11 @@ local function debugger_valueToString(v)
local value = vtype local value = vtype
xpcall(function() xpcall(function()
value = tostring(v) value = tostring(v)
end, function() end,function()
value = vtype value = vtype
end) end)
return value, vtype return value, vtype
elseif (vtype == "number" or vtype == "string") then elseif (vtype == "number" or vtype == "string" ) then
return v, vtype return v, vtype
else else
return tostring(v), vtype return tostring(v), vtype
@ -1058,12 +1057,12 @@ local function debugger_valueToString(v)
end end
local function debugger_setVarInfo(name, value) local function debugger_setVarInfo(name, value)
local valueStr, valueType = debugger_valueToString(value) local valueStr, valueType = debugger_valueToString(value)
local nameStr, nameType = debugger_valueToString(name) local nameStr,nameType = debugger_valueToString(name)
if (valueStr == nil) then if(valueStr == nil) then
valueStr = valueType valueStr = valueType
end end
local valueInfo = { local valueInfo = {
name = nameStr, name =nameStr,
valueType = valueType, valueType = valueType,
valueStr = ZZBase64.encode(valueStr) valueStr = ZZBase64.encode(valueStr)
} }
@ -1101,7 +1100,7 @@ local function debugger_getvalue(f)
i = i + 1 i = i + 1
end end
return { locals = locals, ups = ups } return {locals = locals, ups = ups}
end end
--获取堆栈 --获取堆栈
debugger_stackInfo = debugger_stackInfo =
@ -1147,7 +1146,7 @@ debugger_stackInfo =
end end
end end
local stackInfo = { stack = stack, vars = varInfos, funcs = funcs } local stackInfo = {stack = stack, vars = varInfos, funcs = funcs}
local data = { local data = {
stack = stackInfo.stack, stack = stackInfo.stack,
vars = stackInfo.vars, vars = stackInfo.vars,
@ -1158,7 +1157,7 @@ debugger_stackInfo =
} }
LuaDebugger.currentTempFunc = data.funcs[1] LuaDebugger.currentTempFunc = data.funcs[1]
return data return data
end end
--===========================点断信息================================================== --===========================点断信息==================================================
--根据不同的游戏引擎进行定时获取断点信息 --根据不同的游戏引擎进行定时获取断点信息
@ -1168,12 +1167,12 @@ local function debugger_receiveDebugBreakInfo()
if (jit) then if (jit) then
if (LuaDebugger.debugLuaType ~= "jit") then if (LuaDebugger.debugLuaType ~= "jit") then
local msg = "当前luajit版本为: " .. jit.version .. " 请使用LuaDebugjit 进行调试!" local msg = "当前luajit版本为: " .. jit.version .. " 请使用LuaDebugjit 进行调试!"
-- print(msg) print(msg)
end end
end end
if (breakInfoSocket) then if (breakInfoSocket) then
local msg, status = breakInfoSocket:receive() local msg, status = breakInfoSocket:receive()
if (LuaDebugger.isLaunch and status == "closed") then if(LuaDebugger.isLaunch and status == "closed") then
os.exit() os.exit()
end end
if (msg) then if (msg) then
@ -1183,12 +1182,12 @@ local function debugger_receiveDebugBreakInfo()
elseif netData.event == LuaDebugger.event.S2C_LoadLuaScript then elseif netData.event == LuaDebugger.event.S2C_LoadLuaScript then
LuaDebugger.loadScriptBody = netData.data LuaDebugger.loadScriptBody = netData.data
debugger_exeLuaString() debugger_exeLuaString()
debugger_sendMsg(breakInfoSocket, LuaDebugger.event.C2S_LoadLuaScript, LuaDebugger.loadScriptBody) debugger_sendMsg(breakInfoSocket,LuaDebugger.event.C2S_LoadLuaScript,LuaDebugger.loadScriptBody)
elseif netData.event == LuaDebugger.event.S2C_ReLoadFile then elseif netData.event == LuaDebugger.event.S2C_ReLoadFile then
LuaDebugger.reLoadFileBody = netData.data LuaDebugger.reLoadFileBody = netData.data
LuaDebugger.isReLoadFile = false LuaDebugger.isReLoadFile = false
LuaDebugger.reLoadFileBody.isReLoad = debugger_reLoadFile(LuaDebugger.reLoadFileBody) LuaDebugger.reLoadFileBody.isReLoad = debugger_reLoadFile(LuaDebugger.reLoadFileBody)
-- print("重载结果:",LuaDebugger.reLoadFileBody.isReLoad) print("重载结果:",LuaDebugger.reLoadFileBody.isReLoad)
LuaDebugger.reLoadFileBody.script = nil LuaDebugger.reLoadFileBody.script = nil
debugger_sendMsg( debugger_sendMsg(
breakInfoSocket, breakInfoSocket,
@ -1291,7 +1290,7 @@ debugger_setBreak =
end end
LuaDebugger.isHook = false LuaDebugger.isHook = false
end end
end end
local function debugger_checkFileIsBreak(fileName) local function debugger_checkFileIsBreak(fileName)
return LuaDebugger.breakInfos[fileName] return LuaDebugger.breakInfos[fileName]
end end
@ -1323,7 +1322,7 @@ function debugger_conditionStr(condition, vars, callBack)
currentTabble[k] = v currentTabble[k] = v
end end
end end
setmetatable(currentTabble, { __index = _G }) setmetatable(currentTabble, {__index = _G})
local fun = loadstring("return " .. condition) local fun = loadstring("return " .. condition)
setfenv(fun, currentTabble) setfenv(fun, currentTabble)
return fun() return fun()
@ -1333,20 +1332,21 @@ function debugger_conditionStr(condition, vars, callBack)
xpcall( xpcall(
loadScript, loadScript,
function(error) function(error)
-- print(error) print(error)
end end
) )
if (status and msg) then if (status and msg) then
callBack() callBack()
end end
end end
--执行lua字符串 --执行lua字符串
debugger_exeLuaString = function() debugger_exeLuaString = function()
local function loadScript() local function loadScript()
local script = LuaDebugger.loadScriptBody.script local script = LuaDebugger.loadScriptBody.script
if (LuaDebugger.loadScriptBody.isBreak) then if (LuaDebugger.loadScriptBody.isBreak) then
local currentTabble = { _G = _G } local currentTabble = {_G = _G}
local frameId = LuaDebugger.loadScriptBody.frameId local frameId = LuaDebugger.loadScriptBody.frameId
frameId = frameId frameId = frameId
local func = LuaDebugger.currentDebuggerData.funcs[frameId] local func = LuaDebugger.currentDebuggerData.funcs[frameId]
@ -1359,7 +1359,7 @@ debugger_exeLuaString = function()
for k, v in pairs(locals) do for k, v in pairs(locals) do
currentTabble[k] = v currentTabble[k] = v
end end
setmetatable(currentTabble, { __index = _G }) setmetatable(currentTabble, {__index = _G})
local fun = loadstring(script) local fun = loadstring(script)
setfenv(fun, currentTabble) setfenv(fun, currentTabble)
@ -1374,47 +1374,50 @@ debugger_exeLuaString = function()
xpcall( xpcall(
loadScript, loadScript,
function(error) function(error)
-- debugger_sendMsg(debug_server, LuaDebugger.event.C2S_LoadLuaScript, LuaDebugger.loadScriptBody) -- debugger_sendMsg(debug_server, LuaDebugger.event.C2S_LoadLuaScript, LuaDebugger.loadScriptBody)
end end
) )
LuaDebugger.loadScriptBody.script = nil LuaDebugger.loadScriptBody.script = nil
if (LuaDebugger.loadScriptBody.isBreak) then if (LuaDebugger.loadScriptBody.isBreak) then
LuaDebugger.serVarLevel = LuaDebugger.serVarLevel + 1 LuaDebugger.serVarLevel = LuaDebugger.serVarLevel+1
LuaDebugger.currentDebuggerData = debugger_stackInfo(LuaDebugger.serVarLevel, LuaDebugger.event LuaDebugger.currentDebuggerData = debugger_stackInfo(LuaDebugger.serVarLevel, LuaDebugger.event.C2S_HITBreakPoint)
.C2S_HITBreakPoint)
LuaDebugger.loadScriptBody.stack = LuaDebugger.currentDebuggerData.stack LuaDebugger.loadScriptBody.stack = LuaDebugger.currentDebuggerData.stack
end end
LuaDebugger.loadScriptBody.complete = true LuaDebugger.loadScriptBody.complete = true
end end
--@region 调试中修改变量值 --@region 调试中修改变量值
--根据key 值在 value 查找 --根据key 值在 value 查找
local function debugger_getTablekey(key, keyType, value) local function debugger_getTablekey(key,keyType,value)
if (keyType == -1) then if(keyType == -1) then
return key return key
elseif (keyType == 1) then elseif(keyType == 1) then
return tonumber(key) return tonumber(key)
elseif (keyType == 2) then elseif(keyType == 2) then
local valueKey = nil local valueKey = nil
for k, v in pairs(value) do for k,v in pairs(value) do
local nameType = type(k) local nameType = type(k)
if (nameType == "userdata" or nameType == "table") then if(nameType == "userdata" or nameType == "table") then
if (not LuaDebugger.isFoxGloryProject) then if (not LuaDebugger.isFoxGloryProject) then
valueKey = tostring(k) valueKey = tostring(k)
if (key == valueKey) then if(key == valueKey) then
return k return k
end end
break break
end end
end end
end end
end end
end end
local function debugger_setVarValue(server, data) local function debugger_setVarValue(server, data)
local newValue = nil local newValue = nil
local level = LuaDebugger.serVarLevel + LuaDebugger.setVarBody.frameId local level = LuaDebugger.serVarLevel+LuaDebugger.setVarBody.frameId
local firstKeyName = data.keys[1] local firstKeyName = data.keys[1]
--@region vars check --@region vars check
local localValueChangeIndex = -1 local localValueChangeIndex = -1
@ -1429,7 +1432,7 @@ local function debugger_setVarValue(server, data)
if not name then if not name then
break break
end end
if (firstKeyName == name) then if(firstKeyName == name) then
localValueChangeIndex = i localValueChangeIndex = i
oldValue = value oldValue = value
end end
@ -1447,7 +1450,7 @@ local function debugger_setVarValue(server, data)
if not name then if not name then
break break
end end
if (localValueChangeIndex == -1 and firstKeyName == name) then if(localValueChangeIndex == -1 and firstKeyName == name) then
upValueFun = func upValueFun = func
oldValue = value oldValue = value
upValueChangeIndex = i upValueChangeIndex = i
@ -1459,8 +1462,8 @@ local function debugger_setVarValue(server, data)
end end
i = i + 1 i = i + 1
end end
--@endregion --@endregion
local vars = { locals = locals, ups = ups } local vars = {locals = locals, ups = ups}
local function loadScript() local function loadScript()
local currentTabble = {} local currentTabble = {}
@ -1477,7 +1480,7 @@ local function debugger_setVarValue(server, data)
currentTabble[k] = v currentTabble[k] = v
end end
end end
setmetatable(currentTabble, { __index = _G }) setmetatable(currentTabble, {__index = _G})
local fun = loadstring("return " .. data.value) local fun = loadstring("return " .. data.value)
setfenv(fun, currentTabble) setfenv(fun, currentTabble)
newValue = fun() newValue = fun()
@ -1487,7 +1490,7 @@ local function debugger_setVarValue(server, data)
xpcall( xpcall(
loadScript, loadScript,
function(error) function(error)
-- print(error, "============================") print(error, "============================")
end end
) )
@ -1496,37 +1499,39 @@ local function debugger_setVarValue(server, data)
-- local 查找并替换 -- local 查找并替换
local keyLength = #data.keys local keyLength = #data.keys
if (keyLength == 1) then if(keyLength == 1) then
if (localValueChangeIndex ~= -1) then if(localValueChangeIndex ~= -1) then
debug.setlocal(level, localValueChangeIndex, newValue) debug.setlocal(level, localValueChangeIndex, newValue)
elseif (upValueFun ~= nil) then elseif(upValueFun ~= nil) then
debug.setupvalue(upValueFun, upValueChangeIndex, newValue) debug.setupvalue( upValueFun, upValueChangeIndex, newValue )
else else
--全局变量查找 --全局变量查找
if (_G[firstKeyName]) then if(_G[firstKeyName]) then
_G[firstKeyName] = newValue _G[firstKeyName] = newValue
end end
end end
else else
if (not oldValue) then if(not oldValue) then
if (_G[firstKeyName]) then if(_G[firstKeyName]) then
oldValue = _G[firstKeyName] oldValue = _G[firstKeyName]
end end
end end
local tempValue = oldValue local tempValue = oldValue
for i = 2, keyLength - 1 do for i=2,keyLength-1 do
if (tempValue) then if(tempValue) then
oldValue = oldValue[debugger_getTablekey(data.keys[i], data.numberTypes[i], oldValue)] oldValue = oldValue[debugger_getTablekey(data.keys[i],data.numberTypes[i],oldValue)]
end end
end end
if (tempValue) then if(tempValue) then
oldValue[debugger_getTablekey(data.keys[keyLength], data.numberTypes[keyLength], oldValue)] = newValue oldValue[debugger_getTablekey(data.keys[keyLength],data.numberTypes[keyLength],oldValue)] = newValue
end end
end end
local varInfo = debugger_setVarInfo(data.varName, newValue) local varInfo = debugger_setVarInfo(data.varName, newValue)
data.varInfo = varInfo data.varInfo = varInfo
LuaDebugger.serVarLevel = LuaDebugger.serVarLevel + 1 LuaDebugger.serVarLevel = LuaDebugger.serVarLevel+1
LuaDebugger.currentDebuggerData = debugger_stackInfo(LuaDebugger.serVarLevel, LuaDebugger.event.C2S_HITBreakPoint) LuaDebugger.currentDebuggerData = debugger_stackInfo(LuaDebugger.serVarLevel, LuaDebugger.event.C2S_HITBreakPoint)
end end
--@endregion --@endregion
@ -1538,41 +1543,41 @@ checkSetVar =
function() function()
if (LuaDebugger.isSetVar) then if (LuaDebugger.isSetVar) then
LuaDebugger.isSetVar = false LuaDebugger.isSetVar = false
debugger_setVarValue(debug_server, LuaDebugger.setVarBody) debugger_setVarValue(debug_server,LuaDebugger.setVarBody)
LuaDebugger.serVarLevel = LuaDebugger.serVarLevel + 1 LuaDebugger.serVarLevel = LuaDebugger.serVarLevel+1
_resume(coro_debugger, LuaDebugger.setVarBody) _resume(coro_debugger, LuaDebugger.setVarBody)
xpcall( xpcall(
checkSetVar, checkSetVar,
function(error) function(error)
-- print("设置变量", error) print("设置变量", error)
end end
) )
elseif (LuaDebugger.isLoadLuaScript) then elseif(LuaDebugger.isLoadLuaScript) then
LuaDebugger.isLoadLuaScript = false LuaDebugger.isLoadLuaScript = false
debugger_exeLuaString() debugger_exeLuaString()
LuaDebugger.serVarLevel = LuaDebugger.serVarLevel + 1 LuaDebugger.serVarLevel = LuaDebugger.serVarLevel+1
_resume(coro_debugger, LuaDebugger.reLoadFileBody) _resume(coro_debugger, LuaDebugger.reLoadFileBody)
xpcall( xpcall(
checkSetVar, checkSetVar,
function(error) function(error)
-- print("执行代码", error) print("执行代码", error)
end end
) )
elseif (LuaDebugger.isReLoadFile) then elseif(LuaDebugger.isReLoadFile) then
LuaDebugger.isReLoadFile = false LuaDebugger.isReLoadFile = false
LuaDebugger.reLoadFileBody.isReLoad = debugger_reLoadFile(LuaDebugger.reLoadFileBody) LuaDebugger.reLoadFileBody.isReLoad = debugger_reLoadFile(LuaDebugger.reLoadFileBody)
-- print("重载结果:",LuaDebugger.reLoadFileBody.isReLoad) print("重载结果:",LuaDebugger.reLoadFileBody.isReLoad)
LuaDebugger.reLoadFileBody.script = nil LuaDebugger.reLoadFileBody.script = nil
LuaDebugger.serVarLevel = LuaDebugger.serVarLevel + 1 LuaDebugger.serVarLevel = LuaDebugger.serVarLevel+1
_resume(coro_debugger, LuaDebugger.reLoadFileBody) _resume(coro_debugger, LuaDebugger.reLoadFileBody)
xpcall( xpcall(
checkSetVar, checkSetVar,
function(error) function(error)
-- print("重新加载文件", error) print("重新加载文件", error)
end end
) )
end end
end end
@ -1622,7 +1627,7 @@ local function debugger_getValueByScript(value, script)
val = fun() val = fun()
end, end,
function(error) function(error)
-- print(error, "====>") print(error, "====>")
val = nil val = nil
end end
) )
@ -1889,6 +1894,7 @@ local function debugger_sendTableValues(value, server, variablesReference, debug
vinfos = {} vinfos = {}
end end
end end
end end
else else
m = getmetatable(value) m = getmetatable(value)
@ -1938,6 +1944,7 @@ local function debugger_getBreakVar(body, server)
if (value) then if (value) then
local valueType = type(value) local valueType = type(value)
if (valueType == "table" or valueType == "userdata") then if (valueType == "table" or valueType == "userdata") then
debugger_sendTableValues(value, server, variablesReference, debugSpeedIndex) debugger_sendTableValues(value, server, variablesReference, debugSpeedIndex)
else else
if (valueType == "function") then if (valueType == "function") then
@ -1972,9 +1979,9 @@ local function debugger_getBreakVar(body, server)
xpcall( xpcall(
exe, exe,
function(error) function(error)
-- -- print("获取变量错误 错误消息-----------------") -- print("获取变量错误 错误消息-----------------")
-- -- print(error) -- print(error)
-- -- print(debug.traceback("", 2)) -- print(debug.traceback("", 2))
debugger_sendMsg( debugger_sendMsg(
server, server,
LuaDebugger.event.C2S_ReqVar, LuaDebugger.event.C2S_ReqVar,
@ -2011,7 +2018,7 @@ local function debugger_loop(server)
while true do while true do
local line, status = server:receive() local line, status = server:receive()
if (status == "closed") then if (status == "closed") then
if (LuaDebugger.isLaunch) then if(LuaDebugger.isLaunch) then
os.exit() os.exit()
else else
debug.sethook() debug.sethook()
@ -2023,12 +2030,13 @@ local function debugger_loop(server)
local event = netData.event local event = netData.event
local body = netData.data local body = netData.data
if (event == LuaDebugger.event.S2C_DebugClose) then if (event == LuaDebugger.event.S2C_DebugClose) then
if (LuaDebugger.isLaunch) then if(LuaDebugger.isLaunch) then
os.exit() os.exit()
else else
debug.sethook() debug.sethook()
coroutine.yield() coroutine.yield()
end end
elseif event == LuaDebugger.event.S2C_SetBreakPoints then elseif event == LuaDebugger.event.S2C_SetBreakPoints then
--设置断点信息 --设置断点信息
local function setB() local function setB()
@ -2037,7 +2045,7 @@ local function debugger_loop(server)
xpcall( xpcall(
setB, setB,
function(error) function(error)
-- print(error) print(error)
end end
) )
elseif event == LuaDebugger.event.S2C_RUN then --开始运行 elseif event == LuaDebugger.event.S2C_RUN then --开始运行
@ -2148,26 +2156,29 @@ local function debugger_loop(server)
end end
coro_debugger = coroutine.create(debugger_loop) coro_debugger = coroutine.create(debugger_loop)
debug_hook = function(event, line) debug_hook = function(event, line)
if (not LuaDebugger.isHook) then
if(not LuaDebugger.isHook) then
return return
end end
if (LuaDebugger.Run) then if(LuaDebugger.Run) then
if (event == "line") then if(event == "line") then
local isCheck = false local isCheck = false
for k, breakInfo in pairs(LuaDebugger.breakInfos) do for k, breakInfo in pairs(LuaDebugger.breakInfos) do
for bk, linesInfo in pairs(breakInfo) do for bk, linesInfo in pairs(breakInfo) do
if (linesInfo.lines and linesInfo.lines[line]) then
if(linesInfo.lines and linesInfo.lines[line]) then
isCheck = true isCheck = true
break break
end end
end end
if (isCheck) then if(isCheck) then
break break
end end
end end
if (not isCheck) then if(not isCheck) then
return return
end end
else else
@ -2198,7 +2209,7 @@ debug_hook = function(event, line)
return return
end end
-- debugger_dump(LuaDebugger,"LuaDebugger") -- debugger_dump(LuaDebugger,"LuaDebugger")
-- -- print(LuaDebugger.StepNextLevel,"LuaDebugger.StepNextLevel") -- print(LuaDebugger.StepNextLevel,"LuaDebugger.StepNextLevel")
local file = nil local file = nil
if (event == "call") then if (event == "call") then
-- end -- end
@ -2206,7 +2217,7 @@ debug_hook = function(event, line)
if (not LuaDebugger.Run) then if (not LuaDebugger.Run) then
LuaDebugger.StepNextLevel = LuaDebugger.StepNextLevel + 1 LuaDebugger.StepNextLevel = LuaDebugger.StepNextLevel + 1
end end
-- -- print("stepIn",LuaDebugger.StepNextLevel) -- print("stepIn",LuaDebugger.StepNextLevel)
local stepInfo = getinfo(2, "S") local stepInfo = getinfo(2, "S")
local source = stepInfo.source local source = stepInfo.source
@ -2248,6 +2259,7 @@ debug_hook = function(event, line)
local breakInfo = LuaDebugger.breakInfos[file] local breakInfo = LuaDebugger.breakInfos[file]
local breakData = nil local breakData = nil
if (breakInfo) then if (breakInfo) then
local ischeck = false local ischeck = false
for k, lineInfo in pairs(breakInfo) do for k, lineInfo in pairs(breakInfo) do
local lines = lineInfo.lines local lines = lineInfo.lines
@ -2287,13 +2299,13 @@ debug_hook = function(event, line)
end end
pathNamesCount = pathNamesCount - 1 pathNamesCount = pathNamesCount - 1
hitPathNamesCount = hitPathNamesCount - 1 hitPathNamesCount = hitPathNamesCount - 1
checkCount = checkCount + 1 checkCount = checkCount+1
if (pathNamesCount <= 0 or hitPathNamesCount <= 0) then if (pathNamesCount <= 0 or hitPathNamesCount <= 0) then
break break
end end
end end
if (checkCount > 0) then if(checkCount>0) then
break; break;
end end
else else
@ -2372,7 +2384,7 @@ end
local function debugger_xpcall() local function debugger_xpcall()
--调用 coro_debugger 并传入 参数 --调用 coro_debugger 并传入 参数
local data = debugger_stackInfo(4, LuaDebugger.event.C2S_HITBreakPoint) local data = debugger_stackInfo(4, LuaDebugger.event.C2S_HITBreakPoint)
if (data.stack and data.stack[1]) then if(data.stack and data.stack[1]) then
data.stack[1].isXpCall = true data.stack[1].isXpCall = true
end end
--挂起等待调试器作出反应 --挂起等待调试器作出反应
@ -2384,8 +2396,8 @@ local function start()
local fullName, dirName, fileName = debugger_getFilePathInfo(getinfo(1).source) local fullName, dirName, fileName = debugger_getFilePathInfo(getinfo(1).source)
LuaDebugger.DebugLuaFie = fileName LuaDebugger.DebugLuaFie = fileName
local socket = createSocket() local socket = createSocket()
-- print(controller_host) print(controller_host)
-- print(controller_port) print(controller_port)
local server = socket.connect(controller_host, controller_port) local server = socket.connect(controller_host, controller_port)
debug_server = server debug_server = server
@ -2415,15 +2427,15 @@ local function start()
debug.sethook(debug_hook, "lrc") debug.sethook(debug_hook, "lrc")
end, end,
function(error) function(error)
-- print("error:", error) print("error:", error)
end end
) )
if (jit) then if (jit) then
if (LuaDebugger.debugLuaType ~= "jit") then if (LuaDebugger.debugLuaType ~= "jit") then
-- print("error======================================================") print("error======================================================")
local msg = "当前luajit版本为: " .. jit.version .. " 请使用LuaDebugjit 进行调试!" local msg = "当前luajit版本为: " .. jit.version .. " 请使用LuaDebugjit 进行调试!"
-- print(msg) print(msg)
end end
end end
_resume(coro_debugger, server) _resume(coro_debugger, server)
@ -2432,16 +2444,16 @@ local function start()
end end
function StartDebug(host, port) function StartDebug(host, port)
if (not host) then if (not host) then
-- print("error host nil") print("error host nil")
end end
if (not port) then if (not port) then
-- print("error prot nil") print("error prot nil")
end end
if (type(host) ~= "string") then if (type(host) ~= "string") then
-- print("error host not string") print("error host not string")
end end
if (type(port) ~= "number") then if (type(port) ~= "number") then
-- print("error host not number") print("error host not number")
end end
controller_host = host controller_host = host
controller_port = port controller_port = port
@ -2449,7 +2461,7 @@ function StartDebug(host, port)
start, start,
function(error) function(error)
-- body -- body
-- print(error) print(error)
end end
) )
return debugger_receiveDebugBreakInfo, debugger_xpcall return debugger_receiveDebugBreakInfo, debugger_xpcall
@ -2466,8 +2478,8 @@ ZZBase64.__code = {
'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/',
}; };
ZZBase64.__decode = {} ZZBase64.__decode = {}
for k, v in pairs(ZZBase64.__code) do for k,v in pairs(ZZBase64.__code) do
ZZBase64.__decode[string.byte(v, 1)] = k - 1 ZZBase64.__decode[string.byte(v,1)] = k - 1
end end
function ZZBase64.encode(text) function ZZBase64.encode(text)
@ -2477,14 +2489,14 @@ function ZZBase64.encode(text)
local res = {} local res = {}
local index = 1 local index = 1
for i = 1, len, 3 do for i = 1, len, 3 do
local a = string.byte(text, i) local a = string.byte(text, i )
local b = string.byte(text, i + 1) local b = string.byte(text, i + 1)
local c = string.byte(text, i + 2) local c = string.byte(text, i + 2)
-- num = a<<16 + b<<8 + c -- num = a<<16 + b<<8 + c
local num = a * 65536 + b * 256 + c local num = a * 65536 + b * 256 + c
for j = 1, 4 do for j = 1, 4 do
--tmp = num >> ((4 -j) * 6) --tmp = num >> ((4 -j) * 6)
local tmp = math.floor(num / (2 ^ ((4 - j) * 6))) local tmp = math.floor(num / (2 ^ ((4-j) * 6)))
--curPos = tmp&0x3f --curPos = tmp&0x3f
local curPos = tmp % 64 + 1 local curPos = tmp % 64 + 1
res[index] = ZZBase64.__code[curPos] res[index] = ZZBase64.__code[curPos]
@ -2521,13 +2533,13 @@ function ZZBase64.__left2(res, index, text, len)
res[index + 3] = "=" res[index + 3] = "="
end end
function ZZBase64.__left1(res, index, text, len) function ZZBase64.__left1(res, index,text, len)
local num = string.byte(text, len + 1) local num = string.byte(text, len + 1)
num = num * 16 num = num * 16
local tmp = math.floor(num / 64) local tmp = math.floor(num / 64)
local curPos = tmp % 64 + 1 local curPos = tmp % 64 + 1
res[index] = ZZBase64.__code[curPos] res[index ] = ZZBase64.__code[curPos]
curPos = num % 64 + 1 curPos = num % 64 + 1
res[index + 1] = ZZBase64.__code[curPos] res[index + 1] = ZZBase64.__code[curPos]
@ -2550,11 +2562,11 @@ function ZZBase64.decode(text)
local res = {} local res = {}
local index = 1 local index = 1
local decode = ZZBase64.__decode local decode = ZZBase64.__decode
for i = 1, len, 4 do for i =1, len, 4 do
local a = decode[string.byte(text, i)] local a = decode[string.byte(text,i )]
local b = decode[string.byte(text, i + 1)] local b = decode[string.byte(text,i + 1)]
local c = decode[string.byte(text, i + 2)] local c = decode[string.byte(text,i + 2)]
local d = decode[string.byte(text, i + 3)] local d = decode[string.byte(text,i + 3)]
--num = a<<18 + b<<12 + c<<6 + d --num = a<<18 + b<<12 + c<<6 + d
local num = a * 262144 + b * 4096 + c * 64 + d local num = a * 262144 + b * 4096 + c * 64 + d
@ -2563,7 +2575,7 @@ function ZZBase64.decode(text)
num = math.floor(num / 256) num = math.floor(num / 256)
local f = string.char(num % 256) local f = string.char(num % 256)
num = math.floor(num / 256) num = math.floor(num / 256)
res[index] = string.char(num % 256) res[index ] = string.char(num % 256)
res[index + 1] = f res[index + 1] = f
res[index + 2] = e res[index + 2] = e
index = index + 3 index = index + 3
@ -2599,4 +2611,7 @@ function ZZBase64.__decodeLeft2(res, index, text, len)
res[index] = string.char(num) res[index] = string.char(num)
end end
return StartDebug return StartDebug

View File

@ -1,7 +1,7 @@
local debugger_reLoadFile = nil local debugger_reLoadFile =nil
xpcall(function() xpcall(function()
debugger_reLoadFile = require("luaideReLoadFile") debugger_reLoadFile = require("luaideReLoadFile")
end, function() end,function()
debugger_reLoadFile = function() print("未实现代码重载") end debugger_reLoadFile = function() print("未实现代码重载") end
end) end)
local sethook = debug.sethook local sethook = debug.sethook
@ -13,9 +13,9 @@ local checkSetVar = nil
local loadstring_ = nil local loadstring_ = nil
local debugger_sendMsg = nil local debugger_sendMsg = nil
if (loadstring) then if (loadstring) then
loadstring_ = loadstring loadstring_ = loadstring
else else
loadstring_ = load loadstring_ = load
end end
local ZZBase64 = {} local ZZBase64 = {}
local LuaDebugTool_ = nil local LuaDebugTool_ = nil
@ -366,7 +366,6 @@ local function createJson()
function json.null() function json.null()
return json.null -- so json.null() will also return null ;-) return json.null -- so json.null() will also return null ;-)
end end
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
-- Internal, PRIVATE functions. -- Internal, PRIVATE functions.
-- Following a Python-like convention, I have prefixed all these 'PRIVATE' -- Following a Python-like convention, I have prefixed all these 'PRIVATE'
@ -424,8 +423,8 @@ local function createJson()
-- @return object, int The object (true, false or nil) and the position at which the next character should be -- @return object, int The object (true, false or nil) and the position at which the next character should be
-- scanned. -- scanned.
function decode_scanConstant(s, startPos) function decode_scanConstant(s, startPos)
local consts = { ["true"] = true, ["false"] = false, ["null"] = nil } local consts = {["true"] = true, ["false"] = false, ["null"] = nil}
local constNames = { "true", "false", "null" } local constNames = {"true", "false", "null"}
for i, k in pairs(constNames) do for i, k in pairs(constNames) do
if string.sub(s, startPos, startPos + string.len(k) - 1) == k then if string.sub(s, startPos, startPos + string.len(k) - 1) == k then
@ -695,7 +694,7 @@ local LuaDebugger = {
runLineCount = 0, runLineCount = 0,
--分割字符串缓存 --分割字符串缓存
splitFilePaths = {}, splitFilePaths = {},
version = "0.9.3", version="0.9.3",
serVarLevel = 4 serVarLevel = 4
} }
local debug_hook = nil local debug_hook = nil
@ -748,17 +747,17 @@ function print(...)
end end
if (LuaDebugger.isProntToConsole == 1 or LuaDebugger.isProntToConsole == 2) then if (LuaDebugger.isProntToConsole == 1 or LuaDebugger.isProntToConsole == 2) then
if (debug_server) then if (debug_server) then
local arg = { ... } --这里的...和{}符号中间需要有空格号,否则会出错 local arg = {...} --这里的...和{}符号中间需要有空格号,否则会出错
local str = "" local str = ""
if (#arg == 0) then if (#arg == 0) then
arg = { "nil" } arg = {"nil"}
end end
for k, v in pairs(arg) do for k, v in pairs(arg) do
str = str .. tostring(v) .. "\t" str = str .. tostring(v) .. "\t"
end end
local sendMsg = { local sendMsg = {
event = LuaDebugger.event.C2S_LuaPrint, event = LuaDebugger.event.C2S_LuaPrint,
data = { msg = ZZBase64.encode(str), type = 1 } data = {msg = ZZBase64.encode(str), type = 1}
} }
local sendStr = json.encode(sendMsg) local sendStr = json.encode(sendMsg)
debug_server:send(sendStr .. "__debugger_k0204__") debug_server:send(sendStr .. "__debugger_k0204__")
@ -772,48 +771,46 @@ function luaIdePrintWarn(...)
end end
if (LuaDebugger.isProntToConsole == 1 or LuaDebugger.isProntToConsole == 2) then if (LuaDebugger.isProntToConsole == 1 or LuaDebugger.isProntToConsole == 2) then
if (debug_server) then if (debug_server) then
local arg = { ... } --这里的...和{}符号中间需要有空格号,否则会出错 local arg = {...} --这里的...和{}符号中间需要有空格号,否则会出错
local str = "" local str = ""
if (#arg == 0) then if (#arg == 0) then
arg = { "nil" } arg = {"nil"}
end end
for k, v in pairs(arg) do for k, v in pairs(arg) do
str = str .. tostring(v) .. "\t" str = str .. tostring(v) .. "\t"
end end
local sendMsg = { local sendMsg = {
event = LuaDebugger.event.C2S_LuaPrint, event = LuaDebugger.event.C2S_LuaPrint,
data = { msg = ZZBase64.encode(str), type = 2 } data = {msg = ZZBase64.encode(str), type = 2}
} }
local sendStr = json.encode(sendMsg) local sendStr = json.encode(sendMsg)
debug_server:send(sendStr .. "__debugger_k0204__") debug_server:send(sendStr .. "__debugger_k0204__")
end end
end end
end end
function luaIdePrintErr(...) function luaIdePrintErr(...)
if (LuaDebugger.isProntToConsole == 1 or LuaDebugger.isProntToConsole == 3) then if (LuaDebugger.isProntToConsole == 1 or LuaDebugger.isProntToConsole == 3) then
debugger_print(...) debugger_print(...)
end end
if (LuaDebugger.isProntToConsole == 1 or LuaDebugger.isProntToConsole == 2) then if (LuaDebugger.isProntToConsole == 1 or LuaDebugger.isProntToConsole == 2) then
if (debug_server) then if (debug_server) then
local arg = { ... } --这里的...和{}符号中间需要有空格号,否则会出错 local arg = {...} --这里的...和{}符号中间需要有空格号,否则会出错
local str = "" local str = ""
if (#arg == 0) then if (#arg == 0) then
arg = { "nil" } arg = {"nil"}
end end
for k, v in pairs(arg) do for k, v in pairs(arg) do
str = str .. tostring(v) .. "\t" str = str .. tostring(v) .. "\t"
end end
local sendMsg = { local sendMsg = {
event = LuaDebugger.event.C2S_LuaPrint, event = LuaDebugger.event.C2S_LuaPrint,
data = { msg = ZZBase64.encode(str), type = 3 } data = {msg = ZZBase64.encode(str), type = 3}
} }
local sendStr = json.encode(sendMsg) local sendStr = json.encode(sendMsg)
debug_server:send(sendStr .. "__debugger_k0204__") debug_server:send(sendStr .. "__debugger_k0204__")
end end
end end
end end
--@endregion --@endregion
--@region 辅助方法 --@region 辅助方法
@ -951,7 +948,7 @@ local function debugger_dump(value, desciption, nesting)
return tostring(v) return tostring(v)
end end
local traceback = debugger_strSplit(debug.traceback("", 2), "\n") local traceback = debugger_strSplit(debug.traceback("", 2), "\n")
-- print("dump from: " .. debugger_strTrim(traceback[3])) print("dump from: " .. debugger_strTrim(traceback[3]))
local function _dump(value, desciption, indent, nest, keylen) local function _dump(value, desciption, indent, nest, keylen)
desciption = desciption or "<var>" desciption = desciption or "<var>"
local spc = "" local spc = ""
@ -1000,7 +997,7 @@ local function debugger_dump(value, desciption, nesting)
end end
_dump(value, desciption, "- ", 1) _dump(value, desciption, "- ", 1)
for i, line in ipairs(result) do for i, line in ipairs(result) do
-- print(line) print(line)
end end
end end
--@endregion --@endregion
@ -1008,24 +1005,27 @@ local function debugger_valueToString(v)
local vtype = type(v) local vtype = type(v)
local vstr = nil local vstr = nil
if (vtype == "userdata") then if (vtype == "userdata") then
if (LuaDebugger.isFoxGloryProject) then if (LuaDebugger.isFoxGloryProject ) then
return "userdata", vtype
return "userdata",vtype
else else
return tostring(v), vtype return tostring(v), vtype
end end
elseif (vtype == "table" or vtype == "function" or vtype == "boolean") then elseif (vtype == "table" or vtype == "function" or vtype == "boolean") then
local value = vtype local value = vtype
xpcall(function() xpcall(function()
if (LuaDebugger.isFoxGloryProject) then if(LuaDebugger.isFoxGloryProject) then
value = vtype value = vtype
else else
value = tostring(v) value = tostring(v)
end end
end, function()
end,function()
value = vtype value = vtype
end) end)
return value, vtype return value, vtype
elseif (vtype == "number" or vtype == "string") then elseif (vtype == "number" or vtype == "string" ) then
return v, vtype return v, vtype
else else
return tostring(v), vtype return tostring(v), vtype
@ -1033,12 +1033,12 @@ local function debugger_valueToString(v)
end end
local function debugger_setVarInfo(name, value) local function debugger_setVarInfo(name, value)
local valueStr, valueType = debugger_valueToString(value) local valueStr, valueType = debugger_valueToString(value)
local nameStr, nameType = debugger_valueToString(name) local nameStr,nameType = debugger_valueToString(name)
if (valueStr == nil) then if(valueStr == nil) then
valueStr = valueType valueStr = valueType
end end
local valueInfo = { local valueInfo = {
name = nameStr, name =nameStr,
valueType = valueType, valueType = valueType,
valueStr = ZZBase64.encode(valueStr) valueStr = ZZBase64.encode(valueStr)
} }
@ -1076,7 +1076,7 @@ local function debugger_getvalue(f)
i = i + 1 i = i + 1
end end
return { locals = locals, ups = ups } return {locals = locals, ups = ups}
end end
--获取堆栈 --获取堆栈
debugger_stackInfo = debugger_stackInfo =
@ -1122,7 +1122,7 @@ debugger_stackInfo =
end end
end end
local stackInfo = { stack = stack, vars = varInfos, funcs = funcs } local stackInfo = {stack = stack, vars = varInfos, funcs = funcs}
local data = { local data = {
stack = stackInfo.stack, stack = stackInfo.stack,
vars = stackInfo.vars, vars = stackInfo.vars,
@ -1133,23 +1133,23 @@ debugger_stackInfo =
} }
return data return data
end end
--==============================工具方法 end====================================================== --==============================工具方法 end======================================================
--===========================点断信息================================================== --===========================点断信息==================================================
--根据不同的游戏引擎进行定时获取断点信息 --根据不同的游戏引擎进行定时获取断点信息
--CCDirector:sharedDirector():getScheduler() --CCDirector:sharedDirector():getScheduler()
local debugger_setBreak = nil local debugger_setBreak = nil
local function debugger_receiveDebugBreakInfo() local function debugger_receiveDebugBreakInfo()
if (not jit) then if(not jit) then
if (_VERSION) then if(_VERSION)then
-- print("当前lua版本为: ".._VERSION.." 请使用 -----LuaDebug.lua----- 进行调试!") print("当前lua版本为: ".._VERSION.." 请使用 -----LuaDebug.lua----- 进行调试!")
else else
-- print("当前为lua版本,请使用-----LuaDebug.lua-----进行调试!") print("当前为lua版本,请使用-----LuaDebug.lua-----进行调试!")
end end
end end
if (breakInfoSocket) then if (breakInfoSocket) then
local msg, status = breakInfoSocket:receive() local msg, status = breakInfoSocket:receive()
if (LuaDebugger.isLaunch == true and status == "closed") then if(LuaDebugger.isLaunch == true and status == "closed") then
os.exit() os.exit()
end end
if (msg) then if (msg) then
@ -1159,7 +1159,7 @@ local function debugger_receiveDebugBreakInfo()
elseif netData.event == LuaDebugger.event.S2C_LoadLuaScript then elseif netData.event == LuaDebugger.event.S2C_LoadLuaScript then
LuaDebugger.loadScriptBody = netData.data LuaDebugger.loadScriptBody = netData.data
debugger_exeLuaString() debugger_exeLuaString()
debugger_sendMsg(breakInfoSocket, LuaDebugger.event.C2S_LoadLuaScript, LuaDebugger.loadScriptBody) debugger_sendMsg(breakInfoSocket,LuaDebugger.event.C2S_LoadLuaScript,LuaDebugger.loadScriptBody)
elseif netData.event == LuaDebugger.event.S2C_ReLoadFile then elseif netData.event == LuaDebugger.event.S2C_ReLoadFile then
LuaDebugger.reLoadFileBody = netData.data LuaDebugger.reLoadFileBody = netData.data
LuaDebugger.isReLoadFile = false LuaDebugger.isReLoadFile = false
@ -1267,7 +1267,7 @@ debugger_setBreak =
end end
LuaDebugger.isHook = false LuaDebugger.isHook = false
end end
end end
local function debugger_checkFileIsBreak(fileName) local function debugger_checkFileIsBreak(fileName)
return LuaDebugger.breakInfos[fileName] return LuaDebugger.breakInfos[fileName]
end end
@ -1299,7 +1299,7 @@ function debugger_conditionStr(condition, vars, callBack)
currentTabble[k] = v currentTabble[k] = v
end end
end end
setmetatable(currentTabble, { __index = _G }) setmetatable(currentTabble, {__index = _G})
local fun = loadstring("return " .. condition) local fun = loadstring("return " .. condition)
setfenv(fun, currentTabble) setfenv(fun, currentTabble)
return fun() return fun()
@ -1309,20 +1309,21 @@ function debugger_conditionStr(condition, vars, callBack)
xpcall( xpcall(
loadScript, loadScript,
function(error) function(error)
-- print(error) print(error)
end end
) )
if (status and msg) then if (status and msg) then
callBack() callBack()
end end
end end
--执行lua字符串 --执行lua字符串
debugger_exeLuaString = function() debugger_exeLuaString = function()
local function loadScript() local function loadScript()
local script = LuaDebugger.loadScriptBody.script local script = LuaDebugger.loadScriptBody.script
if (LuaDebugger.loadScriptBody.isBreak) then if (LuaDebugger.loadScriptBody.isBreak) then
local currentTabble = { _G = _G } local currentTabble = {_G = _G}
local frameId = LuaDebugger.loadScriptBody.frameId local frameId = LuaDebugger.loadScriptBody.frameId
frameId = frameId frameId = frameId
local func = LuaDebugger.currentDebuggerData.funcs[frameId] local func = LuaDebugger.currentDebuggerData.funcs[frameId]
@ -1335,7 +1336,7 @@ debugger_exeLuaString = function()
for k, v in pairs(locals) do for k, v in pairs(locals) do
currentTabble[k] = v currentTabble[k] = v
end end
setmetatable(currentTabble, { __index = _G }) setmetatable(currentTabble, {__index = _G})
local fun = loadstring(script) local fun = loadstring(script)
setfenv(fun, currentTabble) setfenv(fun, currentTabble)
@ -1350,47 +1351,50 @@ debugger_exeLuaString = function()
xpcall( xpcall(
loadScript, loadScript,
function(error) function(error)
-- debugger_sendMsg(debug_server, LuaDebugger.event.C2S_LoadLuaScript, LuaDebugger.loadScriptBody) -- debugger_sendMsg(debug_server, LuaDebugger.event.C2S_LoadLuaScript, LuaDebugger.loadScriptBody)
end end
) )
LuaDebugger.loadScriptBody.script = nil LuaDebugger.loadScriptBody.script = nil
if (LuaDebugger.loadScriptBody.isBreak) then if (LuaDebugger.loadScriptBody.isBreak) then
LuaDebugger.serVarLevel = LuaDebugger.serVarLevel + 1 LuaDebugger.serVarLevel = LuaDebugger.serVarLevel+1
LuaDebugger.currentDebuggerData = debugger_stackInfo(LuaDebugger.serVarLevel, LuaDebugger.event LuaDebugger.currentDebuggerData = debugger_stackInfo(LuaDebugger.serVarLevel, LuaDebugger.event.C2S_HITBreakPoint)
.C2S_HITBreakPoint)
LuaDebugger.loadScriptBody.stack = LuaDebugger.currentDebuggerData.stack LuaDebugger.loadScriptBody.stack = LuaDebugger.currentDebuggerData.stack
end end
LuaDebugger.loadScriptBody.complete = true LuaDebugger.loadScriptBody.complete = true
end end
--@region 调试中修改变量值 --@region 调试中修改变量值
--根据key 值在 value 查找 --根据key 值在 value 查找
local function debugger_getTablekey(key, keyType, value) local function debugger_getTablekey(key,keyType,value)
if (keyType == -1) then if(keyType == -1) then
return key return key
elseif (keyType == 1) then elseif(keyType == 1) then
return tonumber(key) return tonumber(key)
elseif (keyType == 2) then elseif(keyType == 2) then
local valueKey = nil local valueKey = nil
for k, v in pairs(value) do for k,v in pairs(value) do
local nameType = type(k) local nameType = type(k)
if (nameType == "userdata" or nameType == "table") then if(nameType == "userdata" or nameType == "table") then
if (not LuaDebugger.isFoxGloryProject) then if (not LuaDebugger.isFoxGloryProject) then
valueKey = tostring(k) valueKey = tostring(k)
if (key == valueKey) then if(key == valueKey) then
return k return k
end end
break break
end end
end end
end end
end end
end end
local function debugger_setVarValue(server, data) local function debugger_setVarValue(server, data)
local newValue = nil local newValue = nil
local level = LuaDebugger.serVarLevel + LuaDebugger.setVarBody.frameId local level = LuaDebugger.serVarLevel+LuaDebugger.setVarBody.frameId
local firstKeyName = data.keys[1] local firstKeyName = data.keys[1]
--@region vars check --@region vars check
local localValueChangeIndex = -1 local localValueChangeIndex = -1
@ -1405,7 +1409,7 @@ local function debugger_setVarValue(server, data)
if not name then if not name then
break break
end end
if (firstKeyName == name) then if(firstKeyName == name) then
localValueChangeIndex = i localValueChangeIndex = i
oldValue = value oldValue = value
end end
@ -1423,7 +1427,7 @@ local function debugger_setVarValue(server, data)
if not name then if not name then
break break
end end
if (localValueChangeIndex == -1 and firstKeyName == name) then if(localValueChangeIndex == -1 and firstKeyName == name) then
upValueFun = func upValueFun = func
oldValue = value oldValue = value
upValueChangeIndex = i upValueChangeIndex = i
@ -1435,8 +1439,8 @@ local function debugger_setVarValue(server, data)
end end
i = i + 1 i = i + 1
end end
--@endregion --@endregion
local vars = { locals = locals, ups = ups } local vars = {locals = locals, ups = ups}
local function loadScript() local function loadScript()
local currentTabble = {} local currentTabble = {}
@ -1453,7 +1457,7 @@ local function debugger_setVarValue(server, data)
currentTabble[k] = v currentTabble[k] = v
end end
end end
setmetatable(currentTabble, { __index = _G }) setmetatable(currentTabble, {__index = _G})
local fun = loadstring("return " .. data.value) local fun = loadstring("return " .. data.value)
setfenv(fun, currentTabble) setfenv(fun, currentTabble)
newValue = fun() newValue = fun()
@ -1463,7 +1467,7 @@ local function debugger_setVarValue(server, data)
xpcall( xpcall(
loadScript, loadScript,
function(error) function(error)
-- print(error, "============================") print(error, "============================")
end end
) )
@ -1472,37 +1476,39 @@ local function debugger_setVarValue(server, data)
-- local 查找并替换 -- local 查找并替换
local keyLength = #data.keys local keyLength = #data.keys
if (keyLength == 1) then if(keyLength == 1) then
if (localValueChangeIndex ~= -1) then if(localValueChangeIndex ~= -1) then
debug.setlocal(level, localValueChangeIndex, newValue) debug.setlocal(level, localValueChangeIndex, newValue)
elseif (upValueFun ~= nil) then elseif(upValueFun ~= nil) then
debug.setupvalue(upValueFun, upValueChangeIndex, newValue) debug.setupvalue( upValueFun, upValueChangeIndex, newValue )
else else
--全局变量查找 --全局变量查找
if (_G[firstKeyName]) then if(_G[firstKeyName]) then
_G[firstKeyName] = newValue _G[firstKeyName] = newValue
end end
end end
else else
if (not oldValue) then if(not oldValue) then
if (_G[firstKeyName]) then if(_G[firstKeyName]) then
oldValue = _G[firstKeyName] oldValue = _G[firstKeyName]
end end
end end
local tempValue = oldValue local tempValue = oldValue
for i = 2, keyLength - 1 do for i=2,keyLength-1 do
if (tempValue) then if(tempValue) then
oldValue = oldValue[debugger_getTablekey(data.keys[i], data.numberTypes[i], oldValue)] oldValue = oldValue[debugger_getTablekey(data.keys[i],data.numberTypes[i],oldValue)]
end end
end end
if (tempValue) then if(tempValue) then
oldValue[debugger_getTablekey(data.keys[keyLength], data.numberTypes[keyLength], oldValue)] = newValue oldValue[debugger_getTablekey(data.keys[keyLength],data.numberTypes[keyLength],oldValue)] = newValue
end end
end end
local varInfo = debugger_setVarInfo(data.varName, newValue) local varInfo = debugger_setVarInfo(data.varName, newValue)
data.varInfo = varInfo data.varInfo = varInfo
LuaDebugger.serVarLevel = LuaDebugger.serVarLevel + 1 LuaDebugger.serVarLevel = LuaDebugger.serVarLevel+1
LuaDebugger.currentDebuggerData = debugger_stackInfo(LuaDebugger.serVarLevel, LuaDebugger.event.C2S_HITBreakPoint) LuaDebugger.currentDebuggerData = debugger_stackInfo(LuaDebugger.serVarLevel, LuaDebugger.event.C2S_HITBreakPoint)
end end
--@endregion --@endregion
@ -1514,41 +1520,41 @@ checkSetVar =
function() function()
if (LuaDebugger.isSetVar) then if (LuaDebugger.isSetVar) then
LuaDebugger.isSetVar = false LuaDebugger.isSetVar = false
debugger_setVarValue(debug_server, LuaDebugger.setVarBody) debugger_setVarValue(debug_server,LuaDebugger.setVarBody)
LuaDebugger.serVarLevel = LuaDebugger.serVarLevel + 1 LuaDebugger.serVarLevel = LuaDebugger.serVarLevel+1
_resume(coro_debugger, LuaDebugger.setVarBody) _resume(coro_debugger, LuaDebugger.setVarBody)
xpcall( xpcall(
checkSetVar, checkSetVar,
function(error) function(error)
-- print("设置变量", error) print("设置变量", error)
end end
) )
elseif (LuaDebugger.isLoadLuaScript) then elseif(LuaDebugger.isLoadLuaScript) then
LuaDebugger.isLoadLuaScript = false LuaDebugger.isLoadLuaScript = false
debugger_exeLuaString() debugger_exeLuaString()
LuaDebugger.serVarLevel = LuaDebugger.serVarLevel + 1 LuaDebugger.serVarLevel = LuaDebugger.serVarLevel+1
_resume(coro_debugger, LuaDebugger.reLoadFileBody) _resume(coro_debugger, LuaDebugger.reLoadFileBody)
xpcall( xpcall(
checkSetVar, checkSetVar,
function(error) function(error)
-- print("执行代码", error) print("执行代码", error)
end end
) )
elseif (LuaDebugger.isReLoadFile) then elseif(LuaDebugger.isReLoadFile) then
LuaDebugger.isReLoadFile = false LuaDebugger.isReLoadFile = false
LuaDebugger.reLoadFileBody.isReLoad = debugger_reLoadFile(LuaDebugger.reLoadFileBody) LuaDebugger.reLoadFileBody.isReLoad = debugger_reLoadFile(LuaDebugger.reLoadFileBody)
-- print("重载结果:",LuaDebugger.reLoadFileBody.isReLoad) print("重载结果:",LuaDebugger.reLoadFileBody.isReLoad)
LuaDebugger.reLoadFileBody.script = nil LuaDebugger.reLoadFileBody.script = nil
LuaDebugger.serVarLevel = LuaDebugger.serVarLevel + 1 LuaDebugger.serVarLevel = LuaDebugger.serVarLevel+1
_resume(coro_debugger, LuaDebugger.reLoadFileBody) _resume(coro_debugger, LuaDebugger.reLoadFileBody)
xpcall( xpcall(
checkSetVar, checkSetVar,
function(error) function(error)
-- print("重新加载文件", error) print("重新加载文件", error)
end end
) )
end end
end end
@ -1598,7 +1604,7 @@ local function debugger_getValueByScript(value, script)
val = fun() val = fun()
end, end,
function(error) function(error)
-- print(error, "====>") print(error, "====>")
val = nil val = nil
end end
) )
@ -1739,6 +1745,7 @@ end
return return
]] ]]
local function debugger_getmetatable(value, metatable, vinfos, server, variablesReference, debugSpeedIndex, metatables) local function debugger_getmetatable(value, metatable, vinfos, server, variablesReference, debugSpeedIndex, metatables)
for i, mtable in ipairs(metatables) do for i, mtable in ipairs(metatables) do
if (metatable == mtable) then if (metatable == mtable) then
return vinfos return vinfos
@ -1794,6 +1801,7 @@ local function debugger_getmetatable(value, metatable, vinfos, server, variables
else else
return vinfos return vinfos
end end
end end
local function debugger_sendTableField(luatable, vinfos, server, variablesReference, debugSpeedIndex, valueType) local function debugger_sendTableField(luatable, vinfos, server, variablesReference, debugSpeedIndex, valueType)
if (valueType == "userdata") then if (valueType == "userdata") then
@ -1866,6 +1874,7 @@ local function debugger_sendTableValues(value, server, variablesReference, debug
vinfos = {} vinfos = {}
end end
end end
end end
else else
m = getmetatable(value) m = getmetatable(value)
@ -1915,10 +1924,11 @@ local function debugger_getBreakVar(body, server)
if (value) then if (value) then
local valueType = type(value) local valueType = type(value)
if (valueType == "table" or valueType == "userdata") then if (valueType == "table" or valueType == "userdata") then
debugger_sendTableValues(value, server, variablesReference, debugSpeedIndex) debugger_sendTableValues(value, server, variablesReference, debugSpeedIndex)
else else
if (valueType == "function") then if (valueType == "function") then
if (LuaDebugger.isFoxGloryProject) then if(LuaDebugger.isFoxGloryProject) then
value = "function" value = "function"
else else
value = tostring(value) value = tostring(value)
@ -1953,9 +1963,9 @@ local function debugger_getBreakVar(body, server)
xpcall( xpcall(
exe, exe,
function(error) function(error)
-- -- print("获取变量错误 错误消息-----------------") -- print("获取变量错误 错误消息-----------------")
-- -- print(error) -- print(error)
-- -- print(debug.traceback("", 2)) -- print(debug.traceback("", 2))
debugger_sendMsg( debugger_sendMsg(
server, server,
LuaDebugger.event.C2S_ReqVar, LuaDebugger.event.C2S_ReqVar,
@ -1981,6 +1991,7 @@ local function ResetDebugInfo()
LuaDebugger.StepIn = false LuaDebugger.StepIn = false
LuaDebugger.StepNext = false LuaDebugger.StepNext = false
LuaDebugger.StepOut = false LuaDebugger.StepOut = false
end end
local function debugger_loop(server) local function debugger_loop(server)
server = debug_server server = debug_server
@ -1991,7 +2002,7 @@ local function debugger_loop(server)
while true do while true do
local line, status = server:receive() local line, status = server:receive()
if (status == "closed") then if (status == "closed") then
if (LuaDebugger.isLaunch) then if(LuaDebugger.isLaunch) then
os.exit() os.exit()
else else
debug.sethook() debug.sethook()
@ -2003,12 +2014,13 @@ local function debugger_loop(server)
local event = netData.event local event = netData.event
local body = netData.data local body = netData.data
if (event == LuaDebugger.event.S2C_DebugClose) then if (event == LuaDebugger.event.S2C_DebugClose) then
if (LuaDebugger.isLaunch) then if(LuaDebugger.isLaunch) then
os.exit() os.exit()
else else
debug.sethook() debug.sethook()
coroutine.yield() coroutine.yield()
end end
elseif event == LuaDebugger.event.S2C_SetBreakPoints then elseif event == LuaDebugger.event.S2C_SetBreakPoints then
--设置断点信息 --设置断点信息
local function setB() local function setB()
@ -2017,7 +2029,7 @@ local function debugger_loop(server)
xpcall( xpcall(
setB, setB,
function(error) function(error)
-- print(error) print(error)
end end
) )
elseif event == LuaDebugger.event.S2C_RUN then --开始运行 elseif event == LuaDebugger.event.S2C_RUN then --开始运行
@ -2029,7 +2041,7 @@ local function debugger_loop(server)
LuaDebugger.currentDebuggerData = nil LuaDebugger.currentDebuggerData = nil
LuaDebugger.Run = true LuaDebugger.Run = true
LuaDebugger.tempRunFlag = true LuaDebugger.tempRunFlag = true
LuaDebugger.currentLine = nil LuaDebugger.currentLine= nil
local data = coroutine.yield() local data = coroutine.yield()
LuaDebugger.serVarLevel = 4 LuaDebugger.serVarLevel = 4
LuaDebugger.currentDebuggerData = data LuaDebugger.currentDebuggerData = data
@ -2130,37 +2142,42 @@ local function debugger_loop(server)
end end
coro_debugger = coroutine.create(debugger_loop) coro_debugger = coroutine.create(debugger_loop)
debug_hook = function(event, line) debug_hook = function(event, line)
if (not LuaDebugger.isHook) then
if(not LuaDebugger.isHook) then
return return
end end
if (LuaDebugger.Run) then if(LuaDebugger.Run) then
if (event == "line") then if(event == "line") then
local isCheck = false local isCheck = false
for k, breakInfo in pairs(LuaDebugger.breakInfos) do for k, breakInfo in pairs(LuaDebugger.breakInfos) do
for bk, linesInfo in pairs(breakInfo) do for bk, linesInfo in pairs(breakInfo) do
if (linesInfo.lines and linesInfo.lines[line]) then
if(linesInfo.lines and linesInfo.lines[line]) then
isCheck = true isCheck = true
break break
end end
end end
if (isCheck) then if(isCheck) then
break break
end end
end end
if (not isCheck) then if(not isCheck) then
return return
end end
end end
end end
local file = nil local file = nil
if (event == "line") then if(event == "line") then
local funs = nil local funs = nil
local funlength = 0 local funlength =0
if (LuaDebugger.currentDebuggerData) then if(LuaDebugger.currentDebuggerData) then
funs = LuaDebugger.currentDebuggerData.funcs funs = LuaDebugger.currentDebuggerData.funcs
funlength = #funs funlength = #funs
end end
@ -2168,44 +2185,47 @@ debug_hook = function(event, line)
local tempFunc = stepInfo.func local tempFunc = stepInfo.func
local source = stepInfo.source local source = stepInfo.source
file = getSource(source); file = getSource(source);
if (source == "=[C]" or source:find(LuaDebugger.DebugLuaFie)) then return end if(source == "=[C]" or source:find(LuaDebugger.DebugLuaFie)) then return end
if (funlength > 0 and funs[1] == tempFunc and LuaDebugger.currentLine ~= line) then if(funlength > 0 and funs[1] == tempFunc and LuaDebugger.currentLine ~= line) then
LuaDebugger.runLineCount = LuaDebugger.runLineCount + 1 LuaDebugger.runLineCount = LuaDebugger.runLineCount+1
end end
local breakInfo = LuaDebugger.breakInfos[file] local breakInfo = LuaDebugger.breakInfos[file]
local breakData = nil local breakData = nil
local ischeck = false local ischeck = false
if (breakInfo) then if(breakInfo) then
for k, lineInfo in pairs(breakInfo) do for k, lineInfo in pairs(breakInfo) do
local lines = lineInfo.lines local lines = lineInfo.lines
if (lines and lines[line]) then if(lines and lines[line]) then
ischeck = true ischeck = true
break break
end end
end end
end end
local isHit = false local isHit = false
if (ischeck) then if(ischeck) then
--并且在断点中 --并且在断点中
local info = stepInfo local info = stepInfo
local source = string.lower(info.source) local source = string.lower( info.source )
local fullName, dir, fileName = debugger_getFilePathInfo(source) local fullName,dir,fileName = debugger_getFilePathInfo(source)
local hitPathNames = splitFilePath(fullName) local hitPathNames = splitFilePath(fullName)
local hitCounts = {} local hitCounts = {}
local debugHitCounts = nil local debugHitCounts = nil
for k, lineInfo in pairs(breakInfo) do for k, lineInfo in pairs(breakInfo) do
local lines = lineInfo.lines local lines = lineInfo.lines
local pathNames = lineInfo.pathNames local pathNames = lineInfo.pathNames
debugHitCounts = lineInfo.hitCounts debugHitCounts = lineInfo.hitCounts
if (lines and lines[line]) then if(lines and lines[line]) then
breakData = lines[line] breakData = lines[line]
--判断路径 --判断路径
hitCounts[k] = 0 hitCounts[k] = 0
local hitPathNamesCount = #hitPathNames local hitPathNamesCount = #hitPathNames
local pathNamesCount = #pathNames local pathNamesCount = #pathNames
local checkCount = 0; local checkCount = 0;
while (true) do while(true) do
if (pathNames[pathNamesCount] ~= hitPathNames[hitPathNamesCount]) then if (pathNames[pathNamesCount] ~= hitPathNames[hitPathNamesCount]) then
break break
else else
@ -2213,55 +2233,57 @@ debug_hook = function(event, line)
end end
pathNamesCount = pathNamesCount - 1 pathNamesCount = pathNamesCount - 1
hitPathNamesCount = hitPathNamesCount - 1 hitPathNamesCount = hitPathNamesCount - 1
checkCount = checkCount + 1 checkCount = checkCount+1
if (pathNamesCount <= 0 or hitPathNamesCount <= 0) then if(pathNamesCount <= 0 or hitPathNamesCount <= 0) then
break break
end end
end end
if (checkCount > 0) then if(checkCount>0) then
break; break;
end end
else else
breakData = nil breakData = nil
end end
end end
if (breakData) then if(breakData) then
local hitFieName = "" local hitFieName = ""
local maxCount = 0 local maxCount = 0
for k, v in pairs(hitCounts) do for k, v in pairs(hitCounts) do
if (v > maxCount) then if(v > maxCount) then
maxCount = v maxCount = v
hitFieName = k; hitFieName = k;
end end
end end
local hitPathNamesLength = #hitPathNames local hitPathNamesLength = #hitPathNames
if (hitPathNamesLength == 1 or (hitPathNamesLength > 1 and maxCount > 1)) then if (hitPathNamesLength == 1 or (hitPathNamesLength > 1 and maxCount > 1)) then
if (hitFieName ~= "") then if(hitFieName ~= "") then
local hitCount = breakData.hitCondition local hitCount = breakData.hitCondition
local clientHitCount = debugHitCounts[breakData.line] local clientHitCount = debugHitCounts[breakData.line]
clientHitCount = clientHitCount + 1 clientHitCount = clientHitCount + 1
debugHitCounts[breakData.line] = clientHitCount debugHitCounts[breakData.line] = clientHitCount
if (funs and funs[1] == tempFunc and LuaDebugger.runLineCount == 0) then if(funs and funs[1] == tempFunc and LuaDebugger.runLineCount == 0) then
LuaDebugger.runLineCount = 0 LuaDebugger.runLineCount = 0
elseif (LuaDebugger.tempRunFlag and LuaDebugger.currentLine == line) then elseif(LuaDebugger.tempRunFlag and LuaDebugger.currentLine == line) then
LuaDebugger.runLineCount = 0 LuaDebugger.runLineCount = 0
LuaDebugger.tempRunFlag = nil LuaDebugger.tempRunFlag = nil
elseif (clientHitCount >= hitCount) then elseif(clientHitCount >= hitCount) then
isHit = true isHit = true
end end
end end
end end
end end
end end
if (LuaDebugger.StepOut) then if(LuaDebugger.StepOut) then
if (funlength == 1) then if(funlength == 1) then
ResetDebugInfo(); ResetDebugInfo();
LuaDebugger.Run = true LuaDebugger.Run = true
return return
else else
if (funs[2] == tempFunc) then if(funs[2] == tempFunc) then
local data = debugger_stackInfo(3, LuaDebugger.event.C2S_StepInResponse) local data = debugger_stackInfo(3, LuaDebugger.event.C2S_StepInResponse)
-- -- print("StepIn 挂起") -- print("StepIn 挂起")
--挂起等待调试器作出反应 --挂起等待调试器作出反应
_resume(coro_debugger, data) _resume(coro_debugger, data)
checkSetVar() checkSetVar()
@ -2270,34 +2292,35 @@ debug_hook = function(event, line)
end end
end end
if (LuaDebugger.StepIn) then if(LuaDebugger.StepIn) then
if (funs[1] == tempFunc and LuaDebugger.runLineCount == 0) then if(funs[1] == tempFunc and LuaDebugger.runLineCount == 0) then
return return
end end
local data = debugger_stackInfo(3, LuaDebugger.event.C2S_StepInResponse) local data = debugger_stackInfo(3, LuaDebugger.event.C2S_StepInResponse)
-- -- print("StepIn 挂起") -- print("StepIn 挂起")
--挂起等待调试器作出反应 --挂起等待调试器作出反应
_resume(coro_debugger, data) _resume(coro_debugger, data)
checkSetVar() checkSetVar()
return return
end end
if (LuaDebugger.StepNext) then if(LuaDebugger.StepNext ) then
local isNext = false local isNext = false
if (funs) then if(funs) then
for i, f in ipairs(funs) do for i,f in ipairs(funs) do
if (tempFunc == f) then if(tempFunc == f) then
if (LuaDebugger.currentLine == line) then if(LuaDebugger.currentLine == line) then
return return
end end
isNext = true isNext =true
break; break;
end end
end end
else else
isNext = true
isNext =true
end end
if (isNext) then if(isNext) then
local data = debugger_stackInfo(3, LuaDebugger.event.C2S_NextResponse) local data = debugger_stackInfo(3, LuaDebugger.event.C2S_NextResponse)
LuaDebugger.runLineCount = 0 LuaDebugger.runLineCount = 0
LuaDebugger.currentLine = line LuaDebugger.currentLine = line
@ -2312,15 +2335,17 @@ debug_hook = function(event, line)
--断点判断 --断点判断
if (isHit) then if(isHit) then
LuaDebugger.runLineCount = 0 LuaDebugger.runLineCount = 0
LuaDebugger.currentLine = line LuaDebugger.currentLine = line
sevent = LuaDebugger.event.C2S_HITBreakPoint sevent = LuaDebugger.event.C2S_HITBreakPoint
--调用 coro_debugger 并传入 参数 --调用 coro_debugger 并传入 参数
local data = debugger_stackInfo(3, sevent) local data = debugger_stackInfo(3, sevent)
--挂起等待调试器作出反应 --挂起等待调试器作出反应
if (breakData and breakData.condition) then if(breakData and breakData.condition) then
debugger_conditionStr(breakData.condition, data.vars, function() debugger_conditionStr(breakData.condition,data.vars,function()
_resume(coro_debugger, data) _resume(coro_debugger, data)
checkSetVar() checkSetVar()
end) end)
@ -2337,7 +2362,7 @@ end
local function debugger_xpcall() local function debugger_xpcall()
--调用 coro_debugger 并传入 参数 --调用 coro_debugger 并传入 参数
local data = debugger_stackInfo(4, LuaDebugger.event.C2S_HITBreakPoint) local data = debugger_stackInfo(4, LuaDebugger.event.C2S_HITBreakPoint)
if (data.stack and data.stack[1]) then if(data.stack and data.stack[1]) then
data.stack[1].isXpCall = true data.stack[1].isXpCall = true
end end
--挂起等待调试器作出反应 --挂起等待调试器作出反应
@ -2346,11 +2371,12 @@ local function debugger_xpcall()
end end
--调试开始 --调试开始
local function start() local function start()
local socket = createSocket()
-- print(controller_host)
-- print(controller_port)
local fullName, dirName, fileName = debugger_getFilePathInfo(getinfo(1).source) local socket = createSocket()
print(controller_host)
print(controller_port)
local fullName,dirName,fileName = debugger_getFilePathInfo(getinfo(1).source)
LuaDebugger.DebugLuaFie = fileName LuaDebugger.DebugLuaFie = fileName
local server = socket.connect(controller_host, controller_port) local server = socket.connect(controller_host, controller_port)
debug_server = server; debug_server = server;
@ -2358,7 +2384,7 @@ local function start()
--创建breakInfo socket --创建breakInfo socket
socket = createSocket() socket = createSocket()
breakInfoSocket = socket.connect(controller_host, controller_port) breakInfoSocket = socket.connect(controller_host, controller_port)
if (breakInfoSocket) then if(breakInfoSocket) then
breakInfoSocket:settimeout(0) breakInfoSocket:settimeout(0)
debugger_sendMsg(breakInfoSocket, LuaDebugger.event.C2S_SetSocketName, { debugger_sendMsg(breakInfoSocket, LuaDebugger.event.C2S_SetSocketName, {
name = "breakPointSocket" name = "breakPointSocket"
@ -2373,41 +2399,46 @@ local function start()
xpcall(function() xpcall(function()
sethook(debug_hook, "lrc") sethook(debug_hook, "lrc")
end, function(error) end, function(error)
-- print("error:", error) print("error:", error)
end) end)
if (not jit) then if(not jit) then
if (_VERSION) then if(_VERSION)then
-- print("当前lua版本为: ".._VERSION.." 请使用LuaDebug 进行调试!") print("当前lua版本为: ".._VERSION.." 请使用LuaDebug 进行调试!")
else else
-- print("当前为lua版本,请使用LuaDebug 进行调试!") print("当前为lua版本,请使用LuaDebug 进行调试!")
end end
end end
_resume(coro_debugger, server) _resume(coro_debugger, server)
end end
end end
end end
function StartDebug(host, port) function StartDebug(host, port)
if (not host) then
-- print("error host nil")
if(not host) then
print("error host nil")
end end
if (not port) then if(not port) then
-- print("error prot nil") print("error prot nil")
end end
if (type(host) ~= "string") then if(type(host) ~= "string") then
-- print("error host not string") print("error host not string")
end end
if (type(port) ~= "number") then if(type(port) ~= "number") then
-- print("error host not number") print("error host not number")
end end
controller_host = host controller_host = host
controller_port = port controller_port = port
xpcall(start, function(error) xpcall(start, function(error)
-- body -- body
-- print(error) print(error)
end) end)
return debugger_receiveDebugBreakInfo, debugger_xpcall return debugger_receiveDebugBreakInfo, debugger_xpcall
end end
--base64 --base64
local string = string local string = string
@ -2417,10 +2448,10 @@ ZZBase64.__code = {
'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',
'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/',
}; };
ZZBase64.__decode = {} ZZBase64.__decode = {}
for k, v in pairs(ZZBase64.__code) do for k,v in pairs(ZZBase64.__code) do
ZZBase64.__decode[string.byte(v, 1)] = k - 1 ZZBase64.__decode[string.byte(v,1)] = k - 1
end end
function ZZBase64.encode(text) function ZZBase64.encode(text)
@ -2430,14 +2461,14 @@ function ZZBase64.encode(text)
local res = {} local res = {}
local index = 1 local index = 1
for i = 1, len, 3 do for i = 1, len, 3 do
local a = string.byte(text, i) local a = string.byte(text, i )
local b = string.byte(text, i + 1) local b = string.byte(text, i + 1)
local c = string.byte(text, i + 2) local c = string.byte(text, i + 2)
-- num = a<<16 + b<<8 + c -- num = a<<16 + b<<8 + c
local num = a * 65536 + b * 256 + c local num = a * 65536 + b * 256 + c
for j = 1, 4 do for j = 1, 4 do
--tmp = num >> ((4 -j) * 6) --tmp = num >> ((4 -j) * 6)
local tmp = math.floor(num / (2 ^ ((4 - j) * 6))) local tmp = math.floor(num / (2 ^ ((4-j) * 6)))
--curPos = tmp&0x3f --curPos = tmp&0x3f
local curPos = tmp % 64 + 1 local curPos = tmp % 64 + 1
res[index] = ZZBase64.__code[curPos] res[index] = ZZBase64.__code[curPos]
@ -2474,13 +2505,13 @@ function ZZBase64.__left2(res, index, text, len)
res[index + 3] = "=" res[index + 3] = "="
end end
function ZZBase64.__left1(res, index, text, len) function ZZBase64.__left1(res, index,text, len)
local num = string.byte(text, len + 1) local num = string.byte(text, len + 1)
num = num * 16 num = num * 16
local tmp = math.floor(num / 64) local tmp = math.floor(num / 64)
local curPos = tmp % 64 + 1 local curPos = tmp % 64 + 1
res[index] = ZZBase64.__code[curPos] res[index ] = ZZBase64.__code[curPos]
curPos = num % 64 + 1 curPos = num % 64 + 1
res[index + 1] = ZZBase64.__code[curPos] res[index + 1] = ZZBase64.__code[curPos]
@ -2503,11 +2534,11 @@ function ZZBase64.decode(text)
local res = {} local res = {}
local index = 1 local index = 1
local decode = ZZBase64.__decode local decode = ZZBase64.__decode
for i = 1, len, 4 do for i =1, len, 4 do
local a = decode[string.byte(text, i)] local a = decode[string.byte(text,i )]
local b = decode[string.byte(text, i + 1)] local b = decode[string.byte(text,i + 1)]
local c = decode[string.byte(text, i + 2)] local c = decode[string.byte(text,i + 2)]
local d = decode[string.byte(text, i + 3)] local d = decode[string.byte(text,i + 3)]
--num = a<<18 + b<<12 + c<<6 + d --num = a<<18 + b<<12 + c<<6 + d
local num = a * 262144 + b * 4096 + c * 64 + d local num = a * 262144 + b * 4096 + c * 64 + d
@ -2516,7 +2547,7 @@ function ZZBase64.decode(text)
num = math.floor(num / 256) num = math.floor(num / 256)
local f = string.char(num % 256) local f = string.char(num % 256)
num = math.floor(num / 256) num = math.floor(num / 256)
res[index] = string.char(num % 256) res[index ] = string.char(num % 256)
res[index + 1] = f res[index + 1] = f
res[index + 2] = e res[index + 2] = e
index = index + 3 index = index + 3
@ -2552,4 +2583,7 @@ function ZZBase64.__decodeLeft2(res, index, text, len)
res[index] = string.char(num) res[index] = string.char(num)
end end
return StartDebug return StartDebug

View File

@ -9,567 +9,218 @@ function EXClearingView.new(blur_view)
setmetatable(M, { __index = ResultView }) setmetatable(M, { __index = ResultView })
local self = setmetatable({}, { __index = M }) local self = setmetatable({}, { __index = M })
self._full = true self._full = true
ResultView.init(self, "ui://Main_Majiang/clearing") ResultView.init(self, "ui://Main_Majiang/clearing_jiangxi")
self._currenIndex = 0 self._currenIndex = 0
self._blur_view = blur_view self._blur_view = blur_view
self._close_zone = false self._close_zone = false
self:InitMaPai() -- self:InitMaPai()
return self return self
end end
function M:InitMaPai() -- function M:InitMaPai()
self.maPaiCtr = self._view:GetController("mapai") -- self.maPaiCtr = self._view:GetController("mapai")
self.maPaiCtr.selectedIndex = 0 -- self.maPaiCtr.selectedIndex = 0
self.maPaiList = {} -- self.maPaiList = {}
for i = 1, 8 do -- for i = 1, 8 do
local tempMP = self._view:GetChild("niao" .. i) -- local tempMP = self._view:GetChild("niao" .. i)
table.insert(self.maPaiList, tempMP) -- table.insert(self.maPaiList, tempMP)
end -- end
end -- end
function M:IsMapaiShow(niao, isShow)
if niao then
niao.visible = isShow
end
end
function M:SetMaPaiValue(niao, value)
if niao then
niao.icon = 'ui://Main_Majiang/' .. get_majiang_prefix(DataManager.CurrenRoom.game_id) .. "201_" .. value
end
end
function M:SetMaPaiColor(niao, num)
niao:GetController("color").selectedIndex = num
end
function M:HideAllMapai()
for i = 1, #self.maPaiList do
self:IsMapaiShow(self.maPaiList[i], false)
self:SetMaPaiColor(self.maPaiList[i], 0)
end
end
function M:ShowSelectMaPai(niaoList)
if niaoList and #niaoList > 0 then
self.maPaiCtr.selectedIndex = 1
self:HideAllMapai()
for i = 1, #niaoList do
self:IsMapaiShow(self.maPaiList[i], true)
self:SetMaPaiValue(self.maPaiList[i], niaoList[i].card)
if niaoList[i].score > 0 then
self:SetMaPaiColor(self.maPaiList[i], 2)
end
end
else
self.maPaiCtr.selectedIndex = 0
end
end
function M:CalculatePaixingInfo(result)
self.WinList = {}
if result.info_list and #result.info_list > 0 then
for i = 1, #result.info_list do
if result.info_list[i].win_list and #result.info_list[i].win_list > 0 then
table.insert(self.WinList, result.info_list[i].win_list)
end
end
end
printlog("牌型列表====>>>")
pt(self.WinList)
end
function M:SetPaixingxiangqing(num)
for i = 1, #self.PaiXingXiangQingCtrList do
if self.PaiXingXiangQingCtrList[i] then
self.PaiXingXiangQingCtrList[i].selectedIndex = num
end
end
end
function M:InitData(over, room, result, total_result, callback) function M:InitData(over, room, result, total_result, callback)
self._callback = callback self._callback = callback
local showClearMainBtn = self._view:GetChild("btn_showClearMain")
local nextRoundBtn = self._view:GetChild("btn_nextRound")
local nextRoundBtn2 = self._view:GetChild("Btn_NextRound2")
local endRound = self._view:GetChild("Btn_EndRound")
local _overCtr = self._view:GetController("over") local _overCtr = self._view:GetController("over")
local btn_confirm = self._view:GetChild("btn_confirm") local mainCtr = self._view:GetController("main")
local btn_result = self._view:GetChild("btn_showResult") local playerNum = self._view:GetController("playerNum")
local btn_close = self._view:GetChild("big_result"):GetChild("btn_close")
local _btnCtr = self._view:GetController("button")
local _sdkCtr = self._view:GetController("sdk")
local ctr_type = self._view:GetController("type")
self._view:GetChild("tex_roominfo").text = string.format("房号%s 局%s/%s %s", room.room_id, room.curren_round, local peopleNum = room.room_config.people_num
room.room_config.round, os.date("%Y-%m-%d %H:%M:%S", os.time()))
self._view:GetChild("tex_gameinfo").text = string.gsub(room.room_config:GetDes2(), "\r", "")
if result then playerNum.selectedIndex = peopleNum - 2
self:ShowSelectMaPai(result.niao)
self:CalculatePaixingInfo(result)
end
self.PaiXingXiangQingCtrList = {} showClearMainBtn.onClick:Set(function()
mainCtr.selectedIndex = 1
local paixingxiangqing = self._view:GetChild("btn_detal")
local fanhuipaixing = self._view:GetChild("btn_fanhuipaixing")
fanhuipaixing.visible = false
paixingxiangqing.visible = true
paixingxiangqing.onClick:Add(function()
paixingxiangqing.visible = false
fanhuipaixing.visible = true
self:SetPaixingxiangqing(1)
end)
fanhuipaixing.onClick:Add(function()
paixingxiangqing.visible = true
fanhuipaixing.visible = false
self:SetPaixingxiangqing(0)
end) end)
nextRoundBtn.onClick:Set(function()
if over ~= 2 then
if result.liuju then
ctr_type.selectedIndex = 3
else
local info_list = result.info_list
for i = 1, #info_list do
local is_win = info_list[i].is_win
if is_win then
if info_list[i].seat == room.self_player.seat then
ctr_type.selectedIndex = 1
else
ctr_type.selectedIndex = 2
end
end
end
end
if over == 0 then
_btnCtr.selectedIndex = 0
_sdkCtr.selectedIndex = 1
btn_confirm.onClick:Add(function()
local _gamectr = ControllerManager.GetController(GameController) local _gamectr = ControllerManager.GetController(GameController)
_gamectr:PlayerReady() _gamectr:PlayerReady()
self:DestroyWithCallback() self:DestroyWithCallback()
end) end)
self:AddClearItem(room, result.info_list, nil, over, result.niao, result.active_player)
elseif over == 1 then nextRoundBtn2.onClick:Set(function()
_btnCtr.selectedIndex = 1 local _gamectr = ControllerManager.GetController(GameController)
_sdkCtr.selectedIndex = 1 _gamectr:PlayerReady()
btn_result.onClick:Add(function() self:DestroyWithCallback()
self.maPaiCtr.selectedIndex = 0
_overCtr.selectedIndex = 1
_btnCtr.selectedIndex = 0
_sdkCtr.selectedIndex = 0
if self._qsinfo_view then
self._qsinfo_view:Dispose()
end
end)
btn_close.onClick:Add(function()
ViewManager.ChangeView(ViewManager.View_Lobby)
end) end)
self:AddClearItem(room, result.info_list, total_result.info_list, over, result.niao, result.active_player) endRound.onClick:Set(function()
end ViewManager.ChangeView(ViewManager.View_Family)
end)
if over == 0 then
_overCtr.selectedIndex = 0
self:fillResult0(room, peopleNum, result)
else else
_overCtr.selectedIndex = 1 _overCtr.selectedIndex = 1
self.maPaiCtr.selectedIndex = 0 self:fillResult1(room, peopleNum, total_result)
btn_close.onClick:Add(function()
ViewManager.ChangeView(ViewManager.View_Lobby)
end)
self:AddClearItem(room, nil, total_result.info_list, over)
end end
end end
function M:AddClearItem(room, data, total_data, over, niao, active_player) function M:fillResult0(room, peopleNum, result)
local n = over + 1 local config = ExtendManager.GetExtendConfig(room.game_id)
local list_view1 = self._view:GetChild("player_list_1") local mode = config:GetGameInfo()
local list_view2 = self._view:GetChild("player_list_2") local gamePlay = mode:LoadConfigToDetail(json.encode(room.room_config.config))
self._view:GetChild("Label_GamePlay").title = string.format("第%s/%s局,%s", room.curren_round,
room.room_config.round, gamePlay)
for i = 1, peopleNum do
local playerInfoComp = self._view:GetChild(string.format("Comp_Player%d", i))
if 0 == over or 1 == over then local allCardsList = playerInfoComp:GetChild("list_allCards")
table.sort(data, function(a, b) return a.seat < b.seat end) local huCardBtn = playerInfoComp:GetChild("Btn_Card_Hu")
list_view1:RemoveChildrenToPool() local jiangMaList = playerInfoComp:GetChild("list_JiangMa")
local ziMoCtr = playerInfoComp:GetController("isZiMo")
local dianPaoCtr = playerInfoComp:GetController("isPao")
local isMeCtr = playerInfoComp:GetController("IsMe")
for i = 1, #data do local infoList = result.info_list[i]
local item = list_view1:AddItemFromPool() local playInfo = room:GetPlayerBySeat(infoList.seat)
self:FillItemData(room, data[i], item, active_player, niao) local fzCardInfo = playInfo.fz_list
end local fzInfoNum = #fzCardInfo
if #data == 3 then local handInfoNum = #infoList.hand_card
list_view1.lineGap = 54
elseif #data == 2 then
list_view1.lineGap = 108
end
if 1 == over then
self:FillItemData2(room, total_data, list_view2)
end
elseif 2 == over then
self:FillItemData2(room, total_data, list_view2)
end
end
function M:FillItemData(room, data, item, active_player, niao) self:fillHead(playInfo.self_user.head_url, playerInfoComp)
local _gamectr = ControllerManager.GetController(GameController)
local p = room:GetPlayerBySeat(data["seat"])
item:GetChild("playerName").text = p.self_user.nick_name
item:GetChild("lab_hp").text = "" --抓马
local user = room:GetPlayerBySeat(data["seat"]).self_user
local head = item:GetChild('head'):GetChild('n4')
ImageLoad.Load(user.head_url, head)
-- 手牌 playerInfoComp:GetChild("text_name").text = playInfo.self_user.nick_name
local hand_cards = data["hand_card"] playerInfoComp:GetChild("Text_BoJing").text = infoList.jing_score >= 0 and
table.sort(hand_cards, ViewUtil.HandCardSort) string.format("+%d", infoList.jing_score) or infoList.jing_score
local hand_list_view = item:GetChild("hand_card_list") playerInfoComp:GetChild("Text_Gang").text = infoList.gang_score >= 0 and
hand_list_view:RemoveChildrenToPool() string.format("+%d", infoList.gang_score) or infoList.gang_score
for i = 1, #hand_cards do playerInfoComp:GetChild("Text_Hu").text = infoList.hu_score >= 0 and string.format("+%d", infoList.hu_score) or
local card = hand_list_view:AddItemFromPool() infoList.hu_score
card.icon = "ui://Main_Majiang/202_" .. hand_cards[i] playerInfoComp:GetChild("Text_Tatal").text = infoList.round_score >= 0 and
end string.format("+%d", infoList.round_score) or infoList.round_score
hand_list_view.width = 52 * #hand_cards
local fz_card = p.fz_list for j = 1, fzInfoNum do
local fz_card_list = item:GetChild("fz_card_list") if fzCardInfo[j].type == FZType.Peng then
fz_card_list.width = 157 * #fz_card * 0.8 local item = allCardsList:AddItemFromPool("ui://Main_Majiang/Comp_FZ_3")
fz_card_list:RemoveChildrenToPool() for l = 1, 3 do
local card = item:GetChild(string.format("Btn_Card%d", l))
for i = 1, #fz_card do card.icon = string.format("ui://Main_Majiang/%s202_%d", self:GetPrefix(), fzCardInfo[j].card)
if fz_card[i].type == FZType.Peng then
local item = fz_card_list:AddItemFromPool("ui://Main_Majiang/clearing_fz_3")
for j = 1, 3 do
local card = item:GetChild("card_" .. j)
card.icon = "ui://Main_Majiang/202_" .. fz_card[i].card
end end
elseif fz_card[i].type == FZType.Chi then elseif fzCardInfo[j].type == FZType.Chi then
local item = fz_card_list:AddItemFromPool("ui://Main_Majiang/clearing_fz_3") local item = allCardsList:AddItemFromPool("ui://Main_Majiang/Comp_FZ_3")
for j = 1, 3 do for l = 1, 3 do
local card = item:GetChild("card_" .. j) local card = item:GetChild(string.format("Btn_Card%d", l))
card.icon = "ui://Main_Majiang/" .. self:GetPrefix() .. "202_" .. fz_card[i].opcard[j] card.icon = string.format("ui://Main_Majiang/%s202_%d", self:GetPrefix(), fzCardInfo[j].opcard
[l])
end end
elseif fz_card[i].type == FZType.Gang or fz_card[i].type == FZType.Gang_An or fz_card[i].type == FZType.Gang_Peng then elseif fzCardInfo[j].type == FZType.Gang or fzCardInfo[j].type == FZType.Gang_An or fzCardInfo[j].type == FZType.Gang_Peng then
local item = fz_card_list:AddItemFromPool("ui://Main_Majiang/clearing_fz_4") local item = allCardsList:AddItemFromPool("ui://Main_Majiang/Comp_FZ_4")
for j = 1, 4 do for l = 1, 4 do
local card = item:GetChild("card_" .. j) local card = item:GetChild(string.format("Btn_Card%d", l))
if fz_card[i].type == FZType.Gang_An and j == 4 then if fzCardInfo[j].type == FZType.Gang_An and j == 4 then
card.icon = "ui://Main_Majiang/202_00" card.icon = "ui://Main_Majiang/202_00"
else else
card.icon = "ui://Main_Majiang/202_" .. fz_card[i].card card.icon = string.format("ui://Main_Majiang/%s202_%d", self:GetPrefix(), fzCardInfo[j].card)
end end
end end
end end
end end
local huadd = data["hu_score"] local handCardItem = allCardsList:AddItemFromPool("ui://Main_Majiang/Comp_HandCard")
local gangadd = data["gang_score"] local handCardList = handCardItem:GetChild("list")
local jingadd = data["jing_score"] handCardList:SetVirtual()
local total = data["round_score"] handCardList.itemRenderer = function(index, obj)
local geng_zhuan = data["geng_zhuan"] obj.icon = string.format("ui://Main_Majiang/%s202_%d", self:GetPrefix(), infoList.hand_card[index + 1])
local sp = " "
local str = "胡:" .. huadd .. ""
if gangadd then
str = str .. sp .. "杠:" .. gangadd .. ""
end end
if jingadd then handCardList.numItems = handInfoNum
str = str .. sp .. "博精:" .. jingadd .. "" allCardsList.width = 172 * fzInfoNum + 60 + (handInfoNum - 1) * 56 + 36 * (fzInfoNum)
if infoList.seat == room.self_player.seat then
isMeCtr.selectedIndex = 1
end end
if infoList.is_win then
local winInfo = ""
for j = 1, #infoList.win_list do
winInfo = string.format("%s,%s", winInfo, Hu_Type_Name[infoList.win_list[j].type])
end
winInfo = string.sub(winInfo, 2, -1)
playerInfoComp:GetChild("text_huShow").text = winInfo
if room.isZiMoHu then
ziMoCtr.selectedIndex = 1
end
huCardBtn.icon = string.format("ui://Main_Majiang/202_%d", infoList.win_card)
huCardBtn.visible = true
jiangMaList.visible = false
item:GetChild("score1").text = str
-- local total_score = data["total_score"]
if total >= 0 then
item:GetChild("score2").text = "+" .. total
item:GetChild("score2").grayed = false
else else
item:GetChild("score2").text = total playerInfoComp:GetChild("text_huShow").text = ""
item:GetChild("score2").grayed = true if not room.isZiMoHu and playInfo.self_user.account_id == result.active_player then
dianPaoCtr.selectedIndex = 1
end end
huCardBtn.visible = false
--计算牌型 jiangMaList.visible = false
local totalPeson = DataManager.CurrenRoom.room_config.people_num - 1
local win_list = data["win_list"]
local is_win = data["is_win"] or false
local str1 = ""
sp = ""
if is_win then
if win_list then
if DataManager.CurrenRoom.isZiMoHu then
str1 = "自摸"
else
str1 = "接炮"
end end
for i = 1, #win_list do
local huName = Hu_Type_Name[win_list[i].type]
if huName then
str1 = str1 .. sp .. huName .. "x" .. win_list[i].score
end
end
str1 = str1 .. " +" .. huadd .. ""
end
else
printlog("输家============")
if DataManager.CurrenRoom.isZiMoHu then
printlog("自摸处理============")
--str1=""
if #self.WinList == 1 then
for i = 1, #self.WinList do
for j = 1, #self.WinList[i] do
local huName = Hu_Type_Name[self.WinList[i][j].type]
if huName then
if j == 1 then
str1 = str1 .. huName .. "x" .. self.WinList[i][j].score
else
str1 = str1 .. sp .. huName .. "x" .. self.WinList[i][j].score
end
end
end
end
str1 = str1 .. " " .. huadd .. ""
else
printlog("服务端自摸计算异常===>>>")
end
else
printlog("非自摸处理====>>>")
--点炮 一炮多响
local yipaoduoxiang = false
if #self.WinList > 1 then
yipaoduoxiang = true
end
if yipaoduoxiang then
printlog("一炮多响====>>>")
str = "点炮"
local allTypeList = {}
local isHas = false
for i = 1, #self.WinList do
for j = 1, #self.WinList[i] do
isHas = IsHasDictionary(self.WinList[i][j].type, allTypeList)
if isHas == false then
table.insert(allTypeList, self.WinList[i][j].type)
end
end
end
if #allTypeList > 0 then
for i = 1, #allTypeList do
local huName = Hu_Type_Name[allTypeList[i]]
if huName then
str1 = str1 .. huName .. ""
end
end
str1 = str1 .. " " .. huadd .. ""
end
else
if p.self_user.account_id == active_player and is_win == false and not data["liuju"] then
str1 = "点炮"
if #self.WinList == 1 then
for i = 1, # self.WinList do
for j = 1, #self.WinList[i] do
local huName = Hu_Type_Name[self.WinList[i][j].type]
if huName then
str1 = str1 .. sp .. huName .. "x" .. self.WinList[i][j].score
end
end
end
str1 = str1 .. " " .. huadd .. ""
else
printlog("服务端自摸计算异常===>>>")
end
end
end
end
end
--
printlog("牌型计算==>>>", str1)
if data["ming_gang_num"] > 0 then
str1 = str1 .. " 明杠x" .. data["ming_gang_num"]
end
if data["an_gang_num"] > 0 then
str1 = str1 .. " 暗杠x" .. data["an_gang_num"]
end
if data["dian_gang_num"] > 0 then
str1 = str1 .. " 点杠x" .. data["dian_gang_num"]
end
if gangadd ~= 0 then
if gangadd > 0 then
str1 = str1 .. " +" .. gangadd .. ""
else
str1 = str1 .. " " .. gangadd .. ""
end
end
if data["ma_geng_gong"] and data["ma_geng_gong"] ~= 0 then
if data["ma_geng_gong"] > 0 then
str1 = str1 .. " 马跟杠:+" .. data["ma_geng_gong"] .. ""
else
str1 = str1 .. " 马跟杠:" .. data["ma_geng_gong"] .. ""
end
end
if geng_zhuan and geng_zhuan ~= 0 then
if geng_zhuan > 0 then
str1 = str1 .. " 跟庄:+" .. geng_zhuan .. ""
else
str1 = str1 .. " 跟庄:" .. geng_zhuan .. ""
end
end
item:GetChild("score3").text = str1
item:GetChild("score4").text = str1
local paixingCtr = item:GetController("detail")
table.insert(self.PaiXingXiangQingCtrList, paixingCtr)
-------------------------
local hp_nonnegative = room:checkHpNonnegative()
item:GetController("nonnegative").selectedIndex = hp_nonnegative and 1 or 0
if hp_nonnegative then
local hp_info = data.hp_info
local ctr_hp_limit = item:GetController("hp_limit")
local hp = d2ad(hp_info.round_actual_hp)
if hp >= 0 then hp = "+" .. tostring(hp) end
item:GetChild("tex_hp").text = hp
ctr_hp_limit.selectedIndex = hp_info.upper_limit and 1 or 0
end
item:GetController("win").selectedIndex = is_win and 0 or 1
if p.self_user.account_id == active_player and is_win == false and total < 0 then
item:GetController("win").selectedIndex = 2
end
if is_win then
item:GetController("bg").selectedIndex = 1
else
item:GetController("bg").selectedIndex = 0
end
local win_card = item:GetChild("win_card")
win_card.icon = "ui://Main_Majiang/202_" .. data["win_card"]
if niao and #niao > 0 then
local currentNiaoList = self:CalculateNiao(niao, data["seat"])
if currentNiaoList and #currentNiaoList > 0 then
local lst_niao = item:GetChild("list_niao")
lst_niao:RemoveChildrenToPool()
for i = 1, #currentNiaoList do
if currentNiaoList[i].score > 0 then
local card_niao = lst_niao:AddItemFromPool()
card_niao.icon = "ui://Main_Majiang/202_" .. currentNiaoList[i].card
end
end
end
end
if p.seat == room.banker_seat then
item:GetController("bank").selectedIndex = 1
end end
end end
function M:CalculateNiao(niaoList, seat) function M:fillResult1(room, peopleNum, total_result)
local tempNiao = {} local gameNameAndRoomIDText = self._view:GetChild("Text_GameNameAndRoomID")
for i = 1, #niaoList do local familyIDText = self._view:GetChild("Text_FamilyID")
if niaoList[i].seat == seat then for i, v in pairs(room.self_player.self_user.games) do
table.insert(tempNiao, niaoList[i]) if v.game_id == room.game_id then
gameNameAndRoomIDText.text = string.format("%s 房号:%s", v.name, room.room_id)
end end
end end
return tempNiao if #gameNameAndRoomIDText.text <= 0 then
end gameNameAndRoomIDText.text = string.format("房号:%s", room.room_id)
function M:FillItemData2(room, data, list)
-- 赋值result_info聊天室分享需要
local player_list = {}
for i = 1, #data do
player_list[i] = {}
local user = room:GetPlayerBySeat(data[i].seat).self_user
player_list[i].id = user.account_id
player_list[i].hp_info = data[i].hp_info
player_list[i].score = data[i].total_score
player_list[i].house = room.owner_id == player_list[i].id and 1 or 0
player_list[i].nick = user.nick_name
player_list[i].head_url = user.head_url
local settle_log = data[i].settle_log
player_list[i].param = {}
player_list[i].param[1] = {}
player_list[i].param[1].key = "自摸次数:"
player_list[i].param[1].value = tostring(data[i].settle_log.zimo)
player_list[i].param[2] = {}
player_list[i].param[2].key = "接炮次数:"
player_list[i].param[2].value = tostring(data[i].settle_log.jie_pao)
player_list[i].param[3] = {}
player_list[i].param[3].key = "点炮次数:"
player_list[i].param[3].value = tostring(data[i].settle_log.dian_pao)
player_list[i].param[4] = {}
player_list[i].param[4].key = "暗杠次数:"
player_list[i].param[4].value = tostring(data[i].settle_log.an_kong)
player_list[i].param[5] = {}
player_list[i].param[5].key = "明杠次数:"
player_list[i].param[5].value = tostring(data[i].settle_log.ming_kong)
end end
local round = room.room_config.round
self:GenerateRoomResultInfo(round, room.room_config:GetGameName(), room.room_id, room.create_time, player_list)
local big_result = self._view:GetChild("big_result")
big_result:GetChild("txt_room_info").text = string.format("%s 房号%s 局%s/%s", os.date("%Y/%m/%d", os.time()),
room.room_id, room.curren_round, room.room_config.round)
local lst_p = big_result:GetChild("player_list")
if #player_list == 3 then
lst_p.columnGap = 108
elseif #player_list == 2 then
lst_p.columnGap = 208
end
self:InitBigResult(room, 30)
local show_detail = room.hpOnOff == 1
for i = 1, lst_p.numChildren do
local com_p = lst_p:GetChildAt(i - 1)
com_p:GetController("jsicon").selectedIndex = i - 1
local list_param = com_p:GetChild("list_param")
for j = 1, list_param.numChildren do
local tem = list_param:GetChildAt(j - 1)
tem:GetChild("txt_value").textFormat.size = 30
end
if show_detail then
local score = 0
if com_p:GetController("pn").selectedIndex == 0 then
score = com_p:GetChild("txt_navigate").text
else
score = com_p:GetChild("txt_positive").text
end
score = score / room.score_times
com_p:GetChild("tex_detail_score").text = string.format("%s × %s倍", score, room.score_times)
end
end
if room.group_id ~= 0 then if room.group_id ~= 0 then
big_result:GetController("group").selectedIndex = 1 familyIDText.text = string.format("俱乐部:%s", room.group_id)
else
familyIDText.visible = false
end
self._view:GetChild("Text_RoundNum").text = string.format("局数:%s/%s", room.curren_round, room.room_config.round)
self._view:GetChild("Text_Time").text = os.date("%Y-%m-%d %H:%M:%S", os.time())
for i = 1, peopleNum do
local resultInfoComp = self._view:GetChild(string.format("Comp_ResultInfo%d", i))
local totalInfoList = total_result.info_list[i]
local playInfo = room:GetPlayerBySeat(totalInfoList.seat)
self:fillHead(playInfo.self_user.head_url, resultInfoComp)
resultInfoComp:GetChild('Text_Name').text = playInfo.self_user.nick_name
resultInfoComp:GetChild('Text_ID').text = string.format("ID:%s", playInfo.self_user.account_id)
resultInfoComp:GetChild('Text_TotalScore').text = totalInfoList.total_score >= 0 and
string.format("+%s", totalInfoList.total_score) or totalInfoList.total_score
resultInfoComp:GetChild('Text_ZiMo').text = string.format("自摸 %d次", totalInfoList.settle_log.zimo or 0)
resultInfoComp:GetChild('Text_JiePao').text = string.format("接炮 %d次", totalInfoList.settle_log.jiepao or 0)
resultInfoComp:GetChild('Text_FangPao').text = string.format("放炮 %d次", totalInfoList.settle_log.fangpao or 0)
resultInfoComp:GetChild('Text_AnGang').text = string.format("暗杠 %d次", totalInfoList.settle_log.an_kong or 0)
resultInfoComp:GetChild('Text_MingGang').text = string.format("明杠 %d次",
totalInfoList.settle_log.ming_kong or 0)
resultInfoComp:GetChild('Text_FangGang').text = string.format("放杠 %d次",
totalInfoList.settle_log.fanggang or 0)
resultInfoComp:GetController("win").selectedIndex = totalInfoList.total_score >= 0 and 1 or 0
end end
DataManager.CurrenRoom = nil
end end
function M:LoadHead(p, room) function M:fillHead(url, view)
local btn_head = self._view:GetChild("btn_head") ImageLoad.Load(url, view:GetChild("Btn_Head")._iconObject)
for i = 1, #room.player_list do
local player = room.player_list[i]
if p.seat == player.seat and player.self_user.head_url ~= "" then
ImageLoad.Load(player.self_user.head_url, btn_head.icon)
end
end
end end
local prefix local prefix

View File

@ -1,605 +0,0 @@
require("Game.View.ResultView")
local Hu_Type_Name = import(".CS_Win_Type")
local EXClearingView = {}
local M = EXClearingView
function EXClearingView.new(blur_view)
setmetatable(M, { __index = ResultView })
local self = setmetatable({}, { __index = M })
self._full = true
ResultView.init(self, "ui://Main_Majiang/clearing_jiangxi")
self._currenIndex = 0
self._blur_view = blur_view
self._close_zone = false
self:InitMaPai()
return self
end
function M:InitMaPai()
self.maPaiCtr = self._view:GetController("mapai")
self.maPaiCtr.selectedIndex = 0
self.maPaiList = {}
for i = 1, 8 do
local tempMP = self._view:GetChild("niao" .. i)
table.insert(self.maPaiList, tempMP)
end
end
function M:IsMapaiShow(niao, isShow)
if niao then
niao.visible = isShow
end
end
function M:SetMaPaiValue(niao, value)
if niao then
niao.icon = 'ui://Main_Majiang/' .. get_majiang_prefix(DataManager.CurrenRoom.game_id) .. "201_" .. value
end
end
function M:SetMaPaiColor(niao, num)
niao:GetController("color").selectedIndex = num
end
function M:HideAllMapai()
for i = 1, #self.maPaiList do
self:IsMapaiShow(self.maPaiList[i], false)
self:SetMaPaiColor(self.maPaiList[i], 0)
end
end
function M:ShowSelectMaPai(niaoList)
if niaoList and #niaoList > 0 then
self.maPaiCtr.selectedIndex = 1
self:HideAllMapai()
for i = 1, #niaoList do
self:IsMapaiShow(self.maPaiList[i], true)
self:SetMaPaiValue(self.maPaiList[i], niaoList[i].card)
if niaoList[i].score > 0 then
self:SetMaPaiColor(self.maPaiList[i], 2)
end
end
else
self.maPaiCtr.selectedIndex = 0
end
end
function M:CalculatePaixingInfo(result)
self.WinList = {}
if result.info_list and #result.info_list > 0 then
for i = 1, #result.info_list do
if result.info_list[i].win_list and #result.info_list[i].win_list > 0 then
table.insert(self.WinList, result.info_list[i].win_list)
end
end
end
printlog("牌型列表====>>>")
pt(self.WinList)
end
function M:SetPaixingxiangqing(num)
for i = 1, #self.PaiXingXiangQingCtrList do
if self.PaiXingXiangQingCtrList[i] then
self.PaiXingXiangQingCtrList[i].selectedIndex = num
end
end
end
function M:InitData(over, room, result, total_result, callback)
self._callback = callback
local _overCtr = self._view:GetController("over")
local btn_confirm = self._view:GetChild("btn_confirm")
local btn_result = self._view:GetChild("btn_showResult")
local btn_close = self._view:GetChild("big_result"):GetChild("btn_close")
local _btnCtr = self._view:GetController("button")
local _sdkCtr = self._view:GetController("sdk")
local ctr_type = self._view:GetController("type")
self._view:GetChild("tex_roominfo").text = string.format("房号%s 局%s/%s %s", room.room_id, room.curren_round,
room.room_config.round, os.date("%Y-%m-%d %H:%M:%S", os.time()))
self._view:GetChild("tex_gameinfo").text = string.gsub(room.room_config:GetDes2(), "\r", "")
if result then
self:ShowSelectMaPai(result.niao)
self:CalculatePaixingInfo(result)
end
self.PaiXingXiangQingCtrList = {}
local paixingxiangqing = self._view:GetChild("btn_detal")
local fanhuipaixing = self._view:GetChild("btn_fanhuipaixing")
fanhuipaixing.visible = false
paixingxiangqing.visible = true
paixingxiangqing.onClick:Add(function()
paixingxiangqing.visible = false
fanhuipaixing.visible = true
self:SetPaixingxiangqing(1)
end)
fanhuipaixing.onClick:Add(function()
paixingxiangqing.visible = true
fanhuipaixing.visible = false
self:SetPaixingxiangqing(0)
end)
if over ~= 2 then
if result.liuju then
ctr_type.selectedIndex = 3
else
local info_list = result.info_list
for i = 1, #info_list do
local is_win = info_list[i].is_win
if is_win then
if info_list[i].seat == room.self_player.seat then
ctr_type.selectedIndex = 1
else
ctr_type.selectedIndex = 2
end
end
end
end
if over == 0 then
_btnCtr.selectedIndex = 0
_sdkCtr.selectedIndex = 1
btn_confirm.onClick:Add(function()
local _gamectr = ControllerManager.GetController(GameController)
_gamectr:PlayerReady()
self:DestroyWithCallback()
end)
self:AddClearItem(room, result.info_list, nil, over, result.niao, result.active_player)
elseif over == 1 then
_btnCtr.selectedIndex = 1
_sdkCtr.selectedIndex = 1
btn_result.onClick:Add(function()
self.maPaiCtr.selectedIndex = 0
_overCtr.selectedIndex = 1
_btnCtr.selectedIndex = 0
_sdkCtr.selectedIndex = 0
if self._qsinfo_view then
self._qsinfo_view:Dispose()
end
end)
btn_close.onClick:Add(function()
ViewManager.ChangeView(ViewManager.View_Lobby)
end)
self:AddClearItem(room, result.info_list, total_result.info_list, over, result.niao, result.active_player)
end
else
_overCtr.selectedIndex = 1
self.maPaiCtr.selectedIndex = 0
btn_close.onClick:Add(function()
ViewManager.ChangeView(ViewManager.View_Lobby)
end)
self:AddClearItem(room, nil, total_result.info_list, over)
end
-----------------------lingmeng----------------------------
local showClearMainBtn = self._view:GetChild("btn_showClearMain")
local nextRoundBtn = self._view:GetChild("btn_nextRound")
local MainCtr = self._view:GetController("main")
showClearMainBtn.onClick:Set(function()
MainCtr.selectedIndex = 1
end)
nextRoundBtn.onClick:Set(function()
local _gamectr = ControllerManager.GetController(GameController)
_gamectr:PlayerReady()
self:DestroyWithCallback()
end)
-----------------------------------------------------------
end
function M:AddClearItem(room, data, total_data, over, niao, active_player)
local n = over + 1
local list_view1 = self._view:GetChild("player_list_1")
local list_view2 = self._view:GetChild("player_list_2")
if 0 == over or 1 == over then
table.sort(data, function(a, b) return a.seat < b.seat end)
list_view1:RemoveChildrenToPool()
for i = 1, #data do
local item = list_view1:AddItemFromPool()
self:FillItemData(room, data[i], item, active_player, niao)
end
if #data == 3 then
list_view1.lineGap = 54
elseif #data == 2 then
list_view1.lineGap = 108
end
if 1 == over then
self:FillItemData2(room, total_data, list_view2)
end
elseif 2 == over then
self:FillItemData2(room, total_data, list_view2)
end
end
function M:FillItemData(room, data, item, active_player, niao)
local _gamectr = ControllerManager.GetController(GameController)
local p = room:GetPlayerBySeat(data["seat"])
item:GetChild("playerName").text = p.self_user.nick_name
item:GetChild("lab_hp").text = "" --抓马
local user = room:GetPlayerBySeat(data["seat"]).self_user
local head = item:GetChild('head'):GetChild('n4')
ImageLoad.Load(user.head_url, head)
-- 手牌
local hand_cards = data["hand_card"]
table.sort(hand_cards, ViewUtil.HandCardSort)
local hand_list_view = item:GetChild("hand_card_list")
hand_list_view:RemoveChildrenToPool()
for i = 1, #hand_cards do
local card = hand_list_view:AddItemFromPool()
card.icon = "ui://Main_Majiang/202_" .. hand_cards[i]
end
hand_list_view.width = 52 * #hand_cards
local fz_card = p.fz_list
local fz_card_list = item:GetChild("fz_card_list")
fz_card_list.width = 157 * #fz_card * 0.8
fz_card_list:RemoveChildrenToPool()
for i = 1, #fz_card do
if fz_card[i].type == FZType.Peng then
local item = fz_card_list:AddItemFromPool("ui://Main_Majiang/clearing_fz_3")
for j = 1, 3 do
local card = item:GetChild("card_" .. j)
card.icon = "ui://Main_Majiang/202_" .. fz_card[i].card
end
elseif fz_card[i].type == FZType.Chi then
local item = fz_card_list:AddItemFromPool("ui://Main_Majiang/clearing_fz_3")
for j = 1, 3 do
local card = item:GetChild("card_" .. j)
card.icon = "ui://Main_Majiang/" .. self:GetPrefix() .. "202_" .. fz_card[i].opcard[j]
end
elseif fz_card[i].type == FZType.Gang or fz_card[i].type == FZType.Gang_An or fz_card[i].type == FZType.Gang_Peng then
local item = fz_card_list:AddItemFromPool("ui://Main_Majiang/clearing_fz_4")
for j = 1, 4 do
local card = item:GetChild("card_" .. j)
if fz_card[i].type == FZType.Gang_An and j == 4 then
card.icon = "ui://Main_Majiang/202_00"
else
card.icon = "ui://Main_Majiang/202_" .. fz_card[i].card
end
end
end
end
local huadd = data["hu_score"]
local gangadd = data["gang_score"]
local jingadd = data["jing_score"]
local total = data["round_score"]
local geng_zhuan = data["geng_zhuan"]
local sp = " "
local str = "胡:" .. huadd .. ""
if gangadd then
str = str .. sp .. "杠:" .. gangadd .. ""
end
if jingadd then
str = str .. sp .. "博精:" .. jingadd .. ""
end
item:GetChild("score1").text = str
-- local total_score = data["total_score"]
if total >= 0 then
item:GetChild("score2").text = "+" .. total
item:GetChild("score2").grayed = false
else
item:GetChild("score2").text = total
item:GetChild("score2").grayed = true
end
--计算牌型
local totalPeson = DataManager.CurrenRoom.room_config.people_num - 1
local win_list = data["win_list"]
local is_win = data["is_win"] or false
local str1 = ""
sp = ""
if is_win then
if win_list then
if DataManager.CurrenRoom.isZiMoHu then
str1 = "自摸"
else
str1 = "接炮"
end
for i = 1, #win_list do
local huName = Hu_Type_Name[win_list[i].type]
if huName then
str1 = str1 .. sp .. huName .. "x" .. win_list[i].score
end
end
str1 = str1 .. " +" .. huadd .. ""
end
else
printlog("输家============")
if DataManager.CurrenRoom.isZiMoHu then
printlog("自摸处理============")
--str1=""
if #self.WinList == 1 then
for i = 1, #self.WinList do
for j = 1, #self.WinList[i] do
local huName = Hu_Type_Name[self.WinList[i][j].type]
if huName then
if j == 1 then
str1 = str1 .. huName .. "x" .. self.WinList[i][j].score
else
str1 = str1 .. sp .. huName .. "x" .. self.WinList[i][j].score
end
end
end
end
str1 = str1 .. " " .. huadd .. ""
else
printlog("服务端自摸计算异常===>>>")
end
else
printlog("非自摸处理====>>>")
--点炮 一炮多响
local yipaoduoxiang = false
if #self.WinList > 1 then
yipaoduoxiang = true
end
if yipaoduoxiang then
printlog("一炮多响====>>>")
str = "点炮"
local allTypeList = {}
local isHas = false
for i = 1, #self.WinList do
for j = 1, #self.WinList[i] do
isHas = IsHasDictionary(self.WinList[i][j].type, allTypeList)
if isHas == false then
table.insert(allTypeList, self.WinList[i][j].type)
end
end
end
if #allTypeList > 0 then
for i = 1, #allTypeList do
local huName = Hu_Type_Name[allTypeList[i]]
if huName then
str1 = str1 .. huName .. ""
end
end
str1 = str1 .. " " .. huadd .. ""
end
else
if p.self_user.account_id == active_player and is_win == false and not data["liuju"] then
str1 = "点炮"
if #self.WinList == 1 then
for i = 1, # self.WinList do
for j = 1, #self.WinList[i] do
local huName = Hu_Type_Name[self.WinList[i][j].type]
if huName then
str1 = str1 .. sp .. huName .. "x" .. self.WinList[i][j].score
end
end
end
str1 = str1 .. " " .. huadd .. ""
else
printlog("服务端自摸计算异常===>>>")
end
end
end
end
end
--
printlog("牌型计算==>>>", str1)
if data["ming_gang_num"] > 0 then
str1 = str1 .. " 明杠x" .. data["ming_gang_num"]
end
if data["an_gang_num"] > 0 then
str1 = str1 .. " 暗杠x" .. data["an_gang_num"]
end
if data["dian_gang_num"] > 0 then
str1 = str1 .. " 点杠x" .. data["dian_gang_num"]
end
if gangadd ~= 0 then
if gangadd > 0 then
str1 = str1 .. " +" .. gangadd .. ""
else
str1 = str1 .. " " .. gangadd .. ""
end
end
if data["ma_geng_gong"] and data["ma_geng_gong"] ~= 0 then
if data["ma_geng_gong"] > 0 then
str1 = str1 .. " 马跟杠:+" .. data["ma_geng_gong"] .. ""
else
str1 = str1 .. " 马跟杠:" .. data["ma_geng_gong"] .. ""
end
end
if geng_zhuan and geng_zhuan ~= 0 then
if geng_zhuan > 0 then
str1 = str1 .. " 跟庄:+" .. geng_zhuan .. ""
else
str1 = str1 .. " 跟庄:" .. geng_zhuan .. ""
end
end
item:GetChild("score3").text = str1
item:GetChild("score4").text = str1
local paixingCtr = item:GetController("detail")
table.insert(self.PaiXingXiangQingCtrList, paixingCtr)
-------------------------
local hp_nonnegative = room:checkHpNonnegative()
item:GetController("nonnegative").selectedIndex = hp_nonnegative and 1 or 0
if hp_nonnegative then
local hp_info = data.hp_info
local ctr_hp_limit = item:GetController("hp_limit")
local hp = d2ad(hp_info.round_actual_hp)
if hp >= 0 then hp = "+" .. tostring(hp) end
item:GetChild("tex_hp").text = hp
ctr_hp_limit.selectedIndex = hp_info.upper_limit and 1 or 0
end
item:GetController("win").selectedIndex = is_win and 0 or 1
if p.self_user.account_id == active_player and is_win == false and total < 0 then
item:GetController("win").selectedIndex = 2
end
if is_win then
item:GetController("bg").selectedIndex = 1
else
item:GetController("bg").selectedIndex = 0
end
local win_card = item:GetChild("win_card")
win_card.icon = "ui://Main_Majiang/202_" .. data["win_card"]
if niao and #niao > 0 then
local currentNiaoList = self:CalculateNiao(niao, data["seat"])
if currentNiaoList and #currentNiaoList > 0 then
local lst_niao = item:GetChild("list_niao")
lst_niao:RemoveChildrenToPool()
for i = 1, #currentNiaoList do
if currentNiaoList[i].score > 0 then
local card_niao = lst_niao:AddItemFromPool()
card_niao.icon = "ui://Main_Majiang/202_" .. currentNiaoList[i].card
end
end
end
end
if p.seat == room.banker_seat then
item:GetController("bank").selectedIndex = 1
end
end
function M:CalculateNiao(niaoList, seat)
local tempNiao = {}
for i = 1, #niaoList do
if niaoList[i].seat == seat then
table.insert(tempNiao, niaoList[i])
end
end
return tempNiao
end
function M:FillItemData2(room, data, list)
-- 赋值result_info聊天室分享需要
local player_list = {}
for i = 1, #data do
player_list[i] = {}
local user = room:GetPlayerBySeat(data[i].seat).self_user
player_list[i].id = user.account_id
player_list[i].hp_info = data[i].hp_info
player_list[i].score = data[i].total_score
player_list[i].house = room.owner_id == player_list[i].id and 1 or 0
player_list[i].nick = user.nick_name
player_list[i].head_url = user.head_url
local settle_log = data[i].settle_log
player_list[i].param = {}
player_list[i].param[1] = {}
player_list[i].param[1].key = "自摸次数:"
player_list[i].param[1].value = tostring(data[i].settle_log.zimo)
player_list[i].param[2] = {}
player_list[i].param[2].key = "接炮次数:"
player_list[i].param[2].value = tostring(data[i].settle_log.jie_pao)
player_list[i].param[3] = {}
player_list[i].param[3].key = "点炮次数:"
player_list[i].param[3].value = tostring(data[i].settle_log.dian_pao)
player_list[i].param[4] = {}
player_list[i].param[4].key = "暗杠次数:"
player_list[i].param[4].value = tostring(data[i].settle_log.an_kong)
player_list[i].param[5] = {}
player_list[i].param[5].key = "明杠次数:"
player_list[i].param[5].value = tostring(data[i].settle_log.ming_kong)
end
local round = room.room_config.round
self:GenerateRoomResultInfo(round, room.room_config:GetGameName(), room.room_id, room.create_time, player_list)
local big_result = self._view:GetChild("big_result")
big_result:GetChild("txt_room_info").text = string.format("%s 房号%s 局%s/%s", os.date("%Y/%m/%d", os.time()),
room.room_id, room.curren_round, room.room_config.round)
local lst_p = big_result:GetChild("player_list")
if #player_list == 3 then
lst_p.columnGap = 108
elseif #player_list == 2 then
lst_p.columnGap = 208
end
self:InitBigResult(room, 30)
local show_detail = room.hpOnOff == 1
for i = 1, lst_p.numChildren do
local com_p = lst_p:GetChildAt(i - 1)
com_p:GetController("jsicon").selectedIndex = i - 1
local list_param = com_p:GetChild("list_param")
for j = 1, list_param.numChildren do
local tem = list_param:GetChildAt(j - 1)
tem:GetChild("txt_value").textFormat.size = 30
end
if show_detail then
local score = 0
if com_p:GetController("pn").selectedIndex == 0 then
score = com_p:GetChild("txt_navigate").text
else
score = com_p:GetChild("txt_positive").text
end
score = score / room.score_times
com_p:GetChild("tex_detail_score").text = string.format("%s × %s倍", score, room.score_times)
end
end
if room.group_id ~= 0 then
big_result:GetController("group").selectedIndex = 1
end
DataManager.CurrenRoom = nil
end
function M:LoadHead(p, room)
local btn_head = self._view:GetChild("btn_head")
for i = 1, #room.player_list do
local player = room.player_list[i]
if p.seat == player.seat and player.self_user.head_url ~= "" then
ImageLoad.Load(player.self_user.head_url, btn_head.icon)
end
end
end
local prefix
function M:GetPrefix()
-- if not prefix then
prefix = get_majiang_prefix(10)
-- end
return prefix
end
function M:DestroyWithCallback()
if self._callback then
self._callback()
end
self:Destroy()
end
return M

View File

@ -306,7 +306,7 @@ end
function M:OneventResult1(evt_data) function M:OneventResult1(evt_data)
local over = evt_data.type local over = evt_data.type
printlog("OneventResult1") print("OneventResult1")
pt(evt_data) pt(evt_data)
--0小结算 1小大结算 2大结算 --0小结算 1小大结算 2大结算
self._room._reload_flag = false self._room._reload_flag = false

View File

@ -174,9 +174,9 @@ end
function M:LoadConfigToDetail(data) function M:LoadConfigToDetail(data)
local configData = json.decode(data) local configData = json.decode(data)
local returnString = string.format("人数%s人%s%s,%s", configData.maxPlayers, local returnString = string.format("人数%s人,%s,%s,%s", configData.maxPlayers,
configData.zimo and ",只能自摸" or ",自摸可点炮", configData.zimo and "只能自摸" or "自摸可点炮",
configData.tuoguan and string.format(",%d秒后自动托管", configData.tuoguan_active_time) or "不能托管", configData.tuoguan and string.format("%d秒后自动托管", configData.tuoguan_active_time) or "不能托管",
configData.jingbibo and "有精必博" or "有精可胡") configData.jingbibo and "有精必博" or "有精可胡")
return returnString return returnString
end end

View File

@ -1,7 +1,7 @@
local MJPlayerSelfCardInfoView = import(".MJPlayerSelfCardInfoView") local MJPlayerSelfCardInfoView = import(".MJPlayerSelfCardInfoView")
local MJPlayerCardInfoView = require("main.majiang.MJPlayerCardInfoView") local MJPlayerCardInfoView = require("main.majiang.MJPlayerCardInfoView")
local MJMainView = require("main.majiang.MJMainView") local MJMainView = require("main.majiang.MJMainView")
local EXClearingView = import(".EXClearingView_JiangXi") local EXClearingView = import(".EXClearingView")
local TX_GameEvent = import(".GameEvent") local TX_GameEvent = import(".GameEvent")
local HuTipView = import("main.majiang.HuTipView") local HuTipView = import("main.majiang.HuTipView")
local SettingView = import(".EXSettingView") local SettingView = import(".EXSettingView")
@ -473,7 +473,7 @@ function M:EventInit()
-- info:UpdateScore() -- info:UpdateScore()
info._view:GetChild("zhanji").visible = true info._view:GetChild("zhanji").visible = true
local num = data[i].hp_info.total_hp local num = data[i].hp_info.total_hp
if num > 0 then if num >= 0 then
info._view:GetController("text_color").selectedIndex = 0 info._view:GetController("text_color").selectedIndex = 0
info._view:GetChild("text_jifen").text = "+" .. d2ad(num) info._view:GetChild("text_jifen").text = "+" .. d2ad(num)
else else

View File

@ -186,7 +186,7 @@ local function run_test(testname, func, input, should_work, output)
if status ~= nil then if status ~= nil then
name = name .. statusmap[status] name = name .. statusmap[status]
end end
-- print(("[%s] %s"):format(name, serialise_value(value, false))) print(("[%s] %s"):format(name, serialise_value(value, false)))
end end
local result = { pcall(func, unpack(input)) } local result = { pcall(func, unpack(input)) }
@ -200,7 +200,7 @@ local function run_test(testname, func, input, should_work, output)
test_count_total = test_count_total + 1 test_count_total = test_count_total + 1
local teststatus = { [true] = "PASS", [false] = "FAIL" } local teststatus = { [true] = "PASS", [false] = "FAIL" }
-- print(("==> Test [%d] %s: %s"):format(test_count_total, testname, print(("==> Test [%d] %s: %s"):format(test_count_total, testname,
teststatus[correct])) teststatus[correct]))
status_line("Input", nil, input) status_line("Input", nil, input)
@ -208,7 +208,7 @@ local function run_test(testname, func, input, should_work, output)
status_line("Expected", should_work, output) status_line("Expected", should_work, output)
end end
status_line("Received", success, result) status_line("Received", success, result)
-- print() print()
return correct, result return correct, result
end end
@ -216,11 +216,11 @@ end
local function run_test_group(tests) local function run_test_group(tests)
local function run_helper(name, func, input) local function run_helper(name, func, input)
if type(name) == "string" and #name > 0 then if type(name) == "string" and #name > 0 then
-- print("==> " .. name) print("==> " .. name)
end end
-- Not a protected call, these functions should never generate errors. -- Not a protected call, these functions should never generate errors.
func(unpack(input or {})) func(unpack(input or {}))
-- print() print()
end end
for _, v in ipairs(tests) do for _, v in ipairs(tests) do

View File

@ -146,15 +146,15 @@ function _event:Dump()
for _, v in ilist(self.list) do for _, v in ilist(self.list) do
if v.obj then if v.obj then
-- print("update function:", v.func, "object name:", v.obj.name) print("update function:", v.func, "object name:", v.obj.name)
else else
-- print("update function: ", v.func) print("update function: ", v.func)
end end
count = count + 1 count = count + 1
end end
-- print("all function is:", count) print("all function is:", count)
end end
_event.__call = function(self, ...) _event.__call = function(self, ...)
@ -165,7 +165,6 @@ _event.__call = function(self, ...)
for i, f in ilist(_list) do for i, f in ilist(_list) do
self.current = i self.current = i
local flag, msg = f(...) local flag, msg = f(...)
if not flag then if not flag then
_list:remove(i) _list:remove(i)
self.lock = false self.lock = false

View File

@ -11,7 +11,7 @@
-- --
-- Example usage: -- Example usage:
-- --
-- luajit -jbc -e 'local x=0; for i=1,1e6 do x=x+i end; -- print(x)' -- luajit -jbc -e 'local x=0; for i=1,1e6 do x=x+i end; print(x)'
-- luajit -jbc=- foo.lua -- luajit -jbc=- foo.lua
-- luajit -jbc=foo.list foo.lua -- luajit -jbc=foo.list foo.lua
-- --
@ -24,10 +24,10 @@
-- --
-- local bc = require("jit.bc") -- local bc = require("jit.bc")
-- --
-- local function foo() -- print("hello") end -- local function foo() print("hello") end
-- --
-- bc.dump(foo) --> -- BYTECODE -- [...] -- bc.dump(foo) --> -- BYTECODE -- [...]
-- -- print(bc.line(foo, 2)) --> 0002 KSTR 1 1 ; "hello" -- print(bc.line(foo, 2)) --> 0002 KSTR 1 1 ; "hello"
-- --
-- local out = { -- local out = {
-- -- Do something with each line: -- -- Do something with each line:
@ -55,14 +55,10 @@ local stdout, stderr = io.stdout, io.stderr
------------------------------------------------------------------------------ ------------------------------------------------------------------------------
local function ctlsub(c) local function ctlsub(c)
if c == "\n" then if c == "\n" then return "\\n"
return "\\n" elseif c == "\r" then return "\\r"
elseif c == "\r" then elseif c == "\t" then return "\\t"
return "\\r" else return format("\\%03d", byte(c))
elseif c == "\t" then
return "\\t"
else
return format("\\%03d", byte(c))
end end
end end
@ -70,41 +66,41 @@ end
local function bcline(func, pc, prefix) local function bcline(func, pc, prefix)
local ins, m = funcbc(func, pc) local ins, m = funcbc(func, pc)
if not ins then return end if not ins then return end
local ma, mb, mc = band(m, 7), band(m, 15 * 8), band(m, 15 * 128) local ma, mb, mc = band(m, 7), band(m, 15*8), band(m, 15*128)
local a = band(shr(ins, 8), 0xff) local a = band(shr(ins, 8), 0xff)
local oidx = 6 * band(ins, 0xff) local oidx = 6*band(ins, 0xff)
local op = sub(bcnames, oidx + 1, oidx + 6) local op = sub(bcnames, oidx+1, oidx+6)
local s = format("%04d %s %-6s %3s ", local s = format("%04d %s %-6s %3s ",
pc, prefix or " ", op, ma == 0 and "" or a) pc, prefix or " ", op, ma == 0 and "" or a)
local d = shr(ins, 16) local d = shr(ins, 16)
if mc == 13 * 128 then -- BCMjump if mc == 13*128 then -- BCMjump
return format("%s=> %04d\n", s, pc + d - 0x7fff) return format("%s=> %04d\n", s, pc+d-0x7fff)
end end
if mb ~= 0 then if mb ~= 0 then
d = band(d, 0xff) d = band(d, 0xff)
elseif mc == 0 then elseif mc == 0 then
return s .. "\n" return s.."\n"
end end
local kc local kc
if mc == 10 * 128 then -- BCMstr if mc == 10*128 then -- BCMstr
kc = funck(func, -d - 1) kc = funck(func, -d-1)
kc = format(#kc > 40 and '"%.40s"~' or '"%s"', gsub(kc, "%c", ctlsub)) kc = format(#kc > 40 and '"%.40s"~' or '"%s"', gsub(kc, "%c", ctlsub))
elseif mc == 9 * 128 then -- BCMnum elseif mc == 9*128 then -- BCMnum
kc = funck(func, d) kc = funck(func, d)
if op == "TSETM " then kc = kc - 2 ^ 52 end if op == "TSETM " then kc = kc - 2^52 end
elseif mc == 12 * 128 then -- BCMfunc elseif mc == 12*128 then -- BCMfunc
local fi = funcinfo(funck(func, -d - 1)) local fi = funcinfo(funck(func, -d-1))
if fi.ffid then if fi.ffid then
kc = vmdef.ffnames[fi.ffid] kc = vmdef.ffnames[fi.ffid]
else else
kc = fi.loc kc = fi.loc
end end
elseif mc == 5 * 128 then -- BCMuv elseif mc == 5*128 then -- BCMuv
kc = funcuvname(func, d) kc = funcuvname(func, d)
end end
if ma == 5 then -- BCMuv if ma == 5 then -- BCMuv
local ka = funcuvname(func, a) local ka = funcuvname(func, a)
if kc then kc = ka .. " ; " .. kc else kc = ka end if kc then kc = ka.." ; "..kc else kc = ka end
end end
if mb ~= 0 then if mb ~= 0 then
local b = shr(ins, 24) local b = shr(ins, 24)
@ -112,17 +108,17 @@ local function bcline(func, pc, prefix)
return format("%s%3d %3d\n", s, b, d) return format("%s%3d %3d\n", s, b, d)
end end
if kc then return format("%s%3d ; %s\n", s, d, kc) end if kc then return format("%s%3d ; %s\n", s, d, kc) end
if mc == 7 * 128 and d > 32767 then d = d - 65536 end -- BCMlits if mc == 7*128 and d > 32767 then d = d - 65536 end -- BCMlits
return format("%s%3d\n", s, d) return format("%s%3d\n", s, d)
end end
-- Collect branch targets of a function. -- Collect branch targets of a function.
local function bctargets(func) local function bctargets(func)
local target = {} local target = {}
for pc = 1, 1000000000 do for pc=1,1000000000 do
local ins, m = funcbc(func, pc) local ins, m = funcbc(func, pc)
if not ins then break end if not ins then break end
if band(m, 15 * 128) == 13 * 128 then target[pc + shr(ins, 16) - 0x7fff] = true end if band(m, 15*128) == 13*128 then target[pc+shr(ins, 16)-0x7fff] = true end
end end
return target return target
end end
@ -132,7 +128,7 @@ local function bcdump(func, out, all)
if not out then out = stdout end if not out then out = stdout end
local fi = funcinfo(func) local fi = funcinfo(func)
if all and fi.children then if all and fi.children then
for n = -1, -1000000000, -1 do for n=-1,-1000000000,-1 do
local k = funck(func, n) local k = funck(func, n)
if not k then break end if not k then break end
if type(k) == "proto" then bcdump(k, out, true) end if type(k) == "proto" then bcdump(k, out, true) end
@ -140,7 +136,7 @@ local function bcdump(func, out, all)
end end
out:write(format("-- BYTECODE -- %s-%d\n", fi.loc, fi.lastlinedefined)) out:write(format("-- BYTECODE -- %s-%d\n", fi.loc, fi.lastlinedefined))
local target = bctargets(func) local target = bctargets(func)
for pc = 1, 1000000000 do for pc=1,1000000000 do
local s = bcline(func, pc, target[pc] and "=>") local s = bcline(func, pc, target[pc] and "=>")
if not s then break end if not s then break end
out:write(s) out:write(s)
@ -191,3 +187,4 @@ return {
off = bclistoff, off = bclistoff,
start = bcliston -- For -j command line option. start = bcliston -- For -j command line option.
} }

View File

@ -10,7 +10,7 @@
-- --
-- Example usage: -- Example usage:
-- --
-- luajit -jdump -e "local x=0; for i=1,1e6 do x=x+i end; -- print(x)" -- luajit -jdump -e "local x=0; for i=1,1e6 do x=x+i end; print(x)"
-- luajit -jdump=im -e "for i=1,1000 do for j=1,1000 do end end" | less -R -- luajit -jdump=im -e "for i=1,1000 do for j=1,1000 do end end" | less -R
-- luajit -jdump=is myapp.lua | less -R -- luajit -jdump=is myapp.lua | less -R
-- luajit -jdump=-b myapp.lua -- luajit -jdump=-b myapp.lua
@ -28,15 +28,15 @@
-- --
-- The following dump features are available (* marks the default): -- The following dump features are available (* marks the default):
-- --
-- * t -- print a line for each started, ended or aborted trace (see also -jv). -- * t Print a line for each started, ended or aborted trace (see also -jv).
-- * b Dump the traced bytecode. -- * b Dump the traced bytecode.
-- * i Dump the IR (intermediate representation). -- * i Dump the IR (intermediate representation).
-- r Augment the IR with register/stack slots. -- r Augment the IR with register/stack slots.
-- s Dump the snapshot map. -- s Dump the snapshot map.
-- * m Dump the generated machine code. -- * m Dump the generated machine code.
-- x -- print each taken trace exit. -- x Print each taken trace exit.
-- X -- print each taken trace exit and the contents of all registers. -- X Print each taken trace exit and the contents of all registers.
-- a -- print the IR of aborted traces, too. -- a Print the IR of aborted traces, too.
-- --
-- The output format can be set with the following characters: -- The output format can be set with the following characters:
-- --
@ -89,9 +89,9 @@ local function fillsymtab_tr(tr, nexit)
t[traceexitstub(tr, 0)] = "exit" t[traceexitstub(tr, 0)] = "exit"
return return
end end
for i = 0, nexit - 1 do for i=0,nexit-1 do
local addr = traceexitstub(tr, i) local addr = traceexitstub(tr, i)
if addr < 0 then addr = addr + 2 ^ 32 end if addr < 0 then addr = addr + 2^32 end
t[addr] = tostring(i) t[addr] = tostring(i)
end end
local addr = traceexitstub(tr, nexit) local addr = traceexitstub(tr, nexit)
@ -103,10 +103,10 @@ local function fillsymtab(tr, nexit)
local t = symtab local t = symtab
if nexitsym == 0 then if nexitsym == 0 then
local ircall = vmdef.ircall local ircall = vmdef.ircall
for i = 0, #ircall do for i=0,#ircall do
local addr = ircalladdr(i) local addr = ircalladdr(i)
if addr ~= 0 then if addr ~= 0 then
if addr < 0 then addr = addr + 2 ^ 32 end if addr < 0 then addr = addr + 2^32 end
t[addr] = ircall[i] t[addr] = ircall[i]
end end
end end
@ -114,7 +114,7 @@ local function fillsymtab(tr, nexit)
if nexitsym == 1000000 then -- Per-trace exit stubs. if nexitsym == 1000000 then -- Per-trace exit stubs.
fillsymtab_tr(tr, nexit) fillsymtab_tr(tr, nexit)
elseif nexit > nexitsym then -- Shared exit stubs. elseif nexit > nexitsym then -- Shared exit stubs.
for i = nexitsym, nexit - 1 do for i=nexitsym,nexit-1 do
local addr = traceexitstub(i) local addr = traceexitstub(i)
if addr == nil then -- Fall back to per-trace exit stubs. if addr == nil then -- Fall back to per-trace exit stubs.
fillsymtab_tr(tr, nexit) fillsymtab_tr(tr, nexit)
@ -122,7 +122,7 @@ local function fillsymtab(tr, nexit)
nexit = 1000000 nexit = 1000000
break break
end end
if addr < 0 then addr = addr + 2 ^ 32 end if addr < 0 then addr = addr + 2^32 end
t[addr] = tostring(i) t[addr] = tostring(i)
end end
nexitsym = nexit nexitsym = nexit
@ -140,18 +140,18 @@ local function dump_mcode(tr)
if not info then return end if not info then return end
local mcode, addr, loop = tracemc(tr) local mcode, addr, loop = tracemc(tr)
if not mcode then return end if not mcode then return end
if not disass then disass = require("jit.dis_" .. jit.arch) end if not disass then disass = require("jit.dis_"..jit.arch) end
if addr < 0 then addr = addr + 2 ^ 32 end if addr < 0 then addr = addr + 2^32 end
out:write("---- TRACE ", tr, " mcode ", #mcode, "\n") out:write("---- TRACE ", tr, " mcode ", #mcode, "\n")
local ctx = disass.create(mcode, addr, dumpwrite) local ctx = disass.create(mcode, addr, dumpwrite)
ctx.hexdump = 0 ctx.hexdump = 0
ctx.symtab = fillsymtab(tr, info.nexit) ctx.symtab = fillsymtab(tr, info.nexit)
if loop ~= 0 then if loop ~= 0 then
symtab[addr + loop] = "LOOP" symtab[addr+loop] = "LOOP"
ctx:disass(0, loop) ctx:disass(0, loop)
out:write("->LOOP:\n") out:write("->LOOP:\n")
ctx:disass(loop, #mcode - loop) ctx:disass(loop, #mcode-loop)
symtab[addr + loop] = nil symtab[addr+loop] = nil
else else
ctx:disass(0, #mcode) ctx:disass(0, #mcode)
end end
@ -222,11 +222,8 @@ local function colorize_ansi(s, t)
end end
local irtype_ansi = setmetatable({}, local irtype_ansi = setmetatable({},
{ { __index = function(tab, t)
__index = function(tab, t) local s = colorize_ansi(irtype_text[t], t); tab[t] = s; return s; end })
local s = colorize_ansi(irtype_text[t], t); tab[t] = s; return s;
end
})
local html_escape = { ["<"] = "&lt;", [">"] = "&gt;", ["&"] = "&amp;", } local html_escape = { ["<"] = "&lt;", [">"] = "&gt;", ["&"] = "&amp;", }
@ -236,11 +233,8 @@ local function colorize_html(s, t)
end end
local irtype_html = setmetatable({}, local irtype_html = setmetatable({},
{ { __index = function(tab, t)
__index = function(tab, t) local s = colorize_html(irtype_text[t], t); tab[t] = s; return s; end })
local s = colorize_html(irtype_text[t], t); tab[t] = s; return s;
end
})
local header_html = [[ local header_html = [[
<style type="text/css"> <style type="text/css">
@ -267,31 +261,27 @@ local colorize, irtype
-- Lookup tables to convert some literals into names. -- Lookup tables to convert some literals into names.
local litname = { local litname = {
["SLOAD "] = setmetatable({}, { ["SLOAD "] = setmetatable({}, { __index = function(t, mode)
__index = function(t, mode)
local s = "" local s = ""
if band(mode, 1) ~= 0 then s = s .. "P" end if band(mode, 1) ~= 0 then s = s.."P" end
if band(mode, 2) ~= 0 then s = s .. "F" end if band(mode, 2) ~= 0 then s = s.."F" end
if band(mode, 4) ~= 0 then s = s .. "T" end if band(mode, 4) ~= 0 then s = s.."T" end
if band(mode, 8) ~= 0 then s = s .. "C" end if band(mode, 8) ~= 0 then s = s.."C" end
if band(mode, 16) ~= 0 then s = s .. "R" end if band(mode, 16) ~= 0 then s = s.."R" end
if band(mode, 32) ~= 0 then s = s .. "I" end if band(mode, 32) ~= 0 then s = s.."I" end
t[mode] = s t[mode] = s
return s return s
end end}),
}),
["XLOAD "] = { [0] = "", "R", "V", "RV", "U", "RU", "VU", "RVU", }, ["XLOAD "] = { [0] = "", "R", "V", "RV", "U", "RU", "VU", "RVU", },
["CONV "] = setmetatable({}, { ["CONV "] = setmetatable({}, { __index = function(t, mode)
__index = function(t, mode)
local s = irtype[band(mode, 31)] local s = irtype[band(mode, 31)]
s = irtype[band(shr(mode, 5), 31)] .. "." .. s s = irtype[band(shr(mode, 5), 31)].."."..s
if band(mode, 0x800) ~= 0 then s = s .. " sext" end if band(mode, 0x800) ~= 0 then s = s.." sext" end
local c = shr(mode, 14) local c = shr(mode, 14)
if c == 2 then s = s .. " index" elseif c == 3 then s = s .. " check" end if c == 2 then s = s.." index" elseif c == 3 then s = s.." check" end
t[mode] = s t[mode] = s
return s return s
end end}),
}),
["FLOAD "] = vmdef.irfield, ["FLOAD "] = vmdef.irfield,
["FREF "] = vmdef.irfield, ["FREF "] = vmdef.irfield,
["FPMATH"] = vmdef.irfpm, ["FPMATH"] = vmdef.irfpm,
@ -300,14 +290,10 @@ local litname = {
} }
local function ctlsub(c) local function ctlsub(c)
if c == "\n" then if c == "\n" then return "\\n"
return "\\n" elseif c == "\r" then return "\\r"
elseif c == "\r" then elseif c == "\t" then return "\\t"
return "\\r" else return format("\\%03d", byte(c))
elseif c == "\t" then
return "\\t"
else
return format("\\%03d", byte(c))
end end
end end
@ -331,7 +317,7 @@ local function formatk(tr, idx, sn)
if tn == "number" then if tn == "number" then
if band(sn or 0, 0x30000) ~= 0 then if band(sn or 0, 0x30000) ~= 0 then
s = band(sn, 0x20000) ~= 0 and "contpc" or "ftsz" s = band(sn, 0x20000) ~= 0 and "contpc" or "ftsz"
elseif k == 2 ^ 52 + 2 ^ 51 then elseif k == 2^52+2^51 then
s = "bias" s = "bias"
else else
s = format(0 < k and k < 0x1p-1026 and "%+a" or "%+.14g", k) s = format(0 < k and k < 0x1p-1026 and "%+a" or "%+.14g", k)
@ -351,7 +337,7 @@ local function formatk(tr, idx, sn)
end end
elseif t == 21 then -- int64_t elseif t == 21 then -- int64_t
s = sub(tostring(k), 1, -3) s = sub(tostring(k), 1, -3)
if sub(s, 1, 1) ~= "-" then s = "+" .. s end if sub(s, 1, 1) ~= "-" then s = "+"..s end
elseif sn == 0x1057fff then -- SNAP(1, SNAP_FRAME | SNAP_NORESTORE, REF_NIL) elseif sn == 0x1057fff then -- SNAP(1, SNAP_FRAME | SNAP_NORESTORE, REF_NIL)
return "----" -- Special case for LJ_FR2 slot 1. return "----" -- Special case for LJ_FR2 slot 1.
else else
@ -366,7 +352,7 @@ end
local function printsnap(tr, snap) local function printsnap(tr, snap)
local n = 2 local n = 2
for s = 0, snap[1] - 1 do for s=0,snap[1]-1 do
local sn = snap[n] local sn = snap[n]
if shr(sn, 24) == s then if shr(sn, 24) == s then
n = n + 1 n = n + 1
@ -374,7 +360,7 @@ local function printsnap(tr, snap)
if ref < 0 then if ref < 0 then
out:write(formatk(tr, ref, sn)) out:write(formatk(tr, ref, sn))
elseif band(sn, 0x80000) ~= 0 then -- SNAP_SOFTFPNUM elseif band(sn, 0x80000) ~= 0 then -- SNAP_SOFTFPNUM
out:write(colorize(format("%04d/%04d", ref, ref + 1), 14)) out:write(colorize(format("%04d/%04d", ref, ref+1), 14))
else else
local m, ot, op1, op2 = traceir(tr, ref) local m, ot, op1, op2 = traceir(tr, ref)
out:write(colorize(format("%04d", ref), band(ot, 31))) out:write(colorize(format("%04d", ref), band(ot, 31)))
@ -390,7 +376,7 @@ end
-- Dump snapshots (not interleaved with IR). -- Dump snapshots (not interleaved with IR).
local function dump_snap(tr) local function dump_snap(tr)
out:write("---- TRACE ", tr, " snapshots\n") out:write("---- TRACE ", tr, " snapshots\n")
for i = 0, 1000000000 do for i=0,1000000000 do
local snap = tracesnap(tr, i) local snap = tracesnap(tr, i)
if not snap then break end if not snap then break end
out:write(format("#%-3d %04d [ ", i, snap[0])) out:write(format("#%-3d %04d [ ", i, snap[0]))
@ -400,12 +386,12 @@ end
-- Return a register name or stack slot for a rid/sp location. -- Return a register name or stack slot for a rid/sp location.
local function ridsp_name(ridsp, ins) local function ridsp_name(ridsp, ins)
if not disass then disass = require("jit.dis_" .. jit.arch) end if not disass then disass = require("jit.dis_"..jit.arch) end
local rid, slot = band(ridsp, 0xff), shr(ridsp, 8) local rid, slot = band(ridsp, 0xff), shr(ridsp, 8)
if rid == 253 or rid == 254 then if rid == 253 or rid == 254 then
return (slot == 0 or slot == 255) and " {sink" or format(" {%04d", ins - slot) return (slot == 0 or slot == 255) and " {sink" or format(" {%04d", ins-slot)
end end
if ridsp > 255 then return format("[%x]", slot * 4) end if ridsp > 255 then return format("[%x]", slot*4) end
if rid < 128 then return disass.regname(rid) end if rid < 128 then return disass.regname(rid) end
return "" return ""
end end
@ -434,8 +420,8 @@ local function dumpcallargs(tr, ins)
out:write(formatk(tr, ins)) out:write(formatk(tr, ins))
else else
local m, ot, op1, op2 = traceir(tr, ins) local m, ot, op1, op2 = traceir(tr, ins)
local oidx = 6 * shr(ot, 8) local oidx = 6*shr(ot, 8)
local op = sub(vmdef.irnames, oidx + 1, oidx + 6) local op = sub(vmdef.irnames, oidx+1, oidx+6)
if op == "CARG " then if op == "CARG " then
dumpcallargs(tr, op1) dumpcallargs(tr, op1)
if op2 < 0 then if op2 < 0 then
@ -463,7 +449,7 @@ local function dump_ir(tr, dumpsnap, dumpreg)
snapref = snap[0] snapref = snap[0]
snapno = 0 snapno = 0
end end
for ins = 1, nins do for ins=1,nins do
if ins >= snapref then if ins >= snapref then
if dumpreg then if dumpreg then
out:write(format(".... SNAP #%-3d [ ", snapno)) out:write(format(".... SNAP #%-3d [ ", snapno))
@ -476,8 +462,8 @@ local function dump_ir(tr, dumpsnap, dumpreg)
snapref = snap and snap[0] or 65536 snapref = snap and snap[0] or 65536
end end
local m, ot, op1, op2, ridsp = traceir(tr, ins) local m, ot, op1, op2, ridsp = traceir(tr, ins)
local oidx, t = 6 * shr(ot, 8), band(ot, 31) local oidx, t = 6*shr(ot, 8), band(ot, 31)
local op = sub(irnames, oidx + 1, oidx + 6) local op = sub(irnames, oidx+1, oidx+6)
if op == "LOOP " then if op == "LOOP " then
if dumpreg then if dumpreg then
out:write(format("%04d ------------ LOOP ------------\n", ins)) out:write(format("%04d ------------ LOOP ------------\n", ins))
@ -497,10 +483,10 @@ local function dump_ir(tr, dumpsnap, dumpreg)
(band(ot, 128) == 0 and " " or ">"), (band(ot, 128) == 0 and " " or ">"),
band(ot, 64) == 0 and " " or "+", band(ot, 64) == 0 and " " or "+",
irtype[t], op)) irtype[t], op))
local m1, m2 = band(m, 3), band(m, 3 * 4) local m1, m2 = band(m, 3), band(m, 3*4)
if sub(op, 1, 4) == "CALL" then if sub(op, 1, 4) == "CALL" then
local ctype local ctype
if m2 == 1 * 4 then -- op2 == IRMlit if m2 == 1*4 then -- op2 == IRMlit
out:write(format("%-10s (", vmdef.ircall[op2])) out:write(format("%-10s (", vmdef.ircall[op2]))
else else
ctype = dumpcallfunc(tr, op2) ctype = dumpcallfunc(tr, op2)
@ -516,8 +502,8 @@ local function dump_ir(tr, dumpsnap, dumpreg)
else else
out:write(format(m1 == 0 and "%04d" or "#%-3d", op1)) out:write(format(m1 == 0 and "%04d" or "#%-3d", op1))
end end
if m2 ~= 3 * 4 then -- op2 != IRMnone if m2 ~= 3*4 then -- op2 != IRMnone
if m2 == 1 * 4 then -- op2 == IRMlit if m2 == 1*4 then -- op2 == IRMlit
local litn = litname[op] local litn = litname[op]
if litn and litn[op2] then if litn and litn[op2] then
out:write(" ", litn[op2]) out:write(" ", litn[op2])
@ -563,11 +549,8 @@ end
-- Dump trace states. -- Dump trace states.
local function dump_trace(what, tr, func, pc, otr, oex) local function dump_trace(what, tr, func, pc, otr, oex)
if what == "stop" or (what == "abort" and dumpmode.a) then if what == "stop" or (what == "abort" and dumpmode.a) then
if dumpmode.i then if dumpmode.i then dump_ir(tr, dumpmode.s, dumpmode.r and what == "stop")
dump_ir(tr, dumpmode.s, dumpmode.r and what == "stop") elseif dumpmode.s then dump_snap(tr) end
elseif dumpmode.s then
dump_snap(tr)
end
if dumpmode.m then dump_mcode(tr) end if dumpmode.m then dump_mcode(tr) end
end end
if what == "start" then if what == "start" then
@ -609,7 +592,7 @@ local function dump_record(tr, func, pc, depth, callee)
line = bcline(func, pc, recprefix) line = bcline(func, pc, recprefix)
if dumpmode.H then line = gsub(line, "[<>&]", html_escape) end if dumpmode.H then line = gsub(line, "[<>&]", html_escape) end
else else
line = "0000 " .. recprefix .. " FUNCC \n" line = "0000 "..recprefix.." FUNCC \n"
callee = func callee = func
end end
if pc <= 0 then if pc <= 0 then
@ -618,7 +601,7 @@ local function dump_record(tr, func, pc, depth, callee)
out:write(line) out:write(line)
end end
if pc >= 0 and band(funcbc(func, pc), 0xff) < 16 then -- ORDER BC if pc >= 0 and band(funcbc(func, pc), 0xff) < 16 then -- ORDER BC
out:write(bcline(func, pc + 1, recprefix)) -- Write JMP for cond. out:write(bcline(func, pc+1, recprefix)) -- Write JMP for cond.
end end
end end
@ -628,26 +611,26 @@ end
local function dump_texit(tr, ex, ngpr, nfpr, ...) local function dump_texit(tr, ex, ngpr, nfpr, ...)
out:write("---- TRACE ", tr, " exit ", ex, "\n") out:write("---- TRACE ", tr, " exit ", ex, "\n")
if dumpmode.X then if dumpmode.X then
local regs = { ... } local regs = {...}
if jit.arch == "x64" then if jit.arch == "x64" then
for i = 1, ngpr do for i=1,ngpr do
out:write(format(" %016x", regs[i])) out:write(format(" %016x", regs[i]))
if i % 4 == 0 then out:write("\n") end if i % 4 == 0 then out:write("\n") end
end end
else else
for i = 1, ngpr do for i=1,ngpr do
out:write(" ", tohex(regs[i])) out:write(" ", tohex(regs[i]))
if i % 8 == 0 then out:write("\n") end if i % 8 == 0 then out:write("\n") end
end end
end end
if jit.arch == "mips" or jit.arch == "mipsel" then if jit.arch == "mips" or jit.arch == "mipsel" then
for i = 1, nfpr, 2 do for i=1,nfpr,2 do
out:write(format(" %+17.14g", regs[ngpr + i])) out:write(format(" %+17.14g", regs[ngpr+i]))
if i % 8 == 7 then out:write("\n") end if i % 8 == 7 then out:write("\n") end
end end
else else
for i = 1, nfpr do for i=1,nfpr do
out:write(format(" %+17.14g", regs[ngpr + i])) out:write(format(" %+17.14g", regs[ngpr+i]))
if i % 4 == 0 then out:write("\n") end if i % 4 == 0 then out:write("\n") end
end end
end end
@ -675,16 +658,14 @@ local function dumpon(opt, outfile)
local term = os.getenv("TERM") local term = os.getenv("TERM")
local colormode = (term and term:match("color") or os.getenv("COLORTERM")) and "A" or "T" local colormode = (term and term:match("color") or os.getenv("COLORTERM")) and "A" or "T"
if opt then if opt then
opt = gsub(opt, "[TAH]", function(mode) opt = gsub(opt, "[TAH]", function(mode) colormode = mode; return ""; end)
colormode = mode; return "";
end)
end end
local m = { t = true, b = true, i = true, m = true, } local m = { t=true, b=true, i=true, m=true, }
if opt and opt ~= "" then if opt and opt ~= "" then
local o = sub(opt, 1, 1) local o = sub(opt, 1, 1)
if o ~= "+" and o ~= "-" then m = {} end if o ~= "+" and o ~= "-" then m = {} end
for i = 1, #opt do m[sub(opt, i, i)] = (o ~= "-") end for i=1,#opt do m[sub(opt, i, i)] = (o ~= "-") end
end end
dumpmode = m dumpmode = m
@ -728,3 +709,4 @@ return {
off = dumpoff, off = dumpoff,
start = dumpon -- For -j command line option. start = dumpon -- For -j command line option.
} }

View File

@ -99,31 +99,31 @@ end
local function dump_trace(what, tr, func, pc, otr, oex) local function dump_trace(what, tr, func, pc, otr, oex)
if what == "start" then if what == "start" then
startloc = fmtfunc(func, pc) startloc = fmtfunc(func, pc)
startex = otr and "(" .. otr .. "/" .. (oex == -1 and "stitch" or oex) .. ") " or "" startex = otr and "("..otr.."/"..(oex == -1 and "stitch" or oex)..") " or ""
else else
if what == "abort" then if what == "abort" then
local loc = fmtfunc(func, pc) local loc = fmtfunc(func, pc)
if loc ~= startloc then if loc ~= startloc then
-- print(format("[TRACE --- %s%s -- %s at %s]\n", startex, startloc, fmterr(otr, oex), loc)) print(format("[TRACE --- %s%s -- %s at %s]\n", startex, startloc, fmterr(otr, oex), loc))
else else
-- print(format("[TRACE --- %s%s -- %s]\n", startex, startloc, fmterr(otr, oex))) print(format("[TRACE --- %s%s -- %s]\n", startex, startloc, fmterr(otr, oex)))
end end
elseif what == "stop" then elseif what == "stop" then
local info = traceinfo(tr) local info = traceinfo(tr)
local link, ltype = info.link, info.linktype local link, ltype = info.link, info.linktype
if ltype == "interpreter" then if ltype == "interpreter" then
-- print(format("[TRACE %3s %s%s -- fallback to interpreter]\n", tr, startex, startloc)) print(format("[TRACE %3s %s%s -- fallback to interpreter]\n", tr, startex, startloc))
elseif ltype == "stitch" then elseif ltype == "stitch" then
-- print(format("[TRACE %3s %s%s %s %s]\n", tr, startex, startloc, ltype, fmtfunc(func, pc))) print(format("[TRACE %3s %s%s %s %s]\n", tr, startex, startloc, ltype, fmtfunc(func, pc)))
elseif link == tr or link == 0 then elseif link == tr or link == 0 then
-- print(format("[TRACE %3s %s%s %s]\n", tr, startex, startloc, ltype)) print(format("[TRACE %3s %s%s %s]\n", tr, startex, startloc, ltype))
elseif ltype == "root" then elseif ltype == "root" then
-- print(format("[TRACE %3s %s%s -> %d]\n", tr, startex, startloc, link)) print(format("[TRACE %3s %s%s -> %d]\n", tr, startex, startloc, link))
else else
-- print(format("[TRACE %3s %s%s -> %d %s]\n", tr, startex, startloc, link, ltype)) print(format("[TRACE %3s %s%s -> %d %s]\n", tr, startex, startloc, link, ltype))
end end
else else
-- print(format("[TRACE %s]\n", what)) print(format("[TRACE %s]\n", what))
end end
out:flush() out:flush()
end end
@ -160,3 +160,4 @@ return {
off = dumpoff, off = dumpoff,
start = dumpon -- For -j command line option. start = dumpon -- For -j command line option.
} }

View File

@ -2,362 +2,361 @@
return { return {
bcnames = bcnames = "ISLT ISGE ISLE ISGT ISEQV ISNEV ISEQS ISNES ISEQN ISNEN ISEQP ISNEP ISTC ISFC IST ISF ISTYPEISNUM MOV NOT UNM LEN ADDVN SUBVN MULVN DIVVN MODVN ADDNV SUBNV MULNV DIVNV MODNV ADDVV SUBVV MULVV DIVVV MODVV POW CAT KSTR KCDATAKSHORTKNUM KPRI KNIL UGET USETV USETS USETN USETP UCLO FNEW TNEW TDUP GGET GSET TGETV TGETS TGETB TGETR TSETV TSETS TSETB TSETM TSETR CALLM CALL CALLMTCALLT ITERC ITERN VARG ISNEXTRETM RET RET0 RET1 FORI JFORI FORL IFORL JFORL ITERL IITERLJITERLLOOP ILOOP JLOOP JMP FUNCF IFUNCFJFUNCFFUNCV IFUNCVJFUNCVFUNCC FUNCCW",
"ISLT ISGE ISLE ISGT ISEQV ISNEV ISEQS ISNES ISEQN ISNEN ISEQP ISNEP ISTC ISFC IST ISF ISTYPEISNUM MOV NOT UNM LEN ADDVN SUBVN MULVN DIVVN MODVN ADDNV SUBNV MULNV DIVNV MODNV ADDVV SUBVV MULVV DIVVV MODVV POW CAT KSTR KCDATAKSHORTKNUM KPRI KNIL UGET USETV USETS USETN USETP UCLO FNEW TNEW TDUP GGET GSET TGETV TGETS TGETB TGETR TSETV TSETS TSETB TSETM TSETR CALLM CALL CALLMTCALLT ITERC ITERN VARG ISNEXTRETM RET RET0 RET1 FORI JFORI FORL IFORL JFORL ITERL IITERLJITERLLOOP ILOOP JLOOP JMP FUNCF IFUNCFJFUNCFFUNCV IFUNCVJFUNCVFUNCC FUNCCW",
irnames = irnames = "LT GE LE GT ULT UGE ULE UGT EQ NE ABC RETF NOP BASE PVAL GCSTEPHIOP LOOP USE PHI RENAMEPROF KPRI KINT KGC KPTR KKPTR KNULL KNUM KINT64KSLOT BNOT BSWAP BAND BOR BXOR BSHL BSHR BSAR BROL BROR ADD SUB MUL DIV MOD POW NEG ABS ATAN2 LDEXP MIN MAX FPMATHADDOV SUBOV MULOV AREF HREFK HREF NEWREFUREFO UREFC FREF STRREFLREF ALOAD HLOAD ULOAD FLOAD XLOAD SLOAD VLOAD ASTOREHSTOREUSTOREFSTOREXSTORESNEW XSNEW TNEW TDUP CNEW CNEWI BUFHDRBUFPUTBUFSTRTBAR OBAR XBAR CONV TOBIT TOSTR STRTO CALLN CALLA CALLL CALLS CALLXSCARG ",
"LT GE LE GT ULT UGE ULE UGT EQ NE ABC RETF NOP BASE PVAL GCSTEPHIOP LOOP USE PHI RENAMEPROF KPRI KINT KGC KPTR KKPTR KNULL KNUM KINT64KSLOT BNOT BSWAP BAND BOR BXOR BSHL BSHR BSAR BROL BROR ADD SUB MUL DIV MOD POW NEG ABS ATAN2 LDEXP MIN MAX FPMATHADDOV SUBOV MULOV AREF HREFK HREF NEWREFUREFO UREFC FREF STRREFLREF ALOAD HLOAD ULOAD FLOAD XLOAD SLOAD VLOAD ASTOREHSTOREUSTOREFSTOREXSTORESNEW XSNEW TNEW TDUP CNEW CNEWI BUFHDRBUFPUTBUFSTRTBAR OBAR XBAR CONV TOBIT TOSTR STRTO CALLN CALLA CALLL CALLS CALLXSCARG ",
irfpm = { [0] = "floor", "ceil", "trunc", "sqrt", "exp", "exp2", "log", "log2", "log10", "sin", "cos", "tan", "other", }, irfpm = { [0]="floor", "ceil", "trunc", "sqrt", "exp", "exp2", "log", "log2", "log10", "sin", "cos", "tan", "other", },
irfield = { [0] = "str.len", "func.env", "func.pc", "func.ffid", "thread.env", "tab.meta", "tab.array", "tab.node", "tab.asize", "tab.hmask", "tab.nomm", "udata.meta", "udata.udtype", "udata.file", "cdata.ctypeid", "cdata.ptr", "cdata.int", "cdata.int64", "cdata.int64_4", }, irfield = { [0]="str.len", "func.env", "func.pc", "func.ffid", "thread.env", "tab.meta", "tab.array", "tab.node", "tab.asize", "tab.hmask", "tab.nomm", "udata.meta", "udata.udtype", "udata.file", "cdata.ctypeid", "cdata.ptr", "cdata.int", "cdata.int64", "cdata.int64_4", },
ircall = { ircall = {
[0] = "lj_str_cmp", [0]="lj_str_cmp",
"lj_str_find", "lj_str_find",
"lj_str_new", "lj_str_new",
"lj_strscan_num", "lj_strscan_num",
"lj_strfmt_int", "lj_strfmt_int",
"lj_strfmt_num", "lj_strfmt_num",
"lj_strfmt_char", "lj_strfmt_char",
"lj_strfmt_putint", "lj_strfmt_putint",
"lj_strfmt_putnum", "lj_strfmt_putnum",
"lj_strfmt_putquoted", "lj_strfmt_putquoted",
"lj_strfmt_putfxint", "lj_strfmt_putfxint",
"lj_strfmt_putfnum_int", "lj_strfmt_putfnum_int",
"lj_strfmt_putfnum_uint", "lj_strfmt_putfnum_uint",
"lj_strfmt_putfnum", "lj_strfmt_putfnum",
"lj_strfmt_putfstr", "lj_strfmt_putfstr",
"lj_strfmt_putfchar", "lj_strfmt_putfchar",
"lj_buf_putmem", "lj_buf_putmem",
"lj_buf_putstr", "lj_buf_putstr",
"lj_buf_putchar", "lj_buf_putchar",
"lj_buf_putstr_reverse", "lj_buf_putstr_reverse",
"lj_buf_putstr_lower", "lj_buf_putstr_lower",
"lj_buf_putstr_upper", "lj_buf_putstr_upper",
"lj_buf_putstr_rep", "lj_buf_putstr_rep",
"lj_buf_puttab", "lj_buf_puttab",
"lj_buf_tostr", "lj_buf_tostr",
"lj_tab_new_ah", "lj_tab_new_ah",
"lj_tab_new1", "lj_tab_new1",
"lj_tab_dup", "lj_tab_dup",
"lj_tab_clear", "lj_tab_clear",
"lj_tab_newkey", "lj_tab_newkey",
"lj_tab_len", "lj_tab_len",
"lj_gc_step_jit", "lj_gc_step_jit",
"lj_gc_barrieruv", "lj_gc_barrieruv",
"lj_mem_newgco", "lj_mem_newgco",
"lj_math_random_step", "lj_math_random_step",
"lj_vm_modi", "lj_vm_modi",
"sinh", "sinh",
"cosh", "cosh",
"tanh", "tanh",
"fputc", "fputc",
"fwrite", "fwrite",
"fflush", "fflush",
"lj_vm_floor", "lj_vm_floor",
"lj_vm_ceil", "lj_vm_ceil",
"lj_vm_trunc", "lj_vm_trunc",
"sqrt", "sqrt",
"exp", "exp",
"lj_vm_exp2", "lj_vm_exp2",
"log", "log",
"lj_vm_log2", "lj_vm_log2",
"log10", "log10",
"sin", "sin",
"cos", "cos",
"tan", "tan",
"lj_vm_powi", "lj_vm_powi",
"pow", "pow",
"atan2", "atan2",
"ldexp", "ldexp",
"lj_vm_tobit", "lj_vm_tobit",
"softfp_add", "softfp_add",
"softfp_sub", "softfp_sub",
"softfp_mul", "softfp_mul",
"softfp_div", "softfp_div",
"softfp_cmp", "softfp_cmp",
"softfp_i2d", "softfp_i2d",
"softfp_d2i", "softfp_d2i",
"lj_vm_sfmin", "lj_vm_sfmin",
"lj_vm_sfmax", "lj_vm_sfmax",
"softfp_ui2d", "softfp_ui2d",
"softfp_f2d", "softfp_f2d",
"softfp_d2ui", "softfp_d2ui",
"softfp_d2f", "softfp_d2f",
"softfp_i2f", "softfp_i2f",
"softfp_ui2f", "softfp_ui2f",
"softfp_f2i", "softfp_f2i",
"softfp_f2ui", "softfp_f2ui",
"fp64_l2d", "fp64_l2d",
"fp64_ul2d", "fp64_ul2d",
"fp64_l2f", "fp64_l2f",
"fp64_ul2f", "fp64_ul2f",
"fp64_d2l", "fp64_d2l",
"fp64_d2ul", "fp64_d2ul",
"fp64_f2l", "fp64_f2l",
"fp64_f2ul", "fp64_f2ul",
"lj_carith_divi64", "lj_carith_divi64",
"lj_carith_divu64", "lj_carith_divu64",
"lj_carith_modi64", "lj_carith_modi64",
"lj_carith_modu64", "lj_carith_modu64",
"lj_carith_powi64", "lj_carith_powi64",
"lj_carith_powu64", "lj_carith_powu64",
"lj_cdata_newv", "lj_cdata_newv",
"lj_cdata_setfin", "lj_cdata_setfin",
"strlen", "strlen",
"memcpy", "memcpy",
"memset", "memset",
"lj_vm_errno", "lj_vm_errno",
"lj_carith_mul64", "lj_carith_mul64",
"lj_carith_shl64", "lj_carith_shl64",
"lj_carith_shr64", "lj_carith_shr64",
"lj_carith_sar64", "lj_carith_sar64",
"lj_carith_rol64", "lj_carith_rol64",
"lj_carith_ror64", "lj_carith_ror64",
}, },
traceerr = { traceerr = {
[0] = "error thrown or hook called during recording", [0]="error thrown or hook called during recording",
"trace too short", "trace too short",
"trace too long", "trace too long",
"trace too deep", "trace too deep",
"too many snapshots", "too many snapshots",
"blacklisted", "blacklisted",
"retry recording", "retry recording",
"NYI: bytecode %d", "NYI: bytecode %d",
"leaving loop in root trace", "leaving loop in root trace",
"inner loop in root trace", "inner loop in root trace",
"loop unroll limit reached", "loop unroll limit reached",
"bad argument type", "bad argument type",
"JIT compilation disabled for function", "JIT compilation disabled for function",
"call unroll limit reached", "call unroll limit reached",
"down-recursion, restarting", "down-recursion, restarting",
"NYI: unsupported variant of FastFunc %s", "NYI: unsupported variant of FastFunc %s",
"NYI: return to lower frame", "NYI: return to lower frame",
"store with nil or NaN key", "store with nil or NaN key",
"missing metamethod", "missing metamethod",
"looping index lookup", "looping index lookup",
"NYI: mixed sparse/dense table", "NYI: mixed sparse/dense table",
"symbol not in cache", "symbol not in cache",
"NYI: unsupported C type conversion", "NYI: unsupported C type conversion",
"NYI: unsupported C function type", "NYI: unsupported C function type",
"guard would always fail", "guard would always fail",
"too many PHIs", "too many PHIs",
"persistent type instability", "persistent type instability",
"failed to allocate mcode memory", "failed to allocate mcode memory",
"machine code too long", "machine code too long",
"hit mcode limit (retrying)", "hit mcode limit (retrying)",
"too many spill slots", "too many spill slots",
"inconsistent register allocation", "inconsistent register allocation",
"NYI: cannot assemble IR instruction %d", "NYI: cannot assemble IR instruction %d",
"NYI: PHI shuffling too complex", "NYI: PHI shuffling too complex",
"NYI: register coalescing too complex", "NYI: register coalescing too complex",
}, },
ffnames = { ffnames = {
[0] = "Lua", [0]="Lua",
"C", "C",
"assert", "assert",
"type", "type",
"next", "next",
"pairs", "pairs",
"ipairs_aux", "ipairs_aux",
"ipairs", "ipairs",
"getmetatable", "getmetatable",
"setmetatable", "setmetatable",
"getfenv", "getfenv",
"setfenv", "setfenv",
"rawget", "rawget",
"rawset", "rawset",
"rawequal", "rawequal",
"unpack", "unpack",
"select", "select",
"tonumber", "tonumber",
"tostring", "tostring",
"error", "error",
"pcall", "pcall",
"xpcall", "xpcall",
"loadfile", "loadfile",
"load", "load",
"loadstring", "loadstring",
"dofile", "dofile",
"gcinfo", "gcinfo",
"collectgarbage", "collectgarbage",
"newproxy", "newproxy",
"print", "print",
"coroutine.status", "coroutine.status",
"coroutine.running", "coroutine.running",
"coroutine.create", "coroutine.create",
"coroutine.yield", "coroutine.yield",
"coroutine.resume", "coroutine.resume",
"coroutine.wrap_aux", "coroutine.wrap_aux",
"coroutine.wrap", "coroutine.wrap",
"math.abs", "math.abs",
"math.floor", "math.floor",
"math.ceil", "math.ceil",
"math.sqrt", "math.sqrt",
"math.log10", "math.log10",
"math.exp", "math.exp",
"math.sin", "math.sin",
"math.cos", "math.cos",
"math.tan", "math.tan",
"math.asin", "math.asin",
"math.acos", "math.acos",
"math.atan", "math.atan",
"math.sinh", "math.sinh",
"math.cosh", "math.cosh",
"math.tanh", "math.tanh",
"math.frexp", "math.frexp",
"math.modf", "math.modf",
"math.log", "math.log",
"math.atan2", "math.atan2",
"math.pow", "math.pow",
"math.fmod", "math.fmod",
"math.ldexp", "math.ldexp",
"math.min", "math.min",
"math.max", "math.max",
"math.random", "math.random",
"math.randomseed", "math.randomseed",
"bit.tobit", "bit.tobit",
"bit.bnot", "bit.bnot",
"bit.bswap", "bit.bswap",
"bit.lshift", "bit.lshift",
"bit.rshift", "bit.rshift",
"bit.arshift", "bit.arshift",
"bit.rol", "bit.rol",
"bit.ror", "bit.ror",
"bit.band", "bit.band",
"bit.bor", "bit.bor",
"bit.bxor", "bit.bxor",
"bit.tohex", "bit.tohex",
"string.byte", "string.byte",
"string.char", "string.char",
"string.sub", "string.sub",
"string.rep", "string.rep",
"string.reverse", "string.reverse",
"string.lower", "string.lower",
"string.upper", "string.upper",
"string.dump", "string.dump",
"string.find", "string.find",
"string.match", "string.match",
"string.gmatch_aux", "string.gmatch_aux",
"string.gmatch", "string.gmatch",
"string.gsub", "string.gsub",
"string.format", "string.format",
"table.maxn", "table.maxn",
"table.insert", "table.insert",
"table.concat", "table.concat",
"table.sort", "table.sort",
"table.new", "table.new",
"table.clear", "table.clear",
"io.method.close", "io.method.close",
"io.method.read", "io.method.read",
"io.method.write", "io.method.write",
"io.method.flush", "io.method.flush",
"io.method.seek", "io.method.seek",
"io.method.setvbuf", "io.method.setvbuf",
"io.method.lines", "io.method.lines",
"io.method.__gc", "io.method.__gc",
"io.method.__tostring", "io.method.__tostring",
"io.open", "io.open",
"io.popen", "io.popen",
"io.tmpfile", "io.tmpfile",
"io.close", "io.close",
"io.read", "io.read",
"io.write", "io.write",
"io.flush", "io.flush",
"io.input", "io.input",
"io.output", "io.output",
"io.lines", "io.lines",
"io.type", "io.type",
"os.execute", "os.execute",
"os.remove", "os.remove",
"os.rename", "os.rename",
"os.tmpname", "os.tmpname",
"os.getenv", "os.getenv",
"os.exit", "os.exit",
"os.clock", "os.clock",
"os.date", "os.date",
"os.time", "os.time",
"os.difftime", "os.difftime",
"os.setlocale", "os.setlocale",
"debug.getregistry", "debug.getregistry",
"debug.getmetatable", "debug.getmetatable",
"debug.setmetatable", "debug.setmetatable",
"debug.getfenv", "debug.getfenv",
"debug.setfenv", "debug.setfenv",
"debug.getinfo", "debug.getinfo",
"debug.getlocal", "debug.getlocal",
"debug.setlocal", "debug.setlocal",
"debug.getupvalue", "debug.getupvalue",
"debug.setupvalue", "debug.setupvalue",
"debug.upvalueid", "debug.upvalueid",
"debug.upvaluejoin", "debug.upvaluejoin",
"debug.sethook", "debug.sethook",
"debug.gethook", "debug.gethook",
"debug.debug", "debug.debug",
"debug.traceback", "debug.traceback",
"jit.on", "jit.on",
"jit.off", "jit.off",
"jit.flush", "jit.flush",
"jit.status", "jit.status",
"jit.attach", "jit.attach",
"jit.util.funcinfo", "jit.util.funcinfo",
"jit.util.funcbc", "jit.util.funcbc",
"jit.util.funck", "jit.util.funck",
"jit.util.funcuvname", "jit.util.funcuvname",
"jit.util.traceinfo", "jit.util.traceinfo",
"jit.util.traceir", "jit.util.traceir",
"jit.util.tracek", "jit.util.tracek",
"jit.util.tracesnap", "jit.util.tracesnap",
"jit.util.tracemc", "jit.util.tracemc",
"jit.util.traceexitstub", "jit.util.traceexitstub",
"jit.util.ircalladdr", "jit.util.ircalladdr",
"jit.opt.start", "jit.opt.start",
"jit.profile.start", "jit.profile.start",
"jit.profile.stop", "jit.profile.stop",
"jit.profile.dumpstack", "jit.profile.dumpstack",
"ffi.meta.__index", "ffi.meta.__index",
"ffi.meta.__newindex", "ffi.meta.__newindex",
"ffi.meta.__eq", "ffi.meta.__eq",
"ffi.meta.__len", "ffi.meta.__len",
"ffi.meta.__lt", "ffi.meta.__lt",
"ffi.meta.__le", "ffi.meta.__le",
"ffi.meta.__concat", "ffi.meta.__concat",
"ffi.meta.__call", "ffi.meta.__call",
"ffi.meta.__add", "ffi.meta.__add",
"ffi.meta.__sub", "ffi.meta.__sub",
"ffi.meta.__mul", "ffi.meta.__mul",
"ffi.meta.__div", "ffi.meta.__div",
"ffi.meta.__mod", "ffi.meta.__mod",
"ffi.meta.__pow", "ffi.meta.__pow",
"ffi.meta.__unm", "ffi.meta.__unm",
"ffi.meta.__tostring", "ffi.meta.__tostring",
"ffi.meta.__pairs", "ffi.meta.__pairs",
"ffi.meta.__ipairs", "ffi.meta.__ipairs",
"ffi.clib.__index", "ffi.clib.__index",
"ffi.clib.__newindex", "ffi.clib.__newindex",
"ffi.clib.__gc", "ffi.clib.__gc",
"ffi.callback.free", "ffi.callback.free",
"ffi.callback.set", "ffi.callback.set",
"ffi.cdef", "ffi.cdef",
"ffi.new", "ffi.new",
"ffi.cast", "ffi.cast",
"ffi.typeof", "ffi.typeof",
"ffi.typeinfo", "ffi.typeinfo",
"ffi.istype", "ffi.istype",
"ffi.sizeof", "ffi.sizeof",
"ffi.alignof", "ffi.alignof",
"ffi.offsetof", "ffi.offsetof",
"ffi.errno", "ffi.errno",
"ffi.string", "ffi.string",
"ffi.copy", "ffi.copy",
"ffi.fill", "ffi.fill",
"ffi.abi", "ffi.abi",
"ffi.metatype", "ffi.metatype",
"ffi.gc", "ffi.gc",
"ffi.load", "ffi.load",
}, },
} }

View File

@ -14,11 +14,11 @@
-- ... -- ...
-- zone("A*") -- zone("A*")
-- ... -- ...
-- -- print(zone:get()) --> "A*" -- print(zone:get()) --> "A*"
-- ... -- ...
-- zone() -- zone()
-- ... -- ...
-- -- print(zone:get()) --> "AI" -- print(zone:get()) --> "AI"
-- ... -- ...
-- zone() -- zone()
-- --
@ -28,7 +28,7 @@ local remove = table.remove
return setmetatable({ return setmetatable({
flush = function(t) flush = function(t)
for i = #t, 1, -1 do t[i] = nil end for i=#t,1,-1 do t[i] = nil end
end, end,
get = function(t) get = function(t)
return t[#t] return t[#t]
@ -36,9 +36,10 @@ return setmetatable({
}, { }, {
__call = function(t, zone) __call = function(t, zone)
if zone then if zone then
t[#t + 1] = zone t[#t+1] = zone
else else
return (assert(remove(t), "empty zone stack")) return (assert(remove(t), "empty zone stack"))
end end
end end
}) })

View File

@ -3,7 +3,7 @@
-- imported functions and modules -- imported functions and modules
local tonumber, type, print, error = tonumber, type, print, error local tonumber, type, print, error = tonumber, type, print, error
local setmetatable = setmetatable local setmetatable = setmetatable
local m = require "lpeg" local m = require"lpeg"
-- 'm' will be used to parse expressions, and 'mm' will be used to -- 'm' will be used to parse expressions, and 'mm' will be used to
-- create expressions; that is, 're' runs on 'm', creating patterns -- create expressions; that is, 're' runs on 'm', creating patterns
@ -24,7 +24,7 @@ local any = m.P(1)
-- Pre-defined names -- Pre-defined names
local Predef = { nl = m.P "\n" } local Predef = { nl = m.P"\n" }
local mem local mem
@ -32,7 +32,7 @@ local fmem
local gmem local gmem
local function updatelocale() local function updatelocale ()
mm.locale(Predef) mm.locale(Predef)
Predef.a = Predef.alpha Predef.a = Predef.alpha
Predef.c = Predef.cntrl Predef.c = Predef.cntrl
@ -57,7 +57,7 @@ local function updatelocale()
mem = {} -- restart memoization mem = {} -- restart memoization
fmem = {} fmem = {}
gmem = {} gmem = {}
local mt = { __mode = "v" } local mt = {__mode = "v"}
setmetatable(mem, mt) setmetatable(mem, mt)
setmetatable(fmem, mt) setmetatable(fmem, mt)
setmetatable(gmem, mt) setmetatable(gmem, mt)
@ -68,49 +68,47 @@ updatelocale()
local I = m.P(function(s, i) local I = m.P(function (s,i) print(i, s:sub(1, i-1)); return i end)
print(i, s:sub(1, i - 1)); return i
end)
local function getdef(id, defs) local function getdef (id, defs)
local c = defs and defs[id] local c = defs and defs[id]
if not c then error("undefined name: " .. id) end if not c then error("undefined name: " .. id) end
return c return c
end end
local function patt_error(s, i) local function patt_error (s, i)
local msg = (#s < i + 20) and s:sub(i) local msg = (#s < i + 20) and s:sub(i)
or s:sub(i, i + 20) .. "..." or s:sub(i,i+20) .. "..."
msg = ("pattern error near '%s'"):format(msg) msg = ("pattern error near '%s'"):format(msg)
error(msg, 2) error(msg, 2)
end end
local function mult(p, n) local function mult (p, n)
local np = mm.P(true) local np = mm.P(true)
while n >= 1 do while n >= 1 do
if n % 2 >= 1 then np = np * p end if n%2 >= 1 then np = np * p end
p = p * p p = p * p
n = n / 2 n = n/2
end end
return np return np
end end
local function equalcap(s, i, c) local function equalcap (s, i, c)
if type(c) ~= "string" then return nil end if type(c) ~= "string" then return nil end
local e = #c + i local e = #c + i
if s:sub(i, e - 1) == c then return e else return nil end if s:sub(i, e - 1) == c then return e else return nil end
end end
local S = (Predef.space + "--" * (any - Predef.nl) ^ 0) ^ 0 local S = (Predef.space + "--" * (any - Predef.nl)^0)^0
local name = m.R("AZ", "az", "__") * m.R("AZ", "az", "__", "09") ^ 0 local name = m.R("AZ", "az", "__") * m.R("AZ", "az", "__", "09")^0
local arrow = S * "<-" local arrow = S * "<-"
local seq_follow = m.P "/" + ")" + "}" + ":}" + "~}" + "|}" + (name * arrow) + -1 local seq_follow = m.P"/" + ")" + "}" + ":}" + "~}" + "|}" + (name * arrow) + -1
name = m.C(name) name = m.C(name)
@ -118,102 +116,101 @@ name = m.C(name)
-- a defined name only have meaning in a given environment -- a defined name only have meaning in a given environment
local Def = name * m.Carg(1) local Def = name * m.Carg(1)
local num = m.C(m.R "09" ^ 1) * S / tonumber local num = m.C(m.R"09"^1) * S / tonumber
local String = "'" * m.C((any - "'") ^ 0) * "'" + local String = "'" * m.C((any - "'")^0) * "'" +
'"' * m.C((any - '"') ^ 0) * '"' '"' * m.C((any - '"')^0) * '"'
local defined = "%" * Def / function(c, Defs) local defined = "%" * Def / function (c,Defs)
local cat = Defs and Defs[c] or Predef[c] local cat = Defs and Defs[c] or Predef[c]
if not cat then error("name '" .. c .. "' undefined") end if not cat then error ("name '" .. c .. "' undefined") end
return cat return cat
end end
local Range = m.Cs(any * (m.P "-" / "") * (any - "]")) / mm.R local Range = m.Cs(any * (m.P"-"/"") * (any - "]")) / mm.R
local item = defined + Range + m.C(any) local item = defined + Range + m.C(any)
local Class = local Class =
"[" "["
* (m.C(m.P "^" ^ -1)) -- optional complement symbol * (m.C(m.P"^"^-1)) -- optional complement symbol
* m.Cf(item * (item - "]") ^ 0, mt.__add) / * m.Cf(item * (item - "]")^0, mt.__add) /
function(c, p) return c == "^" and any - p or p end function (c, p) return c == "^" and any - p or p end
* "]" * "]"
local function adddef(t, k, exp) local function adddef (t, k, exp)
if t[k] then if t[k] then
error("'" .. k .. "' already defined as a rule") error("'"..k.."' already defined as a rule")
else else
t[k] = exp t[k] = exp
end end
return t return t
end end
local function firstdef(n, r) return adddef({ n }, n, r) end local function firstdef (n, r) return adddef({n}, n, r) end
local function NT(n, b) local function NT (n, b)
if not b then if not b then
error("rule '" .. n .. "' used outside a grammar") error("rule '"..n.."' used outside a grammar")
else else return mm.V(n)
return mm.V(n)
end end
end end
local exp = m.P { "Exp", local exp = m.P{ "Exp",
Exp = S * (m.V "Grammar" Exp = S * ( m.V"Grammar"
+ m.Cf(m.V "Seq" * ("/" * S * m.V "Seq") ^ 0, mt.__add)), + m.Cf(m.V"Seq" * ("/" * S * m.V"Seq")^0, mt.__add) );
Seq = m.Cf(m.Cc(m.P "") * m.V "Prefix" ^ 0, mt.__mul) Seq = m.Cf(m.Cc(m.P"") * m.V"Prefix"^0 , mt.__mul)
* (#seq_follow + patt_error), * (#seq_follow + patt_error);
Prefix = "&" * S * m.V "Prefix" / mt.__len Prefix = "&" * S * m.V"Prefix" / mt.__len
+ "!" * S * m.V "Prefix" / mt.__unm + "!" * S * m.V"Prefix" / mt.__unm
+ m.V "Suffix", + m.V"Suffix";
Suffix = m.Cf(m.V "Primary" * S * Suffix = m.Cf(m.V"Primary" * S *
((m.P "+" * m.Cc(1, mt.__pow) ( ( m.P"+" * m.Cc(1, mt.__pow)
+ m.P "*" * m.Cc(0, mt.__pow) + m.P"*" * m.Cc(0, mt.__pow)
+ m.P "?" * m.Cc(-1, mt.__pow) + m.P"?" * m.Cc(-1, mt.__pow)
+ "^" * (m.Cg(num * m.Cc(mult)) + "^" * ( m.Cg(num * m.Cc(mult))
+ m.Cg(m.C(m.S "+-" * m.R "09" ^ 1) * m.Cc(mt.__pow)) + m.Cg(m.C(m.S"+-" * m.R"09"^1) * m.Cc(mt.__pow))
) )
+ "->" * S * (m.Cg((String + num) * m.Cc(mt.__div)) + "->" * S * ( m.Cg((String + num) * m.Cc(mt.__div))
+ m.P "{}" * m.Cc(nil, m.Ct) + m.P"{}" * m.Cc(nil, m.Ct)
+ m.Cg(Def / getdef * m.Cc(mt.__div)) + m.Cg(Def / getdef * m.Cc(mt.__div))
) )
+ "=>" * S * m.Cg(Def / getdef * m.Cc(m.Cmt)) + "=>" * S * m.Cg(Def / getdef * m.Cc(m.Cmt))
) * S ) * S
) ^ 0, function(a, b, f) return f(a, b) end), )^0, function (a,b,f) return f(a,b) end );
Primary = "(" * m.V "Exp" * ")" Primary = "(" * m.V"Exp" * ")"
+ String / mm.P + String / mm.P
+ Class + Class
+ defined + defined
+ "{:" * (name * ":" + m.Cc(nil)) * m.V "Exp" * ":}" / + "{:" * (name * ":" + m.Cc(nil)) * m.V"Exp" * ":}" /
function(n, p) return mm.Cg(p, n) end function (n, p) return mm.Cg(p, n) end
+ "=" * name / function(n) return mm.Cmt(mm.Cb(n), equalcap) end + "=" * name / function (n) return mm.Cmt(mm.Cb(n), equalcap) end
+ m.P "{}" / mm.Cp + m.P"{}" / mm.Cp
+ "{~" * m.V "Exp" * "~}" / mm.Cs + "{~" * m.V"Exp" * "~}" / mm.Cs
+ "{|" * m.V "Exp" * "|}" / mm.Ct + "{|" * m.V"Exp" * "|}" / mm.Ct
+ "{" * m.V "Exp" * "}" / mm.C + "{" * m.V"Exp" * "}" / mm.C
+ m.P "." * m.Cc(any) + m.P"." * m.Cc(any)
+ (name * -arrow + "<" * name * ">") * m.Cb("G") / NT, + (name * -arrow + "<" * name * ">") * m.Cb("G") / NT;
Definition = name * arrow * m.V "Exp", Definition = name * arrow * m.V"Exp";
Grammar = m.Cg(m.Cc(true), "G") * Grammar = m.Cg(m.Cc(true), "G") *
m.Cf(m.V "Definition" / firstdef * m.Cg(m.V "Definition") ^ 0, m.Cf(m.V"Definition" / firstdef * m.Cg(m.V"Definition")^0,
adddef) / mm.P adddef) / mm.P
} }
local pattern = S * m.Cg(m.Cc(false), "G") * exp / mm.P * (-any + patt_error) local pattern = S * m.Cg(m.Cc(false), "G") * exp / mm.P * (-any + patt_error)
local function compile(p, defs) local function compile (p, defs)
if mm.type(p) == "pattern" then return p end -- already compiled if mm.type(p) == "pattern" then return p end -- already compiled
local cp = pattern:match(p, 1, defs) local cp = pattern:match(p, 1, defs)
if not cp then error("incorrect pattern", 3) end if not cp then error("incorrect pattern", 3) end
return cp return cp
end end
local function match(s, p, i) local function match (s, p, i)
local cp = mem[p] local cp = mem[p]
if not cp then if not cp then
cp = compile(p) cp = compile(p)
@ -222,28 +219,26 @@ local function match(s, p, i)
return cp:match(s, i or 1) return cp:match(s, i or 1)
end end
local function find(s, p, i) local function find (s, p, i)
local cp = fmem[p] local cp = fmem[p]
if not cp then if not cp then
cp = compile(p) / 0 cp = compile(p) / 0
cp = mm.P { mm.Cp() * cp * mm.Cp() + 1 * mm.V(1) } cp = mm.P{ mm.Cp() * cp * mm.Cp() + 1 * mm.V(1) }
fmem[p] = cp fmem[p] = cp
end end
local i, e = cp:match(s, i or 1) local i, e = cp:match(s, i or 1)
if i then if i then return i, e - 1
return i, e - 1 else return i
else
return i
end end
end end
local function gsub(s, p, rep) local function gsub (s, p, rep)
local g = gmem[p] or {} -- ensure gmem[p] is not collected while here local g = gmem[p] or {} -- ensure gmem[p] is not collected while here
gmem[p] = g gmem[p] = g
local cp = g[rep] local cp = g[rep]
if not cp then if not cp then
cp = compile(p) cp = compile(p)
cp = mm.Cs((cp / rep + 1) ^ 0) cp = mm.Cs((cp / rep + 1)^0)
g[rep] = cp g[rep] = cp
end end
return cp:match(s) return cp:match(s)

View File

@ -42,7 +42,7 @@ local function _SimpleDecoder(wire_type, decode_value)
return function(field_number, is_repeated, is_packed, key, new_default) return function(field_number, is_repeated, is_packed, key, new_default)
if is_packed then if is_packed then
local DecodeVarint = _DecodeVarint local DecodeVarint = _DecodeVarint
return function(buffer, pos, pend, message, field_dict) return function (buffer, pos, pend, message, field_dict)
local value = field_dict[key] local value = field_dict[key]
if value == nil then if value == nil then
value = new_default(message) value = new_default(message)
@ -79,7 +79,7 @@ local function _SimpleDecoder(wire_type, decode_value)
local element, new_pos = decode_value(buffer, pos) local element, new_pos = decode_value(buffer, pos)
value:append(element) value:append(element)
pos = new_pos + tag_len pos = new_pos + tag_len
if sub(buffer, new_pos + 1, pos) ~= tag_bytes or new_pos >= pend then if sub(buffer, new_pos+1, pos) ~= tag_bytes or new_pos >= pend then
if new_pos > pend then if new_pos > pend then
error('Truncated message.') error('Truncated message.')
end end
@ -88,7 +88,7 @@ local function _SimpleDecoder(wire_type, decode_value)
end end
end end
else else
return function(buffer, pos, pend, message, field_dict) return function (buffer, pos, pend, message, field_dict)
field_dict[key], pos = decode_value(buffer, pos) field_dict[key], pos = decode_value(buffer, pos)
if pos > pend then if pos > pend then
field_dict[key] = nil field_dict[key] = nil
@ -101,7 +101,7 @@ local function _SimpleDecoder(wire_type, decode_value)
end end
local function _ModifiedDecoder(wire_type, decode_value, modify_value) local function _ModifiedDecoder(wire_type, decode_value, modify_value)
local InnerDecode = function(buffer, pos) local InnerDecode = function (buffer, pos)
local result, new_pos = decode_value(buffer, pos) local result, new_pos = decode_value(buffer, pos)
return modify_value(result), new_pos return modify_value(result), new_pos
end end
@ -116,7 +116,6 @@ local function _StructPackDecoder(wire_type, value_size, format)
local result = struct_unpack(format, buffer, pos) local result = struct_unpack(format, buffer, pos)
return result, new_pos return result, new_pos
end end
return _SimpleDecoder(wire_type, InnerDecode) return _SimpleDecoder(wire_type, InnerDecode)
end end
@ -154,7 +153,7 @@ function StringDecoder(field_number, is_repeated, is_packed, key, new_default)
if is_repeated then if is_repeated then
local tag_bytes = encoder.TagBytes(field_number, wire_format.WIRETYPE_LENGTH_DELIMITED) local tag_bytes = encoder.TagBytes(field_number, wire_format.WIRETYPE_LENGTH_DELIMITED)
local tag_len = #tag_bytes local tag_len = #tag_bytes
return function(buffer, pos, pend, message, field_dict) return function (buffer, pos, pend, message, field_dict)
local value = field_dict[key] local value = field_dict[key]
if value == nil then if value == nil then
value = new_default(message) value = new_default(message)
@ -167,7 +166,7 @@ function StringDecoder(field_number, is_repeated, is_packed, key, new_default)
if new_pos > pend then if new_pos > pend then
error('Truncated string.') error('Truncated string.')
end end
value:append(sub(buffer, pos + 1, new_pos)) value:append(sub(buffer, pos+1, new_pos))
pos = new_pos + tag_len pos = new_pos + tag_len
if sub(buffer, new_pos + 1, pos) ~= tag_bytes or new_pos == pend then if sub(buffer, new_pos + 1, pos) ~= tag_bytes or new_pos == pend then
return new_pos return new_pos
@ -175,7 +174,7 @@ function StringDecoder(field_number, is_repeated, is_packed, key, new_default)
end end
end end
else else
return function(buffer, pos, pend, message, field_dict) return function (buffer, pos, pend, message, field_dict)
local size, new_pos local size, new_pos
size, pos = DecodeVarint(buffer, pos) size, pos = DecodeVarint(buffer, pos)
new_pos = pos + size new_pos = pos + size
@ -195,7 +194,7 @@ function BytesDecoder(field_number, is_repeated, is_packed, key, new_default)
if is_repeated then if is_repeated then
local tag_bytes = encoder.TagBytes(field_number, wire_format.WIRETYPE_LENGTH_DELIMITED) local tag_bytes = encoder.TagBytes(field_number, wire_format.WIRETYPE_LENGTH_DELIMITED)
local tag_len = #tag_bytes local tag_len = #tag_bytes
return function(buffer, pos, pend, message, field_dict) return function (buffer, pos, pend, message, field_dict)
local value = field_dict[key] local value = field_dict[key]
if value == nil then if value == nil then
value = new_default(message) value = new_default(message)
@ -237,7 +236,7 @@ function MessageDecoder(field_number, is_repeated, is_packed, key, new_default)
if is_repeated then if is_repeated then
local tag_bytes = encoder.TagBytes(field_number, wire_format.WIRETYPE_LENGTH_DELIMITED) local tag_bytes = encoder.TagBytes(field_number, wire_format.WIRETYPE_LENGTH_DELIMITED)
local tag_len = #tag_bytes local tag_len = #tag_bytes
return function(buffer, pos, pend, message, field_dict) return function (buffer, pos, pend, message, field_dict)
local value = field_dict[key] local value = field_dict[key]
if value == nil then if value == nil then
value = new_default(message) value = new_default(message)
@ -260,7 +259,7 @@ function MessageDecoder(field_number, is_repeated, is_packed, key, new_default)
end end
end end
else else
return function(buffer, pos, pend, message, field_dict) return function (buffer, pos, pend, message, field_dict)
local value = field_dict[key] local value = field_dict[key]
if value == nil then if value == nil then
value = new_default(message) value = new_default(message)
@ -328,11 +327,11 @@ function _FieldSkipper()
_RaiseInvalidWireType, _RaiseInvalidWireType,
} }
-- wiretype_mask = wire_format.TAG_TYPE_MASK -- wiretype_mask = wire_format.TAG_TYPE_MASK
local ord = string.byte local ord = string.byte
local sub = string.sub local sub = string.sub
return function(buffer, pos, pend, tag_bytes) return function (buffer, pos, pend, tag_bytes)
local wire_type = ord(sub(tag_bytes, 1, 1)) % 8 + 1 local wire_type = ord(sub(tag_bytes, 1, 1)) % 8 + 1
return WIRETYPE_TO_SKIPPER[wire_type](buffer, pos, pend) return WIRETYPE_TO_SKIPPER[wire_type](buffer, pos, pend)
end end

View File

@ -47,7 +47,7 @@ local function make_descriptor(name, descriptor, usable_key)
if usable_key[key] then if usable_key[key] then
rawset(self, key, value) rawset(self, key, value)
else else
error("error key: " .. key) error("error key: "..key)
end end
end end
}; };
@ -138,14 +138,14 @@ local NON_PACKABLE_TYPES = {
local _VALUE_CHECKERS = { local _VALUE_CHECKERS = {
[FieldDescriptor.CPPTYPE_INT32] = type_checkers.Int32ValueChecker(), [FieldDescriptor.CPPTYPE_INT32] = type_checkers.Int32ValueChecker(),
[FieldDescriptor.CPPTYPE_INT64] = type_checkers.TypeChecker({ string = true, number = true }), [FieldDescriptor.CPPTYPE_INT64] = type_checkers.TypeChecker({string = true, number = true}),
[FieldDescriptor.CPPTYPE_UINT32] = type_checkers.Uint32ValueChecker(), [FieldDescriptor.CPPTYPE_UINT32] = type_checkers.Uint32ValueChecker(),
[FieldDescriptor.CPPTYPE_UINT64] = type_checkers.TypeChecker({ string = true, number = true }), [FieldDescriptor.CPPTYPE_UINT64] = type_checkers.TypeChecker({string = true, number = true}),
[FieldDescriptor.CPPTYPE_DOUBLE] = type_checkers.TypeChecker({ number = true }), [FieldDescriptor.CPPTYPE_DOUBLE] = type_checkers.TypeChecker({number = true}),
[FieldDescriptor.CPPTYPE_FLOAT] = type_checkers.TypeChecker({ number = true }), [FieldDescriptor.CPPTYPE_FLOAT] = type_checkers.TypeChecker({number = true}),
[FieldDescriptor.CPPTYPE_BOOL] = type_checkers.TypeChecker({ boolean = true, bool = true, int = true }), [FieldDescriptor.CPPTYPE_BOOL] = type_checkers.TypeChecker({boolean = true, bool = true, int=true}),
[FieldDescriptor.CPPTYPE_ENUM] = type_checkers.Int32ValueChecker(), [FieldDescriptor.CPPTYPE_ENUM] = type_checkers.Int32ValueChecker(),
[FieldDescriptor.CPPTYPE_STRING] = type_checkers.TypeChecker({ string = true }) [FieldDescriptor.CPPTYPE_STRING] = type_checkers.TypeChecker({string = true})
} }
@ -272,25 +272,25 @@ local function _DefaultValueConstructorForField(field)
end end
if field.cpp_type == FieldDescriptor.CPPTYPE_MESSAGE then if field.cpp_type == FieldDescriptor.CPPTYPE_MESSAGE then
local message_type = field.message_type local message_type = field.message_type
return function(message) return function (message)
return containers.RepeatedCompositeFieldContainer(message._listener_for_children, message_type) return containers.RepeatedCompositeFieldContainer(message._listener_for_children, message_type)
end end
else else
local type_checker = GetTypeChecker(field.cpp_type, field.type) local type_checker = GetTypeChecker(field.cpp_type, field.type)
return function(message) return function (message)
return containers.RepeatedScalarFieldContainer(message._listener_for_children, type_checker) return containers.RepeatedScalarFieldContainer(message._listener_for_children, type_checker)
end end
end end
end end
if field.cpp_type == FieldDescriptor.CPPTYPE_MESSAGE then if field.cpp_type == FieldDescriptor.CPPTYPE_MESSAGE then
local message_type = field.message_type local message_type = field.message_type
return function(message) return function (message)
result = message_type._concrete_class() result = message_type._concrete_class()
result._SetListener(message._listener_for_children) result._SetListener(message._listener_for_children)
return result return result
end end
end end
return function(message) return function (message)
return field.default_value return field.default_value
end end
end end
@ -299,16 +299,13 @@ local function _AttachFieldHelpers(message_meta, field_descriptor)
local is_repeated = (field_descriptor.label == FieldDescriptor.LABEL_REPEATED) local is_repeated = (field_descriptor.label == FieldDescriptor.LABEL_REPEATED)
local is_packed = (field_descriptor.has_options and field_descriptor.GetOptions().packed) local is_packed = (field_descriptor.has_options and field_descriptor.GetOptions().packed)
rawset(field_descriptor, "_encoder", rawset(field_descriptor, "_encoder", TYPE_TO_ENCODER[field_descriptor.type](field_descriptor.number, is_repeated, is_packed))
TYPE_TO_ENCODER[field_descriptor.type](field_descriptor.number, is_repeated, is_packed)) rawset(field_descriptor, "_sizer", TYPE_TO_SIZER[field_descriptor.type](field_descriptor.number, is_repeated, is_packed))
rawset(field_descriptor, "_sizer",
TYPE_TO_SIZER[field_descriptor.type](field_descriptor.number, is_repeated, is_packed))
rawset(field_descriptor, "_default_constructor", _DefaultValueConstructorForField(field_descriptor)) rawset(field_descriptor, "_default_constructor", _DefaultValueConstructorForField(field_descriptor))
local AddDecoder = function(wiretype, is_packed) local AddDecoder = function(wiretype, is_packed)
local tag_bytes = encoder.TagBytes(field_descriptor.number, wiretype) local tag_bytes = encoder.TagBytes(field_descriptor.number, wiretype)
message_meta._decoders_by_tag[tag_bytes] = TYPE_TO_DECODER[field_descriptor.type](field_descriptor.number, message_meta._decoders_by_tag[tag_bytes] = TYPE_TO_DECODER[field_descriptor.type](field_descriptor.number, is_repeated, is_packed, field_descriptor, field_descriptor._default_constructor)
is_repeated, is_packed, field_descriptor, field_descriptor._default_constructor)
end end
AddDecoder(FIELD_TYPE_TO_WIRE_TYPE[field_descriptor.type], False) AddDecoder(FIELD_TYPE_TO_WIRE_TYPE[field_descriptor.type], False)
@ -377,7 +374,7 @@ local function _AddPropertiesForNonRepeatedCompositeField(field, message_meta)
return field_value return field_value
end end
message_meta._setter[property_name] = function(self, new_value) message_meta._setter[property_name] = function(self, new_value)
error('Assignment not allowed to composite field' .. property_name .. 'in protocol message object.') error('Assignment not allowed to composite field' .. property_name .. 'in protocol message object.' )
end end
end end
@ -439,8 +436,7 @@ local _ED_meta = {
local _extended_message = rawget(self, "_extended_message") local _extended_message = rawget(self, "_extended_message")
if (extension_handle.label == FieldDescriptor.LABEL_REPEATED or if (extension_handle.label == FieldDescriptor.LABEL_REPEATED or
extension_handle.cpp_type == FieldDescriptor.CPPTYPE_MESSAGE) then extension_handle.cpp_type == FieldDescriptor.CPPTYPE_MESSAGE) then
error('Cannot assign to extension "' .. error('Cannot assign to extension "'.. extension_handle.full_name .. '" because it is a repeated or composite type.')
extension_handle.full_name .. '" because it is a repeated or composite type.')
end end
local type_checker = GetTypeChecker(extension_handle.cpp_type, extension_handle.type) local type_checker = GetTypeChecker(extension_handle.cpp_type, extension_handle.type)
@ -509,28 +505,25 @@ end
function sortFunc(a, b) function sortFunc(a, b)
return a.index < b.index return a.index < b.index
end end
function pairsByKeys (t, f)
function pairsByKeys(t, f)
local a = {} local a = {}
for n in pairs(t) do table.insert(a, n) end for n in pairs(t) do table.insert(a, n) end
table.sort(a, f) table.sort(a, f)
local i = 0 -- iterator variable local i = 0 -- iterator variable
local iter = function() -- iterator function local iter = function () -- iterator function
i = i + 1 i = i + 1
if a[i] == nil then if a[i] == nil then return nil
return nil else return a[i], t[a[i]]
else
return a[i], t[a[i]]
end end
end end
return iter return iter
end end
local function _AddListFieldsMethod(message_descriptor, message_meta) local function _AddListFieldsMethod(message_descriptor, message_meta)
message_meta._member.ListFields = function(self) message_meta._member.ListFields = function (self)
local list_field = function(fields) local list_field = function(fields)
--local f, s, v = pairs(self._fields) --local f, s, v = pairs(self._fields)
local f, s, v = pairsByKeys(self._fields, sortFunc) local f,s,v = pairsByKeys(self._fields, sortFunc)
local iter = function(a, i) local iter = function(a, i)
while true do while true do
local descriptor, value = f(a, i) local descriptor, value = f(a, i)
@ -554,10 +547,10 @@ local function _AddHasFieldMethod(message_descriptor, message_meta)
singular_fields[field.name] = field singular_fields[field.name] = field
end end
end end
message_meta._member.HasField = function(self, field_name) message_meta._member.HasField = function (self, field_name)
field = singular_fields[field_name] field = singular_fields[field_name]
if field == nil then if field == nil then
error('Protocol message has no singular "' .. field_name .. '" field.') error('Protocol message has no singular "'.. field_name.. '" field.')
end end
if field.cpp_type == FieldDescriptor.CPPTYPE_MESSAGE then if field.cpp_type == FieldDescriptor.CPPTYPE_MESSAGE then
value = self._fields[field] value = self._fields[field]
@ -580,7 +573,7 @@ local function _AddClearFieldMethod(message_descriptor, message_meta)
message_meta._member.ClearField = function(self, field_name) message_meta._member.ClearField = function(self, field_name)
field = singular_fields[field_name] field = singular_fields[field_name]
if field == nil then if field == nil then
error('Protocol message has no singular "' .. field_name .. '" field.') error('Protocol message has no singular "'.. field_name.. '" field.')
end end
if self._fields[field] then if self._fields[field] then
@ -792,7 +785,7 @@ local function _AddIsInitializedMethod(message_descriptor, message_meta)
message_meta._member.FindInitializationErrors = function(self) message_meta._member.FindInitializationErrors = function(self)
local errors = {} local errors = {}
for _, field in ipairs(required_fields) do for _,field in ipairs(required_fields) do
if not message_meta._member.HasField(self, field.name) then if not message_meta._member.HasField(self, field.name) then
errors[#errors + 1] = field.name errors[#errors + 1] = field.name
end end
@ -830,7 +823,7 @@ local function _AddMergeFromMethod(message_meta)
local LABEL_REPEATED = FieldDescriptor.LABEL_REPEATED local LABEL_REPEATED = FieldDescriptor.LABEL_REPEATED
local CPPTYPE_MESSAGE = FieldDescriptor.CPPTYPE_MESSAGE local CPPTYPE_MESSAGE = FieldDescriptor.CPPTYPE_MESSAGE
message_meta._member.MergeFrom = function(self, msg) message_meta._member.MergeFrom = function (self, msg)
assert(msg ~= self) assert(msg ~= self)
message_meta._member._Modified(self) message_meta._member._Modified(self)
@ -860,7 +853,7 @@ local function _AddMessageMethods(message_descriptor, message_meta)
_AddHasExtensionMethod(message_meta) _AddHasExtensionMethod(message_meta)
end end
_AddClearMethod(message_descriptor, message_meta) _AddClearMethod(message_descriptor, message_meta)
-- _AddEqualsMethod(message_descriptor, message_meta) -- _AddEqualsMethod(message_descriptor, message_meta)
_AddStrMethod(message_meta) _AddStrMethod(message_meta)
_AddSetListenerMethod(message_meta) _AddSetListenerMethod(message_meta)
_AddByteSizeMethod(message_descriptor, message_meta) _AddByteSizeMethod(message_descriptor, message_meta)
@ -872,7 +865,7 @@ local function _AddMessageMethods(message_descriptor, message_meta)
end end
local function _AddPrivateHelperMethods(message_meta) local function _AddPrivateHelperMethods(message_meta)
local Modified = function(self) local Modified = function (self)
if not self._cached_byte_size_dirty then if not self._cached_byte_size_dirty then
self._cached_byte_size_dirty = true self._cached_byte_size_dirty = true
self._listener_for_children.dirty = true self._listener_for_children.dirty = true
@ -888,7 +881,7 @@ local function property_getter(message_meta)
local getter = message_meta._getter local getter = message_meta._getter
local member = message_meta._member local member = message_meta._member
return function(self, property) return function (self, property)
local g = getter[property] local g = getter[property]
if g then if g then
return g(self) return g(self)
@ -901,7 +894,7 @@ end
local function property_setter(message_meta) local function property_setter(message_meta)
local setter = message_meta._setter local setter = message_meta._setter
return function(self, property, value) return function (self, property, value)
local s = setter[property] local s = setter[property]
if s then if s then
s(self, value) s(self, value)
@ -936,7 +929,7 @@ local function Message(descriptor)
message_meta._getter = {} message_meta._getter = {}
message_meta._setter = {} message_meta._setter = {}
message_meta._member = {} message_meta._member = {}
-- message_meta._name = descriptor.full_name -- message_meta._name = descriptor.full_name
local ns = setmetatable({}, message_meta._member) local ns = setmetatable({}, message_meta._member)
message_meta._member.__call = _InitMethod(message_meta) message_meta._member.__call = _InitMethod(message_meta)
@ -964,3 +957,4 @@ local function Message(descriptor)
end end
_M.Message = Message _M.Message = Message

View File

@ -27,13 +27,13 @@ local descriptor = require "protobuf.descriptor"
module "protobuf.text_format" module "protobuf.text_format"
function format(buffer) function format(buffer)
local len = string.len(buffer) local len = string.len( buffer )
for i = 1, len, 16 do for i = 1, len, 16 do
local text = "" local text = ""
for j = i, math.min(i + 16 - 1, len) do for j = i, math.min( i + 16 - 1, len ) do
text = string.format("%s %02x", text, string.byte(buffer, j)) text = string.format( "%s %02x", text, string.byte( buffer, j ) )
end end
print(text) print( text )
end end
end end
@ -76,3 +76,4 @@ function msg_format(msg)
msg_format_indent(write, msg, 0) msg_format_indent(write, msg, 0)
return table.concat(out) return table.concat(out)
end end

View File

@ -8,8 +8,8 @@ if jit then
jit.opt.start(3) jit.opt.start(3)
end end
-- print("ver"..jit.version_num.." jit: ", jit.status()) print("ver"..jit.version_num.." jit: ", jit.status())
-- print(string.format("os: %s, arch: %s", jit.os, jit.arch)) print(string.format("os: %s, arch: %s", jit.os, jit.arch))
end end
if DebugServerIp then if DebugServerIp then

View File

@ -88,5 +88,5 @@ TextureImporter:
pSDRemoveMatte: 0 pSDRemoveMatte: 0
pSDShowRemoveMatteOption: 0 pSDShowRemoveMatteOption: 0
userData: userData:
assetBundleName: base/main_majiang/d2fa434d27dc07bf09395dc32491060b assetBundleName: base/main_majiang/abf0e2af8fb6daf78fa8ebcdd8acc4f0
assetBundleVariant: assetBundleVariant:

Binary file not shown.

Before

Width:  |  Height:  |  Size: 965 KiB

After

Width:  |  Height:  |  Size: 483 KiB

View File

@ -88,5 +88,5 @@ TextureImporter:
pSDRemoveMatte: 0 pSDRemoveMatte: 0
pSDShowRemoveMatteOption: 0 pSDShowRemoveMatteOption: 0
userData: userData:
assetBundleName: assetBundleName: base/main_majiang/abf0e2af8fb6daf78fa8ebcdd8acc4f0
assetBundleVariant: assetBundleVariant:

Binary file not shown.

After

Width:  |  Height:  |  Size: 166 KiB

View File

@ -0,0 +1,92 @@
fileFormatVersion: 2
guid: ffe28b30c5a6cf24298b352cb37c18b2
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 11
mipmaps:
mipMapMode: 0
enableMipMap: 1
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: -1
aniso: -1
mipBias: -100
wrapU: -1
wrapV: -1
wrapW: -1
nPOTScale: 1
lightmap: 0
compressionQuality: 50
spriteMode: 0
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 0
spriteTessellationDetail: -1
textureType: 0
textureShape: 1
singleChannelComponent: 0
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
applyGammaDecoding: 0
platformSettings:
- serializedVersion: 3
buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
physicsShape: []
bones: []
spriteID:
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spritePackingTag:
pSDRemoveMatte: 0
pSDShowRemoveMatteOption: 0
userData:
assetBundleName: base/main_majiang/abf0e2af8fb6daf78fa8ebcdd8acc4f0
assetBundleVariant:

View File

@ -88,5 +88,5 @@ TextureImporter:
pSDRemoveMatte: 0 pSDRemoveMatte: 0
pSDShowRemoveMatteOption: 0 pSDShowRemoveMatteOption: 0
userData: userData:
assetBundleName: base/main_majiang/d2fa434d27dc07bf09395dc32491060b assetBundleName: base/main_majiang/abf0e2af8fb6daf78fa8ebcdd8acc4f0
assetBundleVariant: assetBundleVariant:

View File

@ -88,5 +88,5 @@ TextureImporter:
pSDRemoveMatte: 0 pSDRemoveMatte: 0
pSDShowRemoveMatteOption: 0 pSDShowRemoveMatteOption: 0
userData: userData:
assetBundleName: base/main_majiang/d2fa434d27dc07bf09395dc32491060b assetBundleName: base/main_majiang/abf0e2af8fb6daf78fa8ebcdd8acc4f0
assetBundleVariant: assetBundleVariant:

View File

@ -88,5 +88,5 @@ TextureImporter:
pSDRemoveMatte: 0 pSDRemoveMatte: 0
pSDShowRemoveMatteOption: 0 pSDShowRemoveMatteOption: 0
userData: userData:
assetBundleName: base/main_majiang/d2fa434d27dc07bf09395dc32491060b assetBundleName: base/main_majiang/abf0e2af8fb6daf78fa8ebcdd8acc4f0
assetBundleVariant: assetBundleVariant:

View File

@ -88,5 +88,5 @@ TextureImporter:
pSDRemoveMatte: 0 pSDRemoveMatte: 0
pSDShowRemoveMatteOption: 0 pSDShowRemoveMatteOption: 0
userData: userData:
assetBundleName: base/main_majiang/d2fa434d27dc07bf09395dc32491060b assetBundleName: base/main_majiang/abf0e2af8fb6daf78fa8ebcdd8acc4f0
assetBundleVariant: assetBundleVariant:

View File

@ -3,5 +3,5 @@ guid: 326fa64ee0dd8b94aa86fa1978e56fa5
TextScriptImporter: TextScriptImporter:
externalObjects: {} externalObjects: {}
userData: userData:
assetBundleName: base/main_majiang/d2fa434d27dc07bf09395dc32491060b assetBundleName: base/main_majiang/abf0e2af8fb6daf78fa8ebcdd8acc4f0
assetBundleVariant: assetBundleVariant: