Fiber.create -> new Fiber

This commit is contained in:
Bob Nystrom
2014-04-04 18:24:55 -07:00
parent f5a9f39568
commit 2da8025cd4
17 changed files with 38 additions and 27 deletions

View File

@ -81,6 +81,16 @@ static const char* libSource =
"\n"
"class Range is Sequence {}\n";
// Validates that the given argument in [args] is a function. Returns true if
// it is. If not, reports an error and returns false.
static bool validateFn(WrenVM* vm, Value* args, int index, const char* argName)
{
if (IS_FN(args[index]) || IS_CLOSURE(args[index])) return true;
args[0] = OBJ_VAL(wrenStringConcat(vm, argName, " must be a function."));
return false;
}
// Validates that the given argument in [args] is a Num. Returns true if it is.
// If not, reports an error and returns false.
static bool validateNum(WrenVM* vm, Value* args, int index, const char* argName)
@ -183,12 +193,16 @@ DEF_NATIVE(class_name)
RETURN_OBJ(classObj->name);
}
DEF_NATIVE(fiber_create)
DEF_NATIVE(fiber_instantiate)
{
if (!IS_FN(args[1]) && !IS_CLOSURE(args[1]))
{
RETURN_ERROR("Argument must be a function.");
}
// Return the Fiber class itself. When we then call "new" on it, it will
// create the fiber.
RETURN_VAL(args[0]);
}
DEF_NATIVE(fiber_new)
{
if (!validateFn(vm, args, 1, "Argument")) return PRIM_ERROR;
ObjFiber* newFiber = wrenNewFiber(vm, AS_OBJ(args[1]));
@ -301,17 +315,14 @@ static PrimitiveResult callFunction(WrenVM* vm, Value* args, int numArgs)
DEF_NATIVE(fn_instantiate)
{
// Return the Function class itself. When we then call "new" on it, it will
// Return the Fn class itself. When we then call "new" on it, it will
// return the block.
RETURN_VAL(args[0]);
}
DEF_NATIVE(fn_new)
{
if (!IS_FN(args[1]) && !IS_CLOSURE(args[1]))
{
RETURN_ERROR("Argument must be a function.");
}
if (!validateFn(vm, args, 1, "Argument")) return PRIM_ERROR;
// The block argument is already a function, so just return it.
RETURN_VAL(args[1]);
@ -957,8 +968,8 @@ void wrenInitializeCore(WrenVM* vm)
NATIVE(vm->boolClass, "!", bool_not);
vm->fiberClass = defineClass(vm, "Fiber");
// TODO: Is there a way we can make this a regular constructor?
NATIVE(vm->fiberClass->metaclass, "create ", fiber_create);
NATIVE(vm->fiberClass->metaclass, "instantiate", fiber_instantiate);
NATIVE(vm->fiberClass->metaclass, "new ", fiber_new);
NATIVE(vm->fiberClass->metaclass, "yield", fiber_yield);
NATIVE(vm->fiberClass->metaclass, "yield ", fiber_yield1);
NATIVE(vm->fiberClass, "isDone", fiber_isDone);

View File

@ -3,7 +3,7 @@ var closure
{
var a = "before"
fiber = Fiber.create {
fiber = new Fiber {
IO.print(a)
Fiber.yield
a = "after"

View File

@ -1 +0,0 @@
var fiber = Fiber.create("not fn") // expect runtime error: Argument must be a function.

View File

@ -1,4 +1,4 @@
var fiber = Fiber.create {
var fiber = new Fiber {
IO.print("1")
Fiber.yield
IO.print("2")

View File

@ -0,0 +1 @@
var fiber = new Fiber("not fn") // expect runtime error: Argument must be a function.

View File

@ -1,8 +1,8 @@
var b = Fiber.create {
var b = new Fiber {
IO.print("fiber b")
}
var a = Fiber.create {
var a = new Fiber {
IO.print("begin fiber a")
b.run
IO.print("end fiber a")

View File

@ -1,4 +1,4 @@
var fiber = Fiber.create {
var fiber = new Fiber {
IO.print("fiber")
}

View File

@ -1,4 +1,4 @@
var fiber = Fiber.create {
var fiber = new Fiber {
IO.print("fiber")
}

View File

@ -1,4 +1,4 @@
var fiber = Fiber.create {
var fiber = new Fiber {
IO.print("fiber")
return "result"
}

View File

@ -1,4 +1,4 @@
var fiber = Fiber.create {
var fiber = new Fiber {
IO.print("run")
}

View File

@ -1,4 +1,4 @@
var fiber = Fiber.create {
var fiber = new Fiber {
IO.print("fiber")
}

View File

@ -1,4 +1,4 @@
var fiber = Fiber.create {
var fiber = new Fiber {
IO.print("run")
}

View File

@ -1,4 +1,4 @@
var fiber = Fiber.create {}
var fiber = new Fiber {}
IO.print(fiber is Fiber) // expect: true
IO.print(fiber is Object) // expect: true
IO.print(fiber is Bool) // expect: false

View File

@ -1,4 +1,4 @@
var fiber = Fiber.create {
var fiber = new Fiber {
IO.print("fiber 1")
Fiber.yield
IO.print("fiber 2")

View File

@ -1,4 +1,4 @@
var fiber = Fiber.create {
var fiber = new Fiber {
IO.print("fiber 1")
var result = Fiber.yield
IO.print(result)

View File

@ -1,4 +1,4 @@
var fiber = Fiber.create {
var fiber = new Fiber {
IO.print("fiber 1")
Fiber.yield("yield 1")
IO.print("fiber 2")