Skip to content

Commit b9cb459

Browse files
committed
optimization System.Is & generic name
1 parent 414ac12 commit b9cb459

6 files changed

Lines changed: 178 additions & 166 deletions

File tree

‎CSharp.lua/CoreSystem.Lua/CoreSystem/Array.lua‎

Lines changed: 6 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -876,13 +876,6 @@ Array = {
876876
end
877877
}
878878

879-
define("System.Array", function(T)
880-
return {
881-
__inherits__ = { System.IList_1(T), System.IReadOnlyList_1(T), System.IList },
882-
__genericT__ = T
883-
}
884-
end, Array)
885-
886879
function Array.__call(T, ...)
887880
return buildArray(T, select("#", ...), { ... })
888881
end
@@ -965,17 +958,6 @@ local MultiArray = {
965958
end
966959
}
967960

968-
function System.multiArrayFromTable(t, T)
969-
return setmetatable(t, MultiArray(T))
970-
end
971-
972-
define("System.MultiArray", function(T)
973-
return {
974-
__inherits__ = { System.IList_1(T), System.IReadOnlyList_1(T), System.IList },
975-
__genericT__ = T
976-
}
977-
end, MultiArray)
978-
979961
function MultiArray.__call(T, rank, t)
980962
local len = 1
981963
for i = 1, #rank do
@@ -986,7 +968,12 @@ function MultiArray.__call(T, rank, t)
986968
return t
987969
end
988970

989-
getmetatable(MultiArray).__index = Array
971+
System.defArray("System.Array", function(T)
972+
return {
973+
__inherits__ = { System.IList_1(T), System.IReadOnlyList_1(T), System.IList },
974+
__genericT__ = T
975+
}
976+
end, Array, MultiArray)
990977

991978
local ReadOnlyCollection = {
992979
version = 0,

‎CSharp.lua/CoreSystem.Lua/CoreSystem/Core.lua‎

Lines changed: 91 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -134,25 +134,29 @@ local function set(className, cls)
134134
end
135135

136136
local function multiKey(t, ...)
137-
local k
138-
for i = 1, select("#", ...) do
139-
k = select(i, ...)
140-
assert(k)
137+
local n, i, k = select("#", ...), 1
138+
while true do
139+
k = assert(select(i, ...))
140+
if i == n then
141+
break
142+
end
141143
local tk = t[k]
142144
if tk == nil then
143145
tk = {}
144146
t[k] = tk
145147
end
146148
t = tk
149+
i = i + 1
147150
end
148151
return t, k
149152
end
150153

151154
local function genericName(name, ...)
152-
local t = { name, "[" }
153-
local count = 3
155+
local n = select("#", ...)
156+
local t = { name, "`", n, "[" }
157+
local count = 5
154158
local hascomma
155-
for i = 1, select("#", ...) do
159+
for i = 1, n do
156160
local cls = select(i, ...)
157161
if hascomma then
158162
t[count] = ","
@@ -280,27 +284,7 @@ local function setHasStaticCtor(cls, kind)
280284
setmetatable(cls, staticCtorMetatable)
281285
end
282286

283-
local function def(name, kind, cls, generic)
284-
if type(cls) == "function" then
285-
if generic then
286-
generic.__index = generic
287-
generic.__call = new
288-
end
289-
local mt = {}
290-
local fn = function(_, ...)
291-
local gt, gk = multiKey(mt, ...)
292-
local t = gt[gk]
293-
if t == nil then
294-
t = def(genericName(name, ...), kind, cls(...) or {}, true)
295-
if generic then
296-
setmetatable(t, generic)
297-
end
298-
gt[gk] = t
299-
end
300-
return t
301-
end
302-
return set(name, setmetatable(generic or {}, { __call = fn, __index = Object }))
303-
end
287+
local function defCore(name, kind, cls, generic)
304288
cls = cls or {}
305289
cls.__name__ = name
306290
if not generic then
@@ -328,22 +312,88 @@ local function def(name, kind, cls, generic)
328312
return cls
329313
end
330314

331-
local function defCls(name, cls, genericSuper)
332-
return def(name, "C", cls, genericSuper)
315+
local function def(name, kind, cls, generic)
316+
if type(cls) == "function" then
317+
if generic then
318+
generic.__index = generic
319+
generic.__call = new
320+
end
321+
local mt = {}
322+
local fn = function(_, ...)
323+
local gt, gk = multiKey(mt, ...)
324+
local t = gt[gk]
325+
if t == nil then
326+
t = defCore(genericName(name, ...), kind, cls(...) or {}, true)
327+
if generic then
328+
setmetatable(t, generic)
329+
end
330+
gt[gk] = t
331+
end
332+
return t
333+
end
334+
return set(name, setmetatable(generic or {}, { __call = fn, __index = Object }))
335+
else
336+
return defCore(name, kind, cls, generic)
337+
end
338+
end
339+
340+
local function defCls(name, cls, generic)
341+
return def(name, "C", cls, generic)
333342
end
334343

335344
local function defInf(name, cls)
336345
return def(name, "I", cls)
337346
end
338347

339-
local function defStc(name, cls, genericSuper)
340-
return def(name, "S", cls, genericSuper)
348+
local function defStc(name, cls, generic)
349+
return def(name, "S", cls, generic)
341350
end
342351

343352
local function defEnum(name, cls)
344353
return def(name, "E", cls)
345354
end
346355

356+
local function defArray(name, cls, Array, MultiArray)
357+
Array.__index = Array
358+
MultiArray.__index = MultiArray
359+
setmetatable(MultiArray, Array)
360+
361+
local mt = {}
362+
local function create(Array, T)
363+
local ArrayT = mt[T]
364+
if ArrayT == nil then
365+
ArrayT = defCore(T.__name__ .. "[]", "C", cls(T), true)
366+
setmetatable(ArrayT, Array)
367+
mt[T] = ArrayT
368+
end
369+
return ArrayT
370+
end
371+
372+
local mtMulti = {}
373+
local function createMulti(MultiArray, T, dimension)
374+
local gt, gk = multiKey(mtMulti, T, dimension)
375+
local ArrayT = gt[gk]
376+
if ArrayT == nil then
377+
local name = T.__name__ .. "[" .. (","):rep(dimension - 1) .. "]"
378+
ArrayT = defCore(name, "C", cls(T), true)
379+
setmetatable(ArrayT, MultiArray)
380+
gt[gk] = ArrayT
381+
end
382+
return ArrayT
383+
end
384+
385+
return set(name, setmetatable(Array, {
386+
__index = Object,
387+
__call = function (Array, T, dimension)
388+
if not dimension then
389+
return create(Array, T)
390+
else
391+
return createMulti(MultiArray, T, dimension)
392+
end
393+
end
394+
}))
395+
end
396+
347397
local function trunc(num)
348398
return num > 0 and floor(num) or ceil(num)
349399
end
@@ -366,6 +416,7 @@ System = {
366416
defInf = defInf,
367417
defStc = defStc,
368418
defEnum = defEnum,
419+
defArray = defArray,
369420
trunc = trunc,
370421
global = global,
371422
yieldReturn = cyield,
@@ -379,8 +430,14 @@ System.luaVersion = version
379430

380431
if version < 5.3 then
381432
local bnot, band, bor, xor, sl, sr
382-
local ok, bit = pcall(require, "bit")
383-
if ok then
433+
local bit = rawget(global, "bit")
434+
if not bit then
435+
local ok, b = pcall(require, "bit")
436+
if ok then
437+
bit = b
438+
end
439+
end
440+
if bit then
384441
bnot, band, bor, xor, sl, sr = bit.bnot, bit.band, bit.bor, bit.bxor, bit.lshift, bit.rshift
385442
else
386443
local function disable()

‎CSharp.lua/CoreSystem.Lua/CoreSystem/String.lua‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -544,4 +544,5 @@ function String.__inherits__()
544544
end
545545

546546
System.define("System.String", String)
547-
setmetatable(String, { __index = System.Object, __call = ctor })
547+
String.__call = ctor
548+
debug.setmetatable("", String)

0 commit comments

Comments
 (0)