bool JSCompartment::wrap(JSContext* cx, MutableHandleString strp) { MOZ_ASSERT(!cx->runtime()->isAtomsCompartment(this)); MOZ_ASSERT(cx->compartment() == this); /* If the string is already in this compartment, we are done. */ JSString* str = strp; if (str->zoneFromAnyThread() == zone()) return true; /* If the string is an atom, we don't have to copy. */ if (str->isAtom()) { MOZ_ASSERT(str->isPermanentAtom() || str->zone()->isAtomsZone()); return true; } /* Check the cache. */ RootedValue key(cx, StringValue(str)); if (WrapperMap::Ptr p = crossCompartmentWrappers.lookup(CrossCompartmentKey(key))) { strp.set(p->value().get().toString()); return true; } /* No dice. Make a copy, and cache it. */ JSString* copy = CopyStringPure(cx, str); if (!copy) return false; if (!putWrapper(cx, CrossCompartmentKey(key), StringValue(copy))) return false; strp.set(copy); return true; }
bool DebugState::getSourceMappingURL(JSContext* cx, MutableHandleString result) const { result.set(nullptr); if (!maybeBytecode_) return true; for (const CustomSection& customSection : metadata().customSections) { const NameInBytecode& sectionName = customSection.name; if (strlen(SourceMappingURLSectionName) != sectionName.length || memcmp(SourceMappingURLSectionName, maybeBytecode_->begin() + sectionName.offset, sectionName.length) != 0) { continue; } // Parse found "SourceMappingURL" custom section. Decoder d(maybeBytecode_->begin() + customSection.offset, maybeBytecode_->begin() + customSection.offset + customSection.length, customSection.offset, /* error = */ nullptr); uint32_t nchars; if (!d.readVarU32(&nchars)) return true; // ignoring invalid section data const uint8_t* chars; if (!d.readBytes(nchars, &chars) || d.currentPosition() != d.end()) return true; // ignoring invalid section data UTF8Chars utf8Chars(reinterpret_cast<const char*>(chars), nchars); JSString* str = JS_NewStringCopyUTF8N(cx, utf8Chars); if (!str) return false; result.set(str); return true; } // Check presence of "SourceMap:" HTTP response header. char* sourceMapURL = metadata().sourceMapURL.get(); if (sourceMapURL && strlen(sourceMapURL)) { UTF8Chars utf8Chars(sourceMapURL, strlen(sourceMapURL)); JSString* str = JS_NewStringCopyUTF8N(cx, utf8Chars); if (!str) return false; result.set(str); } return true; }
ParallelResult jit::IntToStringPar(ForkJoinSlice *slice, int i, MutableHandleString out) { JSFlatString *str = Int32ToString<NoGC>(slice, i); if (!str) return TP_RETRY_SEQUENTIALLY; out.set(str); return TP_SUCCESS; }
ParallelResult jit::DoubleToStringPar(ForkJoinSlice *slice, double d, MutableHandleString out) { JSString *str = js_NumberToString<NoGC>(slice, d); if (!str) return TP_RETRY_SEQUENTIALLY; out.set(str); return TP_SUCCESS; }
ParallelResult jit::ConcatStringsPar(ForkJoinSlice *slice, HandleString left, HandleString right, MutableHandleString out) { JSString *str = ConcatStrings<NoGC>(slice, left, right); if (!str) return TP_RETRY_SEQUENTIALLY; out.set(str); return TP_SUCCESS; }