From 2da8025cd4cfe43a0f37331f7d79136e78fd913c Mon Sep 17 00:00:00 2001 From: Bob Nystrom Date: Fri, 4 Apr 2014 18:24:55 -0700 Subject: [PATCH] Fiber.create -> new Fiber --- src/wren_core.c | 35 ++++++++++++------- test/fiber/closure.wren | 2 +- test/fiber/create_wrong_arg_type.wren | 1 - test/fiber/is_done.wren | 2 +- test/fiber/new_wrong_arg_type.wren | 1 + test/fiber/resume_caller.wren | 4 +-- test/fiber/run.wren | 2 +- test/fiber/run_return_implicit_null.wren | 2 +- test/fiber/run_return_value.wren | 2 +- test/fiber/run_when_done.wren | 2 +- test/fiber/run_with_value.wren | 2 +- test/fiber/run_with_value_when_done.wren | 2 +- test/fiber/type.wren | 2 +- test/fiber/yield.wren | 2 +- test/fiber/yield_return_value.wren | 2 +- test/fiber/yield_with_value.wren | 2 +- ...ment_type.wren => new_wrong_arg_type.wren} | 0 17 files changed, 38 insertions(+), 27 deletions(-) delete mode 100644 test/fiber/create_wrong_arg_type.wren create mode 100644 test/fiber/new_wrong_arg_type.wren rename test/function/{new_with_wrong_argument_type.wren => new_wrong_arg_type.wren} (100%) diff --git a/src/wren_core.c b/src/wren_core.c index dc7cb2da..996c4d0f 100644 --- a/src/wren_core.c +++ b/src/wren_core.c @@ -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); diff --git a/test/fiber/closure.wren b/test/fiber/closure.wren index 8c1350f3..1d949b92 100644 --- a/test/fiber/closure.wren +++ b/test/fiber/closure.wren @@ -3,7 +3,7 @@ var closure { var a = "before" - fiber = Fiber.create { + fiber = new Fiber { IO.print(a) Fiber.yield a = "after" diff --git a/test/fiber/create_wrong_arg_type.wren b/test/fiber/create_wrong_arg_type.wren deleted file mode 100644 index e5209216..00000000 --- a/test/fiber/create_wrong_arg_type.wren +++ /dev/null @@ -1 +0,0 @@ -var fiber = Fiber.create("not fn") // expect runtime error: Argument must be a function. diff --git a/test/fiber/is_done.wren b/test/fiber/is_done.wren index d1094352..945f0c28 100644 --- a/test/fiber/is_done.wren +++ b/test/fiber/is_done.wren @@ -1,4 +1,4 @@ -var fiber = Fiber.create { +var fiber = new Fiber { IO.print("1") Fiber.yield IO.print("2") diff --git a/test/fiber/new_wrong_arg_type.wren b/test/fiber/new_wrong_arg_type.wren new file mode 100644 index 00000000..8d2ed726 --- /dev/null +++ b/test/fiber/new_wrong_arg_type.wren @@ -0,0 +1 @@ +var fiber = new Fiber("not fn") // expect runtime error: Argument must be a function. diff --git a/test/fiber/resume_caller.wren b/test/fiber/resume_caller.wren index 768cf6eb..14765943 100644 --- a/test/fiber/resume_caller.wren +++ b/test/fiber/resume_caller.wren @@ -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") diff --git a/test/fiber/run.wren b/test/fiber/run.wren index bbae51a4..9c9baca6 100644 --- a/test/fiber/run.wren +++ b/test/fiber/run.wren @@ -1,4 +1,4 @@ -var fiber = Fiber.create { +var fiber = new Fiber { IO.print("fiber") } diff --git a/test/fiber/run_return_implicit_null.wren b/test/fiber/run_return_implicit_null.wren index 0483e525..4e406b1a 100644 --- a/test/fiber/run_return_implicit_null.wren +++ b/test/fiber/run_return_implicit_null.wren @@ -1,4 +1,4 @@ -var fiber = Fiber.create { +var fiber = new Fiber { IO.print("fiber") } diff --git a/test/fiber/run_return_value.wren b/test/fiber/run_return_value.wren index b1fc3948..c8adc517 100644 --- a/test/fiber/run_return_value.wren +++ b/test/fiber/run_return_value.wren @@ -1,4 +1,4 @@ -var fiber = Fiber.create { +var fiber = new Fiber { IO.print("fiber") return "result" } diff --git a/test/fiber/run_when_done.wren b/test/fiber/run_when_done.wren index c28900e2..24231fb1 100644 --- a/test/fiber/run_when_done.wren +++ b/test/fiber/run_when_done.wren @@ -1,4 +1,4 @@ -var fiber = Fiber.create { +var fiber = new Fiber { IO.print("run") } diff --git a/test/fiber/run_with_value.wren b/test/fiber/run_with_value.wren index 68b63cab..9a201518 100644 --- a/test/fiber/run_with_value.wren +++ b/test/fiber/run_with_value.wren @@ -1,4 +1,4 @@ -var fiber = Fiber.create { +var fiber = new Fiber { IO.print("fiber") } diff --git a/test/fiber/run_with_value_when_done.wren b/test/fiber/run_with_value_when_done.wren index d6ba415a..fbcd1d8c 100644 --- a/test/fiber/run_with_value_when_done.wren +++ b/test/fiber/run_with_value_when_done.wren @@ -1,4 +1,4 @@ -var fiber = Fiber.create { +var fiber = new Fiber { IO.print("run") } diff --git a/test/fiber/type.wren b/test/fiber/type.wren index 613f554d..1c69deff 100644 --- a/test/fiber/type.wren +++ b/test/fiber/type.wren @@ -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 diff --git a/test/fiber/yield.wren b/test/fiber/yield.wren index 50cb39ee..5f2c0992 100644 --- a/test/fiber/yield.wren +++ b/test/fiber/yield.wren @@ -1,4 +1,4 @@ -var fiber = Fiber.create { +var fiber = new Fiber { IO.print("fiber 1") Fiber.yield IO.print("fiber 2") diff --git a/test/fiber/yield_return_value.wren b/test/fiber/yield_return_value.wren index 86dcf5c3..3314a31e 100644 --- a/test/fiber/yield_return_value.wren +++ b/test/fiber/yield_return_value.wren @@ -1,4 +1,4 @@ -var fiber = Fiber.create { +var fiber = new Fiber { IO.print("fiber 1") var result = Fiber.yield IO.print(result) diff --git a/test/fiber/yield_with_value.wren b/test/fiber/yield_with_value.wren index f1ae7686..9ed579c0 100644 --- a/test/fiber/yield_with_value.wren +++ b/test/fiber/yield_with_value.wren @@ -1,4 +1,4 @@ -var fiber = Fiber.create { +var fiber = new Fiber { IO.print("fiber 1") Fiber.yield("yield 1") IO.print("fiber 2") diff --git a/test/function/new_with_wrong_argument_type.wren b/test/function/new_wrong_arg_type.wren similarity index 100% rename from test/function/new_with_wrong_argument_type.wren rename to test/function/new_wrong_arg_type.wren