uint64_t js::TaggedProto::uniqueId() const { if (isLazy()) return uint64_t(1); JSObject* obj = toObjectOrNull(); if (!obj) return uint64_t(0); return obj->zone()->getUniqueIdInfallible(obj); }
bool rs::jsapi::Object::CallFunction(JSContext* cx, unsigned argc, JS::Value* vp) { JSAutoRequest ar(cx); char nameBuffer[256]; const char* name = nameBuffer; auto args = JS::CallArgsFromVp(argc, vp); auto func = JS_ValueToFunction(cx, args.calleev()); if (func != nullptr) { auto funcName = JS_GetFunctionId(func); if (funcName != nullptr) { auto nameLength = JS_EncodeStringToBuffer(cx, funcName, nameBuffer, sizeof(nameBuffer)); if ((nameLength + 1) < sizeof(nameBuffer)) { nameBuffer[nameLength] = '\0'; } else { std::vector<char> vBuffer(nameLength + 1); JS_EncodeStringToBuffer(cx, funcName, &vBuffer[0], nameLength); vBuffer[nameLength] = '\0'; name = &vBuffer[0]; } } } if (name == nullptr) { // TODO: test this case JS_ReportError(cx, "Unable to find function in libjsapi object"); return false; } else { auto that = args.thisv(); auto state = that.isObjectOrNull() ? Object::GetState(cx, JS::RootedObject(cx, that.toObjectOrNull())) : nullptr; if (state == nullptr) { // TODO: test this case JS_ReportError(cx, "Unable to find function callback in libjsapi object"); return false; } else { try { static thread_local std::vector<Value> vArgs; VectorUtils::ScopedVectorCleaner<Value> clean(vArgs); for (int i = 0; i < argc; ++i) { vArgs.emplace_back(cx, args.get(i)); } Value result(cx); state->functions[name](vArgs, result); args.rval().set(result); return true; } catch (const std::exception& ex) { JS_ReportError(cx, ex.what()); return false; } } } }