static JSObject * InitErrorClass(JSContext *cx, GlobalObject *global, intN type, JSObject &proto) { JSProtoKey key = GetExceptionProtoKey(type); JSAtom *name = cx->runtime->atomState.classAtoms[key]; JSObject *errorProto = global->createBlankPrototypeInheriting(cx, &ErrorClass, proto); if (!errorProto) return NULL; Value empty = StringValue(cx->runtime->emptyString); jsid nameId = ATOM_TO_JSID(cx->runtime->atomState.nameAtom); jsid messageId = ATOM_TO_JSID(cx->runtime->atomState.messageAtom); jsid fileNameId = ATOM_TO_JSID(cx->runtime->atomState.fileNameAtom); jsid lineNumberId = ATOM_TO_JSID(cx->runtime->atomState.lineNumberAtom); if (!DefineNativeProperty(cx, errorProto, nameId, StringValue(name), JS_PropertyStub, JS_StrictPropertyStub, 0, 0, 0) || !DefineNativeProperty(cx, errorProto, messageId, empty, JS_PropertyStub, JS_StrictPropertyStub, 0, 0, 0) || !DefineNativeProperty(cx, errorProto, fileNameId, empty, JS_PropertyStub, JS_StrictPropertyStub, JSPROP_ENUMERATE, 0, 0) || !DefineNativeProperty(cx, errorProto, lineNumberId, Int32Value(0), JS_PropertyStub, JS_StrictPropertyStub, JSPROP_ENUMERATE, 0, 0)) { return NULL; } /* Create the corresponding constructor. */ JSFunction *ctor = global->createConstructor(cx, Exception, &ErrorClass, name, 1); if (!ctor) return NULL; ctor->setReservedSlot(JSSLOT_ERROR_EXNTYPE, Int32Value(int32(type))); if (!LinkConstructorAndPrototype(cx, ctor, errorProto)) return NULL; if (!DefineConstructorAndPrototype(cx, global, key, ctor, errorProto)) return NULL; JS_ASSERT(!errorProto->getPrivate()); return errorProto; }