Initial version - 1.2.0.60
EN: 1.2.0.60 CN: 1.2.0.61 JP: 1.2.0.63 KR: 1.2.0.67
This commit is contained in:
@@ -0,0 +1,10 @@
|
||||
local util = require("xlua/util")
|
||||
local cs_coroutine_runner = CS.LuaManager.Instance
|
||||
return {
|
||||
start = function(...)
|
||||
return cs_coroutine_runner:StartCoroutine(util.cs_generator(...))
|
||||
end,
|
||||
stop = function(coroutine)
|
||||
cs_coroutine_runner:StopCoroutine(coroutine)
|
||||
end
|
||||
}
|
||||
@@ -0,0 +1,169 @@
|
||||
local unpack = table.unpack
|
||||
local async_to_sync = function(async_func, callback_pos)
|
||||
return function(...)
|
||||
local _co = coroutine.running() or error("this function must be run in coroutine")
|
||||
local rets
|
||||
local waiting = false
|
||||
local cb_func = function(...)
|
||||
if waiting then
|
||||
assert(coroutine.resume(_co, ...))
|
||||
else
|
||||
rets = {
|
||||
...
|
||||
}
|
||||
end
|
||||
end
|
||||
local params = {
|
||||
...
|
||||
}
|
||||
table.insert(params, callback_pos or #params + 1, cb_func)
|
||||
async_func(unpack(params))
|
||||
if rets == nil then
|
||||
waiting = true
|
||||
rets = {
|
||||
coroutine.yield()
|
||||
}
|
||||
end
|
||||
return unpack(rets)
|
||||
end
|
||||
end
|
||||
local coroutine_call = function(func)
|
||||
return function(...)
|
||||
local co = coroutine.create(func)
|
||||
assert(coroutine.resume(co, ...))
|
||||
end
|
||||
end
|
||||
local move_end = {}
|
||||
local generator_mt = {
|
||||
__index = {
|
||||
MoveNext = function(self)
|
||||
self.Current = self.co()
|
||||
if self.Current == move_end then
|
||||
self.Current = nil
|
||||
return false
|
||||
else
|
||||
return true
|
||||
end
|
||||
end,
|
||||
Reset = function(self)
|
||||
self.co = coroutine.wrap(self.w_func)
|
||||
end
|
||||
}
|
||||
}
|
||||
local cs_generator = function(func, ...)
|
||||
local params = {
|
||||
...
|
||||
}
|
||||
local generator = setmetatable({
|
||||
w_func = function()
|
||||
func(unpack(params))
|
||||
return move_end
|
||||
end
|
||||
}, generator_mt)
|
||||
generator:Reset()
|
||||
return generator
|
||||
end
|
||||
local loadpackage = function(...)
|
||||
for _, loader in ipairs(package.searchers) do
|
||||
local func = loader(...)
|
||||
if type(func) == "function" then
|
||||
return func
|
||||
end
|
||||
end
|
||||
end
|
||||
local auto_id_map = function()
|
||||
local hotfix_id_map = require("hotfix_id_map")
|
||||
local org_hotfix = xlua.hotfix
|
||||
function xlua.hotfix(cs, field, func)
|
||||
local map_info_of_type = hotfix_id_map[typeof(cs):ToString()]
|
||||
if map_info_of_type then
|
||||
if func == nil then
|
||||
func = false
|
||||
end
|
||||
local tbl = type(field) == "table" and field or {
|
||||
[field] = func
|
||||
}
|
||||
for k, v in pairs(tbl) do
|
||||
local map_info_of_methods = map_info_of_type[k]
|
||||
local f = type(v) == "function" and v or nil
|
||||
for _, id in ipairs(map_info_of_methods or {}) do
|
||||
CS.XLua.HotfixDelegateBridge.Set(id, f)
|
||||
end
|
||||
end
|
||||
xlua.private_accessible(cs)
|
||||
else
|
||||
return org_hotfix(cs, field, func)
|
||||
end
|
||||
end
|
||||
end
|
||||
local hotfix_ex = function(cs, field, func)
|
||||
assert(type(field) == "string" and type(func) == "function", "invalid argument: #2 string needed, #3 function needed!")
|
||||
local function func_after(...)
|
||||
xlua.hotfix(cs, field, nil)
|
||||
local ret = {
|
||||
func(...)
|
||||
}
|
||||
xlua.hotfix(cs, field, func_after)
|
||||
return unpack(ret)
|
||||
end
|
||||
xlua.hotfix(cs, field, func_after)
|
||||
end
|
||||
local bind = function(func, obj)
|
||||
return function(...)
|
||||
return func(obj, ...)
|
||||
end
|
||||
end
|
||||
local enum_or_op = debug.getmetatable(CS.System.Reflection.BindingFlags.Public).__bor
|
||||
local enum_or_op_ex = function(first, ...)
|
||||
for _, e in ipairs({
|
||||
...
|
||||
}) do
|
||||
first = enum_or_op(first, e)
|
||||
end
|
||||
return first
|
||||
end
|
||||
local createdelegate = function(delegate_cls, obj, impl_cls, method_name, parameter_type_list)
|
||||
local flag = enum_or_op_ex(CS.System.Reflection.BindingFlags.Public, CS.System.Reflection.BindingFlags.NonPublic, CS.System.Reflection.BindingFlags.Instance, CS.System.Reflection.BindingFlags.Static)
|
||||
local m = parameter_type_list and typeof(impl_cls):GetMethod(method_name, flag, nil, parameter_type_list, nil) or typeof(impl_cls):GetMethod(method_name, flag)
|
||||
return CS.System.Delegate.CreateDelegate(typeof(delegate_cls), obj, m)
|
||||
end
|
||||
local state = function(csobj, state)
|
||||
local csobj_mt = getmetatable(csobj)
|
||||
for k, v in pairs(csobj_mt) do
|
||||
rawset(state, k, v)
|
||||
end
|
||||
local csobj_index, csobj_newindex = state.__index, state.__newindex
|
||||
function state.__index(obj, k)
|
||||
return rawget(state, k) or csobj_index(obj, k)
|
||||
end
|
||||
function state.__newindex(obj, k, v)
|
||||
if rawget(state, k) ~= nil then
|
||||
rawset(state, k, v)
|
||||
else
|
||||
csobj_newindex(obj, k, v)
|
||||
end
|
||||
end
|
||||
debug.setmetatable(csobj, state)
|
||||
return state
|
||||
end
|
||||
local print_func_ref_by_csharp = function()
|
||||
local registry = debug.getregistry()
|
||||
for k, v in pairs(registry) do
|
||||
if type(k) == "number" and type(v) == "function" and registry[v] == k then
|
||||
local info = debug.getinfo(v)
|
||||
print(string.format("[key] %d [file path] %s [line:] %d.", k, info.short_src, info.linedefined))
|
||||
end
|
||||
end
|
||||
end
|
||||
return {
|
||||
async_to_sync = async_to_sync,
|
||||
coroutine_call = coroutine_call,
|
||||
cs_generator = cs_generator,
|
||||
loadpackage = loadpackage,
|
||||
auto_id_map = auto_id_map,
|
||||
hotfix_ex = hotfix_ex,
|
||||
bind = bind,
|
||||
createdelegate = createdelegate,
|
||||
state = state,
|
||||
print_func_ref_by_csharp = print_func_ref_by_csharp
|
||||
}
|
||||
Reference in New Issue
Block a user