Skip to content

Commit f057650

Browse files
CopilotCapsAdmin
andcommitted
Optimize table and tuple operations: replace ipairs with numeric loops
Co-authored-by: CapsAdmin <[email protected]>
1 parent 18721bd commit f057650

File tree

2 files changed

+38
-12
lines changed

2 files changed

+38
-12
lines changed

nattlua/types/table.lua

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,11 @@ function META:__tostring()
224224
local contract = self:GetContract()
225225

226226
if contract and contract.Type == "table" and contract ~= self then
227-
for i, keyval in ipairs(contract:GetData()) do
227+
local contract_data = contract:GetData()
228+
local contract_len = #contract_data
229+
230+
for i = 1, contract_len do
231+
local keyval = contract_data[i]
228232
local table_kv = self:FindKeyValExact(keyval.key)
229233
local key = tostring(table_kv and table_kv.key or "nil")
230234
local val = tostring(table_kv and table_kv.val or "nil")
@@ -244,7 +248,11 @@ function META:__tostring()
244248
end
245249
end
246250
else
247-
for i, keyval in ipairs(self.Data) do
251+
local data = self.Data
252+
local len = #data
253+
254+
for i = 1, len do
255+
local keyval = data[i]
248256
local key, val = tostring(keyval.key), tostring(keyval.val)
249257
s[i] = indent .. "[" .. key .. "]" .. " = " .. val
250258
end
@@ -264,8 +272,11 @@ function META:GetArrayLength()
264272
if contract and contract ~= self then return contract:GetArrayLength() end
265273

266274
local len = 0
275+
local data = self.Data
276+
local data_len = #data
267277

268-
for _, kv in ipairs(self.Data) do
278+
for i = 1, data_len do
279+
local kv = data[i]
269280
if kv.key:IsNumeric() then
270281
if kv.key:IsLiteral() then
271282
-- TODO: not very accurate
@@ -335,7 +346,11 @@ function META:FollowsContract(contract--[[#: TTable]])
335346
end
336347
end
337348

338-
for _, keyval in ipairs(self.Data) do
349+
local data = self.Data
350+
local len = #data
351+
352+
for i = 1, len do
353+
local keyval = data[i]
339354
if not keyval.val:IsNil() then
340355
local res, err = contract:FindKeyValExact(keyval.key)
341356

@@ -356,8 +371,11 @@ function META:FollowsContract(contract--[[#: TTable]])
356371
end
357372

358373
function META:CanBeEmpty()
359-
for _, keyval in ipairs(self.Data) do
360-
if not keyval.val:CanBeNil() then return false end
374+
local data = self.Data
375+
local len = #data
376+
377+
for i = 1, len do
378+
if not data[i].val:CanBeNil() then return false end
361379
end
362380

363381
return true

nattlua/types/tuple.lua

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,11 @@ function META:GetHash(visited)
5151

5252
visited[self] = "*circular*"
5353
local types = {}
54+
local data = self.Data
55+
local len = #data
5456

55-
for i, v in ipairs(self.Data) do
56-
types[i] = v:GetHash(visited)
57+
for i = 1, len do
58+
types[i] = data[i]:GetHash(visited)
5759
end
5860

5961
visited[self] = table.concat(types, ",")
@@ -65,9 +67,11 @@ function META:__tostring()
6567

6668
self.suppress = true
6769
local strings--[[#: List<|string|>]] = {}
70+
local data = self.Data
71+
local len = #data
6872

69-
for i, v in ipairs(self.Data) do
70-
strings[i] = tostring(v)
73+
for i = 1, len do
74+
strings[i] = tostring(data[i])
7175
end
7276

7377
if self.Remainder then table.insert(strings, tostring(self.Remainder)) end
@@ -125,9 +129,13 @@ function META:Copy(map--[[#: Map<|any, any|> | nil]], copy_tables)
125129

126130
local copy = META.New({})
127131
map[self] = copy
132+
133+
local data = self.Data
134+
local copy_data = copy.Data
135+
local len = #data
128136

129-
for i, v in ipairs(self.Data) do
130-
copy.Data[i] = copy_val(v, map, copy_tables)
137+
for i = 1, len do
138+
copy_data[i] = copy_val(data[i], map, copy_tables)
131139
end
132140

133141
copy.Repeat = self.Repeat

0 commit comments

Comments
 (0)