forked from Mirror/wren
Allow passing a value when first starting a fiber.
If the function the fiber is created from takes a parameter, the value passed to the first call() or transfer() gets bound to that parameter. Also, this now correctly handles fibers with functions that take parameters. It used to leave the stack in a busted state. Now, it's a runtime error to create a fiber with a function that takes any more than one parameter.
This commit is contained in:
@ -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
test/core/fiber/call_to_parameter.wren
Normal file
7
test/core/fiber/call_to_parameter.wren
Normal 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
|
||||
@ -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
|
||||
|
||||
7
test/core/fiber/call_with_value_to_parameter.wren
Normal file
7
test/core/fiber/call_with_value_to_parameter.wren
Normal file
@ -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
test/core/fiber/new_wrong_arity.wren
Normal file
1
test/core/fiber/new_wrong_arity.wren
Normal file
@ -0,0 +1 @@
|
||||
var fiber = Fiber.new {|a, b| null } // expect runtime error: Function cannot take more than one parameter.
|
||||
24
test/core/fiber/transfer_to_parameter.wren
Normal file
24
test/core/fiber/transfer_to_parameter.wren
Normal file
@ -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.
|
||||
24
test/core/fiber/transfer_with_value_to_parameter.wren
Normal file
24
test/core/fiber/transfer_with_value_to_parameter.wren
Normal file
@ -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.
|
||||
@ -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
|
||||
|
||||
Reference in New Issue
Block a user