bool validateFn(WrenVM* vm, Value arg, const char* argName) { if (IS_FN(arg) || IS_CLOSURE(arg)) return true; vm->fiber->error = wrenStringFormat(vm, "$ must be a function.", argName); return false; }
bool validateFn(WrenVM* vm, Value* args, int index, const char* argName) { if (IS_FN(args[index]) || IS_CLOSURE(args[index])) return true; args[0] = wrenStringFormat(vm, "$ must be a function.", argName); return false; }
// 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; }
static void layer_switch_on(uint8_t code) { if (!IS_FN(code)) return; fn_state_bits |= FN_BIT(code); uint8_t new_layer = (fn_state_bits ? keymap_fn_layer(biton(fn_state_bits)) : default_layer); if (current_layer != new_layer) { Kdebug("Layer Switch(on): "); Kdebug_hex(current_layer); Kdebug(" -> "); Kdebug_hex(new_layer); Kdebug("\n"); clear_keyboard_but_mods(); current_layer = new_layer; } }
static bool layer_switch_off(uint8_t code) { if (!IS_FN(code)) return false; fn_state_bits &= ~FN_BIT(code); uint8_t new_layer = (fn_state_bits ? keymap_fn_layer(biton(fn_state_bits)) : default_layer); if (current_layer != new_layer) { Kdebug("Layer Switch(off): "); Kdebug_hex(current_layer); Kdebug(" -> "); Kdebug_hex(new_layer); Kdebug("\n"); clear_keyboard_but_mods(); current_layer = new_layer; return true; } return false; }
void metaCompile(WrenVM* vm) { // Evaluate the code in the module where the calling function was defined. // That's one stack frame back from the top since the top-most frame is the // helper eval() method in Meta itself. Value callingFn = OBJ_VAL(vm->fiber->frames[vm->fiber->numFrames - 2].fn); ObjModule* module = IS_FN(callingFn) ? AS_FN(callingFn)->module : AS_CLOSURE(callingFn)->fn->module; // Compile it. ObjFn* fn = wrenCompile(vm, module, wrenGetArgumentString(vm, 1), false); if (fn == NULL) return; // Return the result. We can't use the public API for this since we have a // bare ObjFn. *vm->foreignCallSlot = OBJ_VAL(fn); vm->foreignCallSlot = NULL; }
static void bindMethod(WrenVM* vm, int methodType, int symbol, ObjClass* classObj, Value methodValue) { ObjFn* methodFn = IS_FN(methodValue) ? AS_FN(methodValue) : AS_CLOSURE(methodValue)->fn; // Methods are always bound against the class, and not the metaclass, even // for static methods, so that constructors (which are static) get bound like // instance methods. wrenBindMethodCode(classObj, methodFn); Method method; method.type = METHOD_BLOCK; method.fn.obj = AS_OBJ(methodValue); if (methodType == CODE_METHOD_STATIC) { classObj = classObj->obj.classObj; } wrenBindMethod(vm, classObj, symbol, method); }