// static void XPCThrower::Verbosify(XPCCallContext& ccx, char** psz, PRBool own) { char* sz = nsnull; if(ccx.HasInterfaceAndMember()) { XPCNativeInterface* iface = ccx.GetInterface(); jsid id = ccx.GetMember()->GetName(); JSAutoByteString bytes; const char *name = JSID_IS_VOID(id) ? "Unknown" : bytes.encode(ccx, JSID_TO_STRING(id)); if(!name) { name = ""; } sz = JS_smprintf("%s [%s.%s]", *psz, iface->GetNameString(), name); } if(sz) { if(own) JS_smprintf_free(*psz); *psz = sz; } }
/* bool newResolve (in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx, in JSObjectPtr obj, in jsid id, in PRUint32 flags, out JSObjectPtr objp); */ NS_IMETHODIMP calDateTime::NewResolve(nsIXPConnectWrappedNative *wrapper, JSContext * cx, JSObject * obj, jsid id, PRUint32 flags, JSObject * *objp, bool *_retval) { NS_ENSURE_ARG_POINTER(objp); NS_ENSURE_ARG_POINTER(_retval); if (JSID_IS_STRING(id)) { size_t length; JSString *idString = JSID_TO_STRING(id); const jschar *str = JS_GetStringCharsAndLength(cx, idString, &length); nsDependentString const name(reinterpret_cast<PRUnichar const*>(str), length); if (name.EqualsLiteral("jsDate")) { *_retval = JS_DefineUCProperty(cx, obj, str, length, JSVAL_VOID, nsnull, nsnull, 0); *objp = obj; return *_retval ? NS_OK : NS_ERROR_FAILURE; } } *_retval = PR_TRUE; return NS_OK; }
JSBool getProperty(JSContext *cx, JS::HandleObject obj, JS::HandleId id, JS::MutableHandleValue vp) { JSString *propName=JSID_TO_STRING(id); printf("in getProperty %s[%ld]=%s\n",JS_EncodeString(cx,propName),JSID_BITS(id.get()),JS_EncodeString(cx,JS_ValueToString(cx,vp.get()))); return true; }
static void ScanTypeObject(GCMarker *gcmarker, types::TypeObject *type) { /* Don't mark properties for singletons. They'll be purged by the GC. */ if (!type->singleton) { unsigned count = type->getPropertyCount(); for (unsigned i = 0; i < count; i++) { types::Property *prop = type->getProperty(i); if (prop && JSID_IS_STRING(prop->id)) PushMarkStack(gcmarker, JSID_TO_STRING(prop->id)); } } if (TaggedProto(type->proto).isObject()) PushMarkStack(gcmarker, type->proto); if (type->singleton && !type->lazy()) PushMarkStack(gcmarker, type->singleton); if (type->newScript) { PushMarkStack(gcmarker, type->newScript->fun); PushMarkStack(gcmarker, type->newScript->shape); } if (type->interpretedFunction) PushMarkStack(gcmarker, type->interpretedFunction); }
static bool IsFrameId(JSContext* cx, JSObject* obj, jsid idArg) { MOZ_ASSERT(!js::IsWrapper(obj)); RootedId id(cx, idArg); nsGlobalWindow* win = WindowOrNull(obj); if (!win) { return false; } nsCOMPtr<nsIDOMWindowCollection> col = win->GetFrames(); if (!col) { return false; } nsCOMPtr<nsIDOMWindow> domwin; if (JSID_IS_INT(id)) { col->Item(JSID_TO_INT(id), getter_AddRefs(domwin)); } else if (JSID_IS_STRING(id)) { nsAutoJSString idAsString; if (!idAsString.init(cx, JSID_TO_STRING(id))) { return false; } col->NamedItem(idAsString, getter_AddRefs(domwin)); } return domwin != nullptr; }
static void ScanTypeObject(GCMarker *gcmarker, types::TypeObject *type) { if (!type->singleton) { unsigned count = type->getPropertyCount(); for (unsigned i = 0; i < count; i++) { types::Property *prop = type->getProperty(i); if (prop && JSID_IS_STRING(prop->id)) PushMarkStack(gcmarker, JSID_TO_STRING(prop->id)); } } if (type->proto) PushMarkStack(gcmarker, type->proto); if (type->newScript) { PushMarkStack(gcmarker, type->newScript->fun); PushMarkStack(gcmarker, type->newScript->shape); } if (type->interpretedFunction) PushMarkStack(gcmarker, type->interpretedFunction); if (type->singleton && !type->lazy()) PushMarkStack(gcmarker, type->singleton); if (type->interpretedFunction) PushMarkStack(gcmarker, type->interpretedFunction); }
bool rs::jsapi::Object::Get(JSContext* cx, JS::HandleObject obj, JS::HandleId id, JS::MutableHandleValue vp) { JSAutoRequest ar(cx); auto state = Object::GetState(cx, obj); if (state != nullptr && state->getter != nullptr) { Value value(cx); auto name = JSID_TO_STRING(id); char nameBuffer[256]; auto nameLength = JS_EncodeStringToBuffer(cx, name, nameBuffer, sizeof(nameBuffer) - 1); try { value.setUndefined(); if (nameLength < sizeof(nameBuffer)) { nameBuffer[nameLength] = '\0'; state->getter(nameBuffer, value); } else { std::vector<char> nameVector(nameLength + 1); nameLength = JS_EncodeStringToBuffer(cx, name, &nameVector[0], nameVector.size() - 1); nameVector[nameLength] = '\0'; state->getter(&nameVector[0], value); } vp.set(value); return true; } catch (const std::exception& ex) { JS_ReportError(cx, ex.what()); return false; } } else { vp.setUndefined(); return true; } }
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; }
StringData ObjectWrapper::Key::toStringData(JSContext* cx, JSStringWrapper* jsstr) { if (_type == Type::Field) { return _field; } if (_type == Type::Index) { *jsstr = JSStringWrapper(_idx); return jsstr->toStringData(); } JS::RootedId rid(cx); if (_type == Type::Id) { rid.set(_id); } else { InternedStringId id(cx, _internedString); rid.set(id); } if (JSID_IS_INT(rid)) { *jsstr = JSStringWrapper(JSID_TO_INT(rid)); return jsstr->toStringData(); } if (JSID_IS_STRING(rid)) { *jsstr = JSStringWrapper(cx, JSID_TO_STRING(rid)); return jsstr->toStringData(); } uasserted(ErrorCodes::BadValue, "Couldn't convert key to String"); }
bool doResolve(JS::HandleObject obj, JS::HandleId id, bool* resolvedp) { CHECK_EQUAL(resolveExitCount, 0); AutoIncrCounters incr(this); CHECK(obj == obj1 || obj == obj2); CHECK(JSID_IS_STRING(id)); JSFlatString* str = JS_FlattenString(cx, JSID_TO_STRING(id)); CHECK(str); JS::RootedValue v(cx); if (JS_FlatStringEqualsAscii(str, "x")) { if (obj == obj1) { /* First resolve hook invocation. */ CHECK_EQUAL(resolveEntryCount, 1); EVAL("obj2.y = true", &v); CHECK(v.isTrue()); CHECK(JS_DefinePropertyById(cx, obj, id, JS::FalseHandleValue, JSPROP_RESOLVING)); *resolvedp = true; return true; } if (obj == obj2) { CHECK_EQUAL(resolveEntryCount, 4); *resolvedp = false; return true; } } else if (JS_FlatStringEqualsAscii(str, "y")) { if (obj == obj2) { CHECK_EQUAL(resolveEntryCount, 2); CHECK(JS_DefinePropertyById(cx, obj, id, JS::NullHandleValue, JSPROP_RESOLVING)); EVAL("obj1.x", &v); CHECK(v.isUndefined()); EVAL("obj1.y", &v); CHECK(v.isInt32(0)); *resolvedp = true; return true; } if (obj == obj1) { CHECK_EQUAL(resolveEntryCount, 3); EVAL("obj1.x", &v); CHECK(v.isUndefined()); EVAL("obj1.y", &v); CHECK(v.isUndefined()); EVAL("obj2.y", &v); CHECK(v.isNull()); EVAL("obj2.x", &v); CHECK(v.isUndefined()); EVAL("obj1.y = 0", &v); CHECK(v.isInt32(0)); *resolvedp = true; return true; } } CHECK(false); return false; }
bool doResolve(JSObject *obj, jsid id, uintN flags, JSObject **objp) { CHECK_EQUAL(resolveExitCount, 0); AutoIncrCounters incr(this); CHECK_EQUAL(obj, obj1 || obj == obj2); CHECK(JSID_IS_STRING(id)); JSFlatString *str = JS_FlattenString(cx, JSID_TO_STRING(id)); CHECK(str); jsval v; if (JS_FlatStringEqualsAscii(str, "x")) { if (obj == obj1) { /* First resolve hook invocation. */ CHECK_EQUAL(resolveEntryCount, 1); EVAL("obj2.y = true", &v); CHECK_SAME(v, JSVAL_TRUE); CHECK(JS_DefinePropertyById(cx, obj, id, JSVAL_FALSE, NULL, NULL, 0)); *objp = obj; return true; } if (obj == obj2) { CHECK_EQUAL(resolveEntryCount, 4); *objp = NULL; return true; } } else if (JS_FlatStringEqualsAscii(str, "y")) { if (obj == obj2) { CHECK_EQUAL(resolveEntryCount, 2); CHECK(JS_DefinePropertyById(cx, obj, id, JSVAL_NULL, NULL, NULL, 0)); EVAL("obj1.x", &v); CHECK(JSVAL_IS_VOID(v)); EVAL("obj1.y", &v); CHECK_SAME(v, JSVAL_ZERO); *objp = obj; return true; } if (obj == obj1) { CHECK_EQUAL(resolveEntryCount, 3); EVAL("obj1.x", &v); CHECK(JSVAL_IS_VOID(v)); EVAL("obj1.y", &v); CHECK(JSVAL_IS_VOID(v)); EVAL("obj2.y", &v); CHECK(JSVAL_IS_NULL(v)); EVAL("obj2.x", &v); CHECK(JSVAL_IS_VOID(v)); EVAL("obj1.y = 0", &v); CHECK_SAME(v, JSVAL_ZERO); *objp = obj; return true; } } CHECK(false); return false; }
/* The property setter callback */ JSBool go_setter_callback(JSContext *cx, JSObject *obj, jsid id, JSBool strict, jsval *vp) { char* cname = JS_EncodeString(cx, JSID_TO_STRING(id)); JSBool result = call_go_setter(JS_GetPrivate(cx, obj), cname, vp); JS_free(cx, (void*)cname); return result; }
bool doResolve(JSHandleObject obj, JSHandleId id, unsigned flags, JSMutableHandleObject objp) { CHECK_EQUAL(resolveExitCount, 0); AutoIncrCounters incr(this); CHECK_EQUAL(obj, obj1 || obj == obj2); CHECK(JSID_IS_STRING(id)); JSFlatString *str = JS_FlattenString(cx, JSID_TO_STRING(id)); CHECK(str); JS::RootedValue v(cx); if (JS_FlatStringEqualsAscii(str, "x")) { if (obj == obj1) { /* First resolve hook invocation. */ CHECK_EQUAL(resolveEntryCount, 1); EVAL("obj2.y = true", v.address()); CHECK_SAME(v, JSVAL_TRUE); CHECK(JS_DefinePropertyById(cx, obj, id, JSVAL_FALSE, NULL, NULL, 0)); objp.set(obj); return true; } if (obj == obj2) { CHECK_EQUAL(resolveEntryCount, 4); objp.set(NULL); return true; } } else if (JS_FlatStringEqualsAscii(str, "y")) { if (obj == obj2) { CHECK_EQUAL(resolveEntryCount, 2); CHECK(JS_DefinePropertyById(cx, obj, id, JSVAL_NULL, NULL, NULL, 0)); EVAL("obj1.x", v.address()); CHECK(JSVAL_IS_VOID(v)); EVAL("obj1.y", v.address()); CHECK_SAME(v, JSVAL_ZERO); objp.set(obj); return true; } if (obj == obj1) { CHECK_EQUAL(resolveEntryCount, 3); EVAL("obj1.x", v.address()); CHECK(JSVAL_IS_VOID(v)); EVAL("obj1.y", v.address()); CHECK(JSVAL_IS_VOID(v)); EVAL("obj2.y", v.address()); CHECK(JSVAL_IS_NULL(v)); EVAL("obj2.x", v.address()); CHECK(JSVAL_IS_VOID(v)); EVAL("obj1.y = 0", v.address()); CHECK_SAME(v, JSVAL_ZERO); objp.set(obj); return true; } } CHECK(false); return false; }
/** * Compares a PRUnichar and a JS string ignoring case * @param ccx an XPConnect call context * @param lhr the PRUnichar string to be compared * @param lhsLength the length of the PRUnichar string * @param rhs the jsid that is the other string to compare * @return true if the strings are equal */ inline PRBool CaseInsensitiveCompare(XPCCallContext& ccx, const PRUnichar* lhs, size_t lhsLength, jsid rhs) { if(lhsLength == 0) return PR_FALSE; size_t rhsLength; PRUnichar* rhsString = xpc_JSString2PRUnichar(ccx, JSID_TO_STRING(rhs), &rhsLength); return rhsString && lhsLength == rhsLength && _wcsnicmp(lhs, rhsString, lhsLength) == 0; }
NS_IMETHODIMP StatementParams::NewResolve(nsIXPConnectWrappedNative *aWrapper, JSContext *aCtx, JSObject *aScopeObj, jsid aId, uint32_t aFlags, JSObject **_objp, bool *_retval) { NS_ENSURE_TRUE(mStatement, NS_ERROR_NOT_INITIALIZED); // We do not throw at any point after this unless our index is out of range // because we want to allow the prototype chain to be checked for the // property. JS::RootedObject scope(aCtx, aScopeObj); JS::RootedId id(aCtx, aId); bool resolved = false; bool ok = true; if (JSID_IS_INT(id)) { uint32_t idx = JSID_TO_INT(id); // Ensure that our index is within range. We do not care about the // prototype chain being checked here. if (idx >= mParamCount) return NS_ERROR_INVALID_ARG; ok = ::JS_DefineElement(aCtx, scope, idx, JSVAL_VOID, nullptr, nullptr, JSPROP_ENUMERATE); resolved = true; } else if (JSID_IS_STRING(id)) { JSString *str = JSID_TO_STRING(id); size_t nameLength; const jschar *nameChars = JS_GetStringCharsAndLength(aCtx, str, &nameLength); NS_ENSURE_TRUE(nameChars, NS_ERROR_UNEXPECTED); // Check to see if there's a parameter with this name, and if not, let // the rest of the prototype chain be checked. NS_ConvertUTF16toUTF8 name(nameChars, nameLength); uint32_t idx; nsresult rv = mStatement->GetParameterIndex(name, &idx); if (NS_SUCCEEDED(rv)) { ok = ::JS_DefinePropertyById(aCtx, scope, id, JSVAL_VOID, nullptr, nullptr, JSPROP_ENUMERATE); resolved = true; } } *_retval = ok; *_objp = resolved && ok ? scope.get() : nullptr; return NS_OK; }
NS_IMETHODIMP StatementParams::Resolve(nsIXPConnectWrappedNative *aWrapper, JSContext *aCtx, JSObject *aScopeObj, jsid aId, bool *resolvedp, bool *_retval) { NS_ENSURE_TRUE(mStatement, NS_ERROR_NOT_INITIALIZED); // We do not throw at any point after this unless our index is out of range // because we want to allow the prototype chain to be checked for the // property. JS::RootedObject scope(aCtx, aScopeObj); JS::RootedId id(aCtx, aId); bool resolved = false; bool ok = true; if (JSID_IS_INT(id)) { uint32_t idx = JSID_TO_INT(id); // Ensure that our index is within range. We do not care about the // prototype chain being checked here. if (idx >= mParamCount) return NS_ERROR_INVALID_ARG; ok = ::JS_DefineElement(aCtx, scope, idx, JS::UndefinedHandleValue, JSPROP_ENUMERATE | JSPROP_RESOLVING); resolved = true; } else if (JSID_IS_STRING(id)) { JSString *str = JSID_TO_STRING(id); nsAutoJSString autoStr; if (!autoStr.init(aCtx, str)) { return NS_ERROR_FAILURE; } // Check to see if there's a parameter with this name, and if not, let // the rest of the prototype chain be checked. NS_ConvertUTF16toUTF8 name(autoStr); uint32_t idx; nsresult rv = mStatement->GetParameterIndex(name, &idx); if (NS_SUCCEEDED(rv)) { ok = ::JS_DefinePropertyById(aCtx, scope, id, JS::UndefinedHandleValue, JSPROP_ENUMERATE | JSPROP_RESOLVING); resolved = true; } } *_retval = ok; *resolvedp = resolved && ok; return NS_OK; }
static inline void MarkIdInternal(JSTracer *trc, jsid *id) { if (JSID_IS_STRING(*id)) { JSString *str = JSID_TO_STRING(*id); MarkInternal(trc, &str); *id = ATOM_TO_JSID(reinterpret_cast<JSAtom *>(str)); } else if (JS_UNLIKELY(JSID_IS_OBJECT(*id))) { JSObject *obj = JSID_TO_OBJECT(*id); MarkInternal(trc, &obj); *id = OBJECT_TO_JSID(obj); } }
StringData IdWrapper::toStringData(JSStringWrapper* jsstr) const { if (JSID_IS_STRING(_value)) { *jsstr = JSStringWrapper(_context, JSID_TO_STRING(_value)); } else if (JSID_IS_INT(_value)) { *jsstr = JSStringWrapper(JSID_TO_INT(_value)); } else { throwCurrentJSException(_context, ErrorCodes::TypeMismatch, "Cannot toString() non-string and non-integer jsid"); } return jsstr->toStringData(); }
NS_IMETHODIMP StatementParams::NewResolve(nsIXPConnectWrappedNative *aWrapper, JSContext *aCtx, JSObject *aScopeObj, jsid aId, PRUint32 aFlags, JSObject **_objp, PRBool *_retval) { NS_ENSURE_TRUE(mStatement, NS_ERROR_NOT_INITIALIZED); // We do not throw at any point after this unless our index is out of range // because we want to allow the prototype chain to be checked for the // property. bool resolved = false; PRBool ok = PR_TRUE; if (JSID_IS_INT(aId)) { PRUint32 idx = JSID_TO_INT(aId); // Ensure that our index is within range. We do not care about the // prototype chain being checked here. if (idx >= mParamCount) return NS_ERROR_INVALID_ARG; ok = ::JS_DefineElement(aCtx, aScopeObj, idx, JSVAL_VOID, nsnull, nsnull, JSPROP_ENUMERATE); resolved = true; } else if (JSID_IS_STRING(aId)) { JSString *str = JSID_TO_STRING(aId); jschar *nameChars = ::JS_GetStringChars(str); size_t nameLength = ::JS_GetStringLength(str); // Check to see if there's a parameter with this name, and if not, let // the rest of the prototype chain be checked. NS_ConvertUTF16toUTF8 name(reinterpret_cast<const PRUnichar *>(nameChars), nameLength); PRUint32 idx; nsresult rv = mStatement->GetParameterIndex(name, &idx); if (NS_SUCCEEDED(rv)) { ok = ::JS_DefineUCProperty(aCtx, aScopeObj, nameChars, nameLength, JSVAL_VOID, nsnull, nsnull, JSPROP_ENUMERATE); resolved = true; } } *_retval = ok; *_objp = resolved && ok ? aScopeObj : nsnull; return NS_OK; }
JSBool JavaObject::getProperty(JSContext* ctx, JSObject* obj, jsid id, jsval* rval) { Debug::log(Debug::Spam) << "JavaObject::getProperty obj=" << obj << Debug::flush; SessionData* data = JavaObject::getSessionData(ctx, obj); if (!data) { // TODO: replace the frame with an error page instead? *rval = JSVAL_VOID; return JS_TRUE; } int objectRef = JavaObject::getObjectId(ctx, obj); if (JSID_IS_STRING(id)) { JSString* str = JSID_TO_STRING(id); if ((JS_GetStringEncodingLength(ctx, str) == 8) && !strncmp("toString", JS_EncodeString(ctx, str), 8)) { *rval = data->getToStringTearOff(); return JS_TRUE; } if ((JS_GetStringEncodingLength(ctx, str) == 2) && !strncmp("id", JS_EncodeString(ctx, str), 2)) { *rval = INT_TO_JSVAL(objectRef); return JS_TRUE; } if ((JS_GetStringEncodingLength(ctx, str) == 16) && !strncmp("__noSuchMethod__", JS_EncodeString(ctx, str), 16)) { // Avoid error spew if we are disconnected *rval = JSVAL_VOID; return JS_TRUE; } // TODO: dumpJsVal can no longer handle this case //Debug::log(Debug::Error) << "Getting unexpected string property " // << dumpJsVal(ctx, id) << Debug::flush; // TODO: throw a better exception here return JS_FALSE; } if (!JSID_IS_INT(id)) { // TODO: dumpJsVal can no longer handle this case //Debug::log(Debug::Error) << "Getting non-int/non-string property " // << dumpJsVal(ctx, id) << Debug::flush; // TODO: throw a better exception here return JS_FALSE; } int dispId = JSID_TO_INT(id); HostChannel* channel = data->getHostChannel(); SessionHandler* handler = data->getSessionHandler(); gwt::Value value = ServerMethods::getProperty(*channel, handler, objectRef, dispId); data->makeJsvalFromValue(*rval, ctx, value); return JS_TRUE; }
void IdWrapper::toValue(JS::MutableHandleValue value) const { if (isInt()) { value.setInt32(toInt32()); return; } if (isString()) { auto str = JSID_TO_STRING(_value); value.setString(str); return; } uasserted(ErrorCodes::BadValue, "Failed to toValue() non-string and non-integer jsid"); }
static void ScanShape(GCMarker *gcmarker, Shape *shape) { restart: PushMarkStack(gcmarker, shape->base()); const HeapId &id = shape->propidRef(); if (JSID_IS_STRING(id)) PushMarkStack(gcmarker, JSID_TO_STRING(id)); else if (JS_UNLIKELY(JSID_IS_OBJECT(id))) PushMarkStack(gcmarker, JSID_TO_OBJECT(id)); shape = shape->previous(); if (shape && shape->markIfUnmarked(gcmarker->getMarkColor())) goto restart; }
// static void XPCThrower::Verbosify(XPCCallContext& ccx, char** psz, PRBool own) { char* sz = nsnull; if(ccx.HasInterfaceAndMember()) { XPCNativeInterface* iface = ccx.GetInterface(); jsid id = JSID_VOID; #ifdef XPC_IDISPATCH_SUPPORT NS_ASSERTION(ccx.GetIDispatchMember() == nsnull || ccx.GetMember() == nsnull, "Both IDispatch member and regular XPCOM member " "were set in XPCCallContext"); if(ccx.GetIDispatchMember()) { XPCDispInterface::Member * member = reinterpret_cast<XPCDispInterface::Member*>(ccx.GetIDispatchMember()); if(member && JSID_IS_STRING(member->GetName())) { id = member->GetName(); } } else #endif { id = ccx.GetMember()->GetName(); } JSAutoByteString bytes; const char *name = JSID_IS_VOID(id) ? "Unknown" : bytes.encode(ccx, JSID_TO_STRING(id)); if(!name) { name = ""; } sz = JS_smprintf("%s [%s.%s]", *psz, iface->GetNameString(), name); } if(sz) { if(own) JS_smprintf_free(*psz); *psz = sz; } }
static inline void MarkIdInternal(JSTracer *trc, jsid *id) { if (JSID_IS_STRING(*id)) { JSString *str = JSID_TO_STRING(*id); JS_SET_TRACING_LOCATION(trc, (void *)id); MarkInternal(trc, &str); *id = NON_INTEGER_ATOM_TO_JSID(reinterpret_cast<JSAtom *>(str)); } else if (JS_UNLIKELY(JSID_IS_OBJECT(*id))) { JSObject *obj = JSID_TO_OBJECT(*id); JS_SET_TRACING_LOCATION(trc, (void *)id); MarkInternal(trc, &obj); *id = OBJECT_TO_JSID(obj); } else { /* Unset realLocation manually if we do not call MarkInternal. */ JS_UNSET_TRACING_LOCATION(trc); } }
const XPCDispInterface::Member* XPCDispInterface::FindMemberCI(XPCCallContext& ccx, jsid name) const { size_t nameLength; PRUnichar* sName = xpc_JSString2PRUnichar(ccx, JSID_TO_STRING(name), &nameLength); if(!sName) return nsnull; // Iterate backwards over the members array (more efficient) const Member* member = mMembers + mMemberCount; while(member > mMembers) { --member; if(CaseInsensitiveCompare(ccx, sName, nameLength, member->GetName())) { return member; } } return nsnull; }
/* bool setProperty (in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx, in JSObjectPtr obj, in jsid id, in JSValPtr vp); */ NS_IMETHODIMP calDateTime::SetProperty(nsIXPConnectWrappedNative *wrapper, JSContext * cx, JSObject * obj, jsid id, jsval * vp, bool *_retval) { NS_ENSURE_ARG_POINTER(_retval); if (JSID_IS_STRING(id)) { size_t length; JSString *idString = JSID_TO_STRING(id); const jschar *str = JS_GetStringCharsAndLength(cx, idString, &length); nsDependentString const val(reinterpret_cast<PRUnichar const*>(str), length); if (val.EqualsLiteral("jsDate") && vp) { JSObject *dobj; if (!JSVAL_IS_OBJECT(*vp) || !js_DateIsValid(cx, (dobj = JSVAL_TO_OBJECT(*vp)))) { mIsValid = PR_FALSE; } else { jsdouble utcMsec = js_DateGetMsecSinceEpoch(cx, dobj); PRTime utcTime, thousands; LL_F2L(utcTime, utcMsec); LL_I2L(thousands, 1000); LL_MUL(utcTime, utcTime, thousands); nsresult rv = SetNativeTime(utcTime); if (NS_SUCCEEDED(rv)) { mIsValid = PR_TRUE; } else { mIsValid = PR_FALSE; } } *_retval = PR_TRUE; return NS_SUCCESS_I_DID_SOMETHING; } } *_retval = PR_TRUE; return NS_OK; }
/* bool getProperty (in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx, in JSObjectPtr obj, in jsid id, in JSValPtr vp); */ NS_IMETHODIMP calDateTime::GetProperty(nsIXPConnectWrappedNative *wrapper, JSContext * cx, JSObject * obj_, jsid id, jsval * vp, bool *_retval) { NS_ENSURE_ARG_POINTER(vp); NS_ENSURE_ARG_POINTER(_retval); if (JSID_IS_STRING(id)) { size_t length; JSString *idString = JSID_TO_STRING(id); const jschar *str = JS_GetStringCharsAndLength(cx, idString, &length); nsDependentString const val(reinterpret_cast<PRUnichar const*>(str), length); if (val.EqualsLiteral("jsDate")) { PRTime tmp, thousand; jsdouble msec; LL_I2L(thousand, 1000); LL_DIV(tmp, mNativeTime, thousand); LL_L2D(msec, tmp); ensureTimezone(); JSObject *obj; bool b; if (NS_SUCCEEDED(mTimezone->GetIsFloating(&b)) && b) { obj = js_NewDateObject(cx, mYear, mMonth, mDay, mHour, mMinute, mSecond); } else { obj = js_NewDateObjectMsec(cx, msec); } *vp = OBJECT_TO_JSVAL(obj); *_retval = PR_TRUE; return NS_SUCCESS_I_DID_SOMETHING; } } *_retval = PR_TRUE; return NS_OK; }
bool IdWrapper::equalsAscii(StringData sd) const { if (isString()) { auto str = JSID_TO_STRING(_value); if (!str) { uasserted(ErrorCodes::JSInterpreterFailure, "Failed to JSID_TO_STRING"); } bool matched; if (!JS_StringEqualsAscii(_context, str, sd.rawData(), &matched)) { uasserted(ErrorCodes::JSInterpreterFailure, "Failed to JS_StringEqualsAscii"); } return matched; } if (isInt()) { JSStringWrapper jsstr(toInt32()); return jsstr.toStringData().compare(sd) == 0; } uasserted(ErrorCodes::BadValue, "Cannot equalsAscii non-string non-integer jsid"); }
static bool CheckVector(JSContext* cx, Handle<ShapeVec> shapes) { for (size_t i = 0; i < 10; ++i) { // Check the shape to ensure it did not get collected. char buffer[2]; buffer[0] = 'a' + i; buffer[1] = '\0'; bool match; if (!JS_StringEqualsAscii(cx, JSID_TO_STRING(shapes[i]->propid()), buffer, &match)) return false; if (!match) return false; } // Ensure iterator enumeration works through the handle. for (auto shape : shapes) { if (!shape) return false; } return true; }
bool PluginIdentifierParent::RecvRetain() { mTemporaryRefs = 0; // Intern the jsid if necessary. AutoSafeJSContext cx; JS::Rooted<jsid> id(cx, NPIdentifierToJSId(mIdentifier)); if (JSID_IS_INT(id)) { return true; } // The following is what nsNPAPIPlugin.cpp does. Gross, but the API doesn't // give you a NPP to play with. JS::RootedString str(cx, JSID_TO_STRING(id)); JSString* str2 = JS_InternJSString(cx, str); if (!str2) { return false; } NS_ASSERTION(str == str2, "Interning a string in a JSID should always return the same string."); return true; }