int JavaObject::getObjectId(JSContext* ctx, JSObject* obj) { jsval val; const JSClass* jsClass = JS_GET_CLASS(ctx, obj); if (jsClass != &JavaObjectClass) { Debug::log(Debug::Error) << "JavaObject::getObjectId called on non-JavaObject: " << jsClass->name << Debug::flush; return -1; } if (JSCLASS_RESERVED_SLOTS(jsClass) < 1) { Debug::log(Debug::Error) << "JavaObject::getObjectId -- " << static_cast<void*>(obj) << " has only " << (JSCLASS_RESERVED_SLOTS(jsClass)) << " reserved slots, no objectId present" << Debug::flush; return -1; } #if GECKO_VERSION >= 13000 val = JS_GetReservedSlot(obj, 0); #else if (!JS_GetReservedSlot(ctx, obj, 0, &val)) { Debug::log(Debug::Error) << "Error getting reserved slot" << Debug::flush; return -1; } #endif // TODO: assert JSVAL_IS_INT(val) return JSVAL_TO_INT(val); }
static JSObject* FindNamedConstructorForXray( JSContext* aCx, JS::Handle<jsid> aId, const WebIDLNameTableEntry* aEntry) { JSObject* interfaceObject = GetPerInterfaceObjectHandle(aCx, aEntry->mConstructorId, aEntry->mCreate, /* aDefineOnGlobal = */ false); if (!interfaceObject) { return nullptr; } // This is a call over Xrays, so we will actually use the return value // (instead of just having it defined on the global now). Check for named // constructors with this id, in case that's what the caller is asking for. for (unsigned slot = DOM_INTERFACE_SLOTS_BASE; slot < JSCLASS_RESERVED_SLOTS(js::GetObjectClass(interfaceObject)); ++slot) { JSObject* constructor = &js::GetReservedSlot(interfaceObject, slot).toObject(); if (JS_GetFunctionId(JS_GetObjectFunction(constructor)) == JSID_TO_STRING(aId)) { return constructor; } } // None of the named constructors match, so the caller must want the // interface object itself. return interfaceObject; }