ObjClass* wrenNewClass(WrenVM* vm, ObjClass* superclass, int numFields, ObjString* name) { // Create the metaclass. Value metaclassName = wrenStringFormat(vm, "@ metaclass", OBJ_VAL(name)); wrenPushRoot(vm, AS_OBJ(metaclassName)); ObjClass* metaclass = wrenNewSingleClass(vm, 0, AS_STRING(metaclassName)); metaclass->obj.classObj = vm->classClass; wrenPopRoot(vm); // Make sure the metaclass isn't collected when we allocate the class. wrenPushRoot(vm, (Obj*)metaclass); // Metaclasses always inherit Class and do not parallel the non-metaclass // hierarchy. wrenBindSuperclass(vm, metaclass, vm->classClass); ObjClass* classObj = wrenNewSingleClass(vm, numFields, name); // Make sure the class isn't collected while the inherited methods are being // bound. wrenPushRoot(vm, (Obj*)classObj); classObj->obj.classObj = metaclass; wrenBindSuperclass(vm, classObj, superclass); wrenPopRoot(vm); wrenPopRoot(vm); return classObj; }
// Creates either the Object or Class class in the core module with [name]. static ObjClass* defineClass(WrenVM* vm, ObjModule* module, const char* name) { ObjString* nameString = AS_STRING(wrenStringFormat(vm, "$", name)); wrenPushRoot(vm, (Obj*)nameString); ObjClass* classObj = wrenNewSingleClass(vm, 0, nameString); wrenDefineVariable(vm, module, name, nameString->length, OBJ_VAL(classObj)); wrenPopRoot(vm); return classObj; }
static ObjClass* defineSingleClass(WrenVM* vm, const char* name) { size_t length = strlen(name); ObjString* nameString = AS_STRING(wrenNewString(vm, name, length)); WREN_PIN(vm, nameString); ObjClass* classObj = wrenNewSingleClass(vm, 0, nameString); wrenDefineGlobal(vm, name, length, OBJ_VAL(classObj)); WREN_UNPIN(vm); return classObj; }
ObjClass* wrenNewClass(WrenVM* vm, ObjClass* superclass, int numFields, ObjString* name) { WREN_PIN(vm, name); // Create the metaclass. ObjString* metaclassName = wrenStringConcat(vm, name->value, " metaclass"); WREN_PIN(vm, metaclassName); ObjClass* metaclass = wrenNewSingleClass(vm, 0, metaclassName); metaclass->obj.classObj = vm->classClass; WREN_UNPIN(vm); // Make sure the metaclass isn't collected when we allocate the class. WREN_PIN(vm, metaclass); // Metaclasses always inherit Class and do not parallel the non-metaclass // hierarchy. wrenBindSuperclass(vm, metaclass, vm->classClass); ObjClass* classObj = wrenNewSingleClass(vm, numFields, name); // Make sure the class isn't collected while the inherited methods are being // bound. WREN_PIN(vm, classObj); classObj->obj.classObj = metaclass; wrenBindSuperclass(vm, classObj, superclass); WREN_UNPIN(vm); WREN_UNPIN(vm); WREN_UNPIN(vm); return classObj; }