feat: implement for-in loop syntax with iterate/iteratorValue protocol and break support
Add `for (variable in sequence)` syntax to the Wren language, introducing the `in` keyword token and compiler support for iterating over sequences using `iterate` and `iteratorValue` methods. Includes new benchmark files for Lua, Python, Ruby, and Wren, plus test cases covering single-expression bodies, block bodies, closures over loop variables, and break statements. Also fixes a missing POP() in CLOSE_UPVALUE and moves the while test file to a subdirectory.
This commit is contained in:
@@ -1,37 +0,0 @@
|
||||
Value is just Obj* and all values are boxed.
|
||||
→ time ../build/Release/wren fib.wren
|
||||
9.22746e+06
|
||||
|
||||
real 0m12.688s
|
||||
user 0m12.076s
|
||||
sys 0m0.601s
|
||||
|
||||
---
|
||||
|
||||
Unboxed singletons and numbers. Value is a struct of ValueType, double, Obj* obj.
|
||||
→ time ../build/Release/wren fib.wren
|
||||
9.22746e+06
|
||||
|
||||
real 0m3.233s
|
||||
user 0m3.229s
|
||||
sys 0m0.003s
|
||||
|
||||
---
|
||||
|
||||
NaN tagged values.
|
||||
→ time ../build/Release/wren fib.wren
|
||||
9.22746e+06
|
||||
|
||||
real 0m3.100s
|
||||
user 0m3.097s
|
||||
sys 0m0.002s
|
||||
|
||||
---
|
||||
|
||||
Hoist bytecode and IP into locals in interpret loop.
|
||||
→ time ../build/Release/wren fib.wren
|
||||
9.22746e+06
|
||||
|
||||
real 0m2.490s
|
||||
user 0m2.487s
|
||||
sys 0m0.002s
|
||||
@@ -0,0 +1,12 @@
|
||||
local list = {}
|
||||
for i = 0, 1999999 do
|
||||
list[i] = i
|
||||
end
|
||||
|
||||
local start = os.clock()
|
||||
local sum = 0
|
||||
for k, i in pairs(list) do
|
||||
sum = sum + i
|
||||
end
|
||||
io.write(sum .. "\n")
|
||||
io.write(string.format("elapsed: %.8f\n", os.clock() - start))
|
||||
@@ -0,0 +1,10 @@
|
||||
import time
|
||||
|
||||
list = range(0, 2000000)
|
||||
|
||||
start = time.clock()
|
||||
sum = 0
|
||||
for i in list:
|
||||
sum += i
|
||||
print(sum)
|
||||
print("elapsed: " + str(time.clock() - start))
|
||||
@@ -0,0 +1,7 @@
|
||||
list = Array.new(2000000) {|i| i}
|
||||
|
||||
start = Time.now
|
||||
sum = 0
|
||||
list.each {|i| sum += i}
|
||||
puts sum
|
||||
puts "elapsed: " + (Time.now - start).to_s
|
||||
@@ -0,0 +1,17 @@
|
||||
var list = []
|
||||
|
||||
{
|
||||
var i = 0
|
||||
while (i < 2000000) {
|
||||
list.add(i)
|
||||
i = i + 1
|
||||
}
|
||||
}
|
||||
|
||||
var start = OS.clock
|
||||
var sum = 0
|
||||
for (i in list) {
|
||||
sum = sum + i
|
||||
}
|
||||
IO.write(sum)
|
||||
IO.write("elapsed: " + (OS.clock - start).toString)
|
||||
@@ -30,6 +30,8 @@ BENCHMARK("fib", r"""317811
|
||||
317811
|
||||
317811""")
|
||||
|
||||
BENCHMARK("for", r"""1999999000000""")
|
||||
|
||||
BENCHMARK("method_call", r"""true
|
||||
false""")
|
||||
|
||||
|
||||
Reference in New Issue
Block a user