summaryrefslogtreecommitdiffstats
path: root/js/src/builtin/Eval.cpp
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-06-12 05:43:14 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-06-12 05:43:14 +0000
commit8dd16259287f58f9273002717ec4d27e97127719 (patch)
tree3863e62a53829a84037444beab3abd4ed9dfc7d0 /js/src/builtin/Eval.cpp
parentReleasing progress-linux version 126.0.1-1~progress7.99u1. (diff)
downloadfirefox-8dd16259287f58f9273002717ec4d27e97127719.tar.xz
firefox-8dd16259287f58f9273002717ec4d27e97127719.zip
Merging upstream version 127.0.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'js/src/builtin/Eval.cpp')
-rw-r--r--js/src/builtin/Eval.cpp46
1 files changed, 24 insertions, 22 deletions
diff --git a/js/src/builtin/Eval.cpp b/js/src/builtin/Eval.cpp
index 0cff2486ad..5fffed2140 100644
--- a/js/src/builtin/Eval.cpp
+++ b/js/src/builtin/Eval.cpp
@@ -70,7 +70,7 @@ static bool IsEvalCacheCandidate(JSScript* script) {
/* static */
HashNumber EvalCacheHashPolicy::hash(const EvalCacheLookup& l) {
HashNumber hash = HashStringChars(l.str);
- return AddToHash(hash, l.callerScript.get(), l.pc);
+ return AddToHash(hash, l.callerScript, l.pc);
}
/* static */
@@ -82,13 +82,18 @@ bool EvalCacheHashPolicy::match(const EvalCacheEntry& cacheEntry,
cacheEntry.callerScript == l.callerScript && cacheEntry.pc == l.pc;
}
+void EvalCacheLookup::trace(JSTracer* trc) {
+ TraceNullableRoot(trc, &str, "EvalCacheLookup::str");
+ TraceNullableRoot(trc, &callerScript, "EvalCacheLookup::callerScript");
+}
+
// Add the script to the eval cache when EvalKernel is finished
class EvalScriptGuard {
JSContext* cx_;
Rooted<JSScript*> script_;
/* These fields are only valid if lookup_.str is non-nullptr. */
- EvalCacheLookup lookup_;
+ Rooted<EvalCacheLookup> lookup_;
mozilla::Maybe<DependentAddPtr<EvalCache>> p_;
Rooted<JSLinearString*> lookupStr_;
@@ -100,12 +105,13 @@ class EvalScriptGuard {
~EvalScriptGuard() {
if (script_ && !cx_->isExceptionPending()) {
script_->cacheForEval();
- EvalCacheEntry cacheEntry = {lookupStr_, script_, lookup_.callerScript,
- lookup_.pc};
- lookup_.str = lookupStr_;
- if (lookup_.str && IsEvalCacheCandidate(script_)) {
+ EvalCacheLookup& lookup = lookup_.get();
+ EvalCacheEntry cacheEntry = {lookupStr_, script_, lookup.callerScript,
+ lookup.pc};
+ lookup.str = lookupStr_;
+ if (lookup.str && IsEvalCacheCandidate(script_)) {
// Ignore failure to add cache entry.
- if (!p_->add(cx_, cx_->caches().evalCache, lookup_, cacheEntry)) {
+ if (!p_->add(cx_, cx_->caches().evalCache, lookup, cacheEntry)) {
cx_->recoverFromOutOfMemory();
}
}
@@ -115,13 +121,14 @@ class EvalScriptGuard {
void lookupInEvalCache(JSLinearString* str, JSScript* callerScript,
jsbytecode* pc) {
lookupStr_ = str;
- lookup_.str = str;
- lookup_.callerScript = callerScript;
- lookup_.pc = pc;
- p_.emplace(cx_, cx_->caches().evalCache, lookup_);
+ EvalCacheLookup& lookup = lookup_.get();
+ lookup.str = str;
+ lookup.callerScript = callerScript;
+ lookup.pc = pc;
+ p_.emplace(cx_, cx_->caches().evalCache, lookup);
if (*p_) {
script_ = (*p_)->script;
- p_->remove(cx_, cx_->caches().evalCache, lookup_);
+ p_->remove(cx_, cx_->caches().evalCache, lookup);
}
}
@@ -531,16 +538,11 @@ JS_PUBLIC_API bool JS::IsJSMEnvironment(JSObject* obj) {
#ifdef JSGC_HASH_TABLE_CHECKS
void RuntimeCaches::checkEvalCacheAfterMinorGC() {
- JSContext* cx = TlsContext.get();
- for (auto r = evalCache.all(); !r.empty(); r.popFront()) {
- const EvalCacheEntry& entry = r.front();
+ gc::CheckTableAfterMovingGC(evalCache, [](const auto& entry) {
CheckGCThingAfterMovingGC(entry.str);
- EvalCacheLookup lookup(cx);
- lookup.str = entry.str;
- lookup.callerScript = entry.callerScript;
- lookup.pc = entry.pc;
- auto ptr = evalCache.lookup(lookup);
- MOZ_RELEASE_ASSERT(ptr.found() && &*ptr == &r.front());
- }
+ CheckGCThingAfterMovingGC(entry.script);
+ CheckGCThingAfterMovingGC(entry.callerScript);
+ return EvalCacheLookup(entry.str, entry.callerScript, entry.pc);
+ });
}
#endif