@@ -38,14 +38,26 @@ object ObjectModule extends AbstractFunctionModule {
3838 private object ObjectFields extends Val .Builtin1 (" objectFields" , " o" ) {
3939 def evalRhs (o : Eval , ev : EvalScope , pos : Position ): Val = {
4040 val keys = getVisibleKeys(ev, o.value.asObj)
41- Val .Arr (pos, keys.map(k => Val .Str (pos, k)))
41+ val result = new Array [Eval ](keys.length)
42+ var i = 0
43+ while (i < keys.length) {
44+ result(i) = Val .Str (pos, keys(i))
45+ i += 1
46+ }
47+ Val .Arr (pos, result)
4248 }
4349 }
4450
4551 private object ObjectFieldsAll extends Val .Builtin1 (" objectFieldsAll" , " o" ) {
4652 def evalRhs (o : Eval , ev : EvalScope , pos : Position ): Val = {
4753 val keys = getAllKeys(ev, o.value.asObj)
48- Val .Arr (pos, keys.map(k => Val .Str (pos, k)))
54+ val result = new Array [Eval ](keys.length)
55+ var i = 0
56+ while (i < keys.length) {
57+ result(i) = Val .Str (pos, keys(i))
58+ i += 1
59+ }
60+ Val .Arr (pos, result)
4961 }
5062 }
5163
@@ -54,7 +66,13 @@ object ObjectModule extends AbstractFunctionModule {
5466 val keys =
5567 if (incHidden.value.asBoolean) getAllKeys(ev, o.value.asObj)
5668 else getVisibleKeys(ev, o.value.asObj)
57- Val .Arr (pos, keys.map(k => Val .Str (pos, k)))
69+ val result = new Array [Eval ](keys.length)
70+ var i = 0
71+ while (i < keys.length) {
72+ result(i) = Val .Str (pos, keys(i))
73+ i += 1
74+ }
75+ Val .Arr (pos, result)
5876 }
5977 }
6078
@@ -165,13 +183,16 @@ object ObjectModule extends AbstractFunctionModule {
165183 pos : Position ,
166184 ev : EvalScope ,
167185 v1 : Val .Obj ,
168- keys : Array [String ]): Val .Arr =
169- Val .Arr (
170- pos,
171- keys.map { k =>
172- new LazyFunc (() => v1.value(k, pos.noOffset)(ev))
173- }
174- )
186+ keys : Array [String ]): Val .Arr = {
187+ val result = new Array [Eval ](keys.length)
188+ var i = 0
189+ while (i < keys.length) {
190+ val k = keys(i)
191+ result(i) = new LazyFunc (() => v1.value(k, pos.noOffset)(ev))
192+ i += 1
193+ }
194+ Val .Arr (pos, result)
195+ }
175196
176197 val functions : Seq [(String , Val .Func )] = Seq (
177198 builtin(ObjectHas ),
@@ -193,45 +214,43 @@ object ObjectModule extends AbstractFunctionModule {
193214 builtin(MapWithKey ),
194215 builtin(" objectKeysValues" , " o" ) { (pos, ev, o : Val .Obj ) =>
195216 val keys = getVisibleKeys(ev, o)
196- Val .Arr (
197- pos,
198- keys.map(k =>
199- Val .Obj .mk(
200- pos.fileScope.noOffsetPos,
201- " key" -> new Val .Obj .ConstMember (
202- false ,
203- Visibility .Normal ,
204- Val .Str (pos.fileScope.noOffsetPos, k)
205- ),
206- " value" -> new Val .Obj .ConstMember (
207- false ,
208- Visibility .Normal ,
209- o.value(k, pos.fileScope.noOffsetPos)(ev)
210- )
217+ val noOffsetPos = pos.fileScope.noOffsetPos
218+ val result = new Array [Eval ](keys.length)
219+ var i = 0
220+ while (i < keys.length) {
221+ val k = keys(i)
222+ result(i) = Val .Obj .mk(
223+ noOffsetPos,
224+ " key" -> new Val .Obj .ConstMember (false , Visibility .Normal , Val .Str (noOffsetPos, k)),
225+ " value" -> new Val .Obj .ConstMember (
226+ false ,
227+ Visibility .Normal ,
228+ o.value(k, noOffsetPos)(ev)
211229 )
212230 )
213- )
231+ i += 1
232+ }
233+ Val .Arr (pos, result)
214234 },
215235 builtin(" objectKeysValuesAll" , " o" ) { (pos, ev, o : Val .Obj ) =>
216236 val keys = getAllKeys(ev, o)
217- Val .Arr (
218- pos,
219- keys.map(k =>
220- Val .Obj .mk(
221- pos.fileScope.noOffsetPos,
222- " key" -> new Val .Obj .ConstMember (
223- false ,
224- Visibility .Normal ,
225- Val .Str (pos.fileScope.noOffsetPos, k)
226- ),
227- " value" -> new Val .Obj .ConstMember (
228- false ,
229- Visibility .Normal ,
230- o.value(k, pos.fileScope.noOffsetPos)(ev)
231- )
237+ val noOffsetPos = pos.fileScope.noOffsetPos
238+ val result = new Array [Eval ](keys.length)
239+ var i = 0
240+ while (i < keys.length) {
241+ val k = keys(i)
242+ result(i) = Val .Obj .mk(
243+ noOffsetPos,
244+ " key" -> new Val .Obj .ConstMember (false , Visibility .Normal , Val .Str (noOffsetPos, k)),
245+ " value" -> new Val .Obj .ConstMember (
246+ false ,
247+ Visibility .Normal ,
248+ o.value(k, noOffsetPos)(ev)
232249 )
233250 )
234- )
251+ i += 1
252+ }
253+ Val .Arr (pos, result)
235254 },
236255 builtin(" objectRemoveKey" , " obj" , " key" ) { (pos, ev, o : Val .Obj , key : String ) =>
237256 o.removeKeys(pos, key)
@@ -348,8 +367,13 @@ object ObjectModule extends AbstractFunctionModule {
348367 outArray
349368 }
350369 } else {
351- // Fallback: Use hash-based deduplication for large RHS arrays:
352- (lKeys ++ rKeys).distinct
370+ // Fallback: Use LinkedHashSet for large RHS arrays (preserves order, avoids quadratic):
371+ val allKeys = new java.util.LinkedHashSet [String ](lKeys.length + rKeys.length)
372+ var li = 0
373+ while (li < lKeys.length) { allKeys.add(lKeys(li)); li += 1 }
374+ var ri = 0
375+ while (ri < rKeys.length) { allKeys.add(rKeys(ri)); ri += 1 }
376+ allKeys.toArray(new Array [String ](allKeys.size))
353377 }
354378 }
355379 recPair(target.value, patch.value)
0 commit comments