feat: allow passing initial value to fiber function parameter on first call

When a fiber is started for the first time via call() or transfer(), the value argument is now bound to the fiber's function parameter if it takes one. Previously, the first value was always ignored. Also adds runtime error for fibers created with functions taking more than one parameter, and updates documentation and tests accordingly.
This commit is contained in:
Bob Nystrom
2017-10-20 03:45:13 +00:00
parent 3452b70666
commit 1be81bde81
12 changed files with 182 additions and 86 deletions
+1 -1
View File
@@ -3,5 +3,5 @@ var fiber = Fiber.new {
}
System.print("before") // expect: before
fiber.call() // expect: fiber
fiber.call() // expect: fiber
System.print("after") // expect: after
+7
View File
@@ -0,0 +1,7 @@
var fiber = Fiber.new {|value|
System.print(value)
}
System.print("before") // expect: before
fiber.call() // expect: null
System.print("after") // expect: after
+3 -5
View File
@@ -2,8 +2,6 @@ var fiber = Fiber.new {
System.print("fiber")
}
// The first value passed to the fiber is ignored, since there's no yield call
// to return it.
System.print("before") // expect: before
fiber.call("ignored") // expect: fiber
System.print("after") // expect: after
System.print("before") // expect: before
fiber.call("value") // expect: fiber
System.print("after") // expect: after
@@ -0,0 +1,7 @@
var fiber = Fiber.new {|value|
System.print(value)
}
System.print("before") // expect: before
fiber.call("value") // expect: value
System.print("after") // expect: after
+1
View File
@@ -0,0 +1 @@
var fiber = Fiber.new {|a, b| null } // expect runtime error: Function cannot take more than one parameter.
@@ -0,0 +1,24 @@
var a = Fiber.new {|param|
System.print("a %(param)")
}
var b = Fiber.new {|param|
System.print("b before %(param)")
a.transfer()
System.print("b after")
}
var c = Fiber.new {|param|
System.print("c before %(param)")
b.transfer()
System.print("c after")
}
System.print("start") // expect: start
c.transfer()
// expect: c before null
// expect: b before null
// expect: a null
// Nothing else gets run since the interpreter stops after a completes.
@@ -0,0 +1,24 @@
var a = Fiber.new {|param|
System.print("a %(param)")
}
var b = Fiber.new {|param|
System.print("b before %(param)")
a.transfer("from b")
System.print("b after")
}
var c = Fiber.new {|param|
System.print("c before %(param)")
b.transfer("from c")
System.print("c after")
}
System.print("start") // expect: start
c.transfer("from main")
// expect: c before from main
// expect: b before from c
// expect: a from b
// Nothing else gets run since the interpreter stops after a completes.
+3 -3
View File
@@ -7,8 +7,8 @@ var fiber = Fiber.new {
}
System.print(fiber.call()) // expect: fiber 1
// expect: yield 1
// expect: yield 1
System.print(fiber.call()) // expect: fiber 2
// expect: yield 2
// expect: yield 2
System.print(fiber.call()) // expect: fiber 3
// expect: null
// expect: null