SavedStacks::FrameState::FrameState(const FrameState &fs) : principals(fs.principals), name(fs.name), location(fs.location) { if (principals) JS_HoldPrincipals(principals); }
SavedStacks::FrameState::FrameState(const FrameIter &iter) : principals(iter.compartment()->principals), name(iter.isNonEvalFunctionFrame() ? iter.functionDisplayAtom() : nullptr), location() { if (principals) JS_HoldPrincipals(principals); }
void SavedFrame::initFromLookup(Lookup &lookup) { JS_ASSERT(lookup.source); JS_ASSERT(getReservedSlot(JSSLOT_SOURCE).isUndefined()); setReservedSlot(JSSLOT_SOURCE, StringValue(lookup.source)); setReservedSlot(JSSLOT_LINE, NumberValue(lookup.line)); setReservedSlot(JSSLOT_COLUMN, NumberValue(lookup.column)); setReservedSlot(JSSLOT_FUNCTIONDISPLAYNAME, lookup.functionDisplayName ? StringValue(lookup.functionDisplayName) : NullValue()); setReservedSlot(JSSLOT_PARENT, ObjectOrNullValue(lookup.parent)); setReservedSlot(JSSLOT_PRIVATE_PARENT, PrivateValue(lookup.parent)); JS_ASSERT(getReservedSlot(JSSLOT_PRINCIPALS).isUndefined()); if (lookup.principals) JS_HoldPrincipals(lookup.principals); setReservedSlot(JSSLOT_PRINCIPALS, PrivateValue(lookup.principals)); }
AutoDropPrincipals(JSRuntime *rt, JSPrincipals *principals) : rt(rt), principals(principals) { JS_HoldPrincipals(principals); }
/* static */ JSBool nsJSPrincipals::Transcode(JSXDRState *xdr, JSPrincipals **jsprinp) { nsresult rv; if (xdr->mode == JSXDR_ENCODE) { nsIObjectOutputStream *stream = reinterpret_cast<nsIObjectOutputStream*>(xdr->userdata); // Flush xdr'ed data to the underlying object output stream. uint32_t size; char *data = (char*) ::JS_XDRMemGetData(xdr, &size); rv = stream->Write32(size); if (NS_SUCCEEDED(rv)) { rv = stream->WriteBytes(data, size); if (NS_SUCCEEDED(rv)) { ::JS_XDRMemResetData(xdr); rv = stream->WriteObject(nsJSPrincipals::get(*jsprinp), true); } } } else { NS_ASSERTION(JS_XDRMemDataLeft(xdr) == 0, "XDR out of sync?!"); nsIObjectInputStream *stream = reinterpret_cast<nsIObjectInputStream*>(xdr->userdata); nsCOMPtr<nsIPrincipal> prin; rv = stream->ReadObject(true, getter_AddRefs(prin)); if (NS_SUCCEEDED(rv)) { PRUint32 size; rv = stream->Read32(&size); if (NS_SUCCEEDED(rv)) { char *data = nsnull; if (size != 0) rv = stream->ReadBytes(size, &data); if (NS_SUCCEEDED(rv)) { char *olddata; uint32_t oldsize; // Any decode-mode JSXDRState whose userdata points to an // nsIObjectInputStream instance must use nsMemory to Alloc // and Free its data buffer. Swap the new buffer we just // read for the old, exhausted data. olddata = (char*) ::JS_XDRMemGetData(xdr, &oldsize); nsMemory::Free(olddata); ::JS_XDRMemSetData(xdr, data, size); *jsprinp = nsJSPrincipals::get(prin); JS_HoldPrincipals(*jsprinp); } } } } if (NS_FAILED(rv)) { ::JS_ReportError(xdr->cx, "can't %scode principals (failure code %x)", (xdr->mode == JSXDR_ENCODE) ? "en" : "de", (unsigned int) rv); return JS_FALSE; } return JS_TRUE; }
AutoDropPrincipals(JSContext* cx, JSPrincipals* principals) : cx(cx), principals(principals) { JS_HoldPrincipals(principals); }