Bug 1364974: Part 1 - Switch to Variant for holding decode task data. r?shu draft
authorKris Maglione <maglione.k@gmail.com>
Tue, 16 May 2017 00:12:08 -0700
changeset 579135 0101dee49e9ecca4cffe3e0210e456d03db053a2
parent 578825 8f89d291e303a3d637a268c5abad9c819aad9285
child 579136 3a6aca97b33bdf17e9d0d5454464984f3b85a319
push id59159
push usermaglione.k@gmail.com
push dateWed, 17 May 2017 02:59:09 +0000
reviewersshu
bugs1364974
milestone55.0a1
Bug 1364974: Part 1 - Switch to Variant for holding decode task data. r?shu We'll need to be able to support more than two parse data types in order to support multi-script decode operations. Since MaybeOneOf only supports two types, that means switching to Variant. MozReview-Commit-ID: HMYZ0R4dife
js/src/vm/HelperThreads.cpp
js/src/vm/HelperThreads.h
--- a/js/src/vm/HelperThreads.cpp
+++ b/js/src/vm/HelperThreads.cpp
@@ -295,37 +295,35 @@ static const JSClassOps parseTaskGlobalC
 static const JSClass parseTaskGlobalClass = {
     "internal-parse-task-global", JSCLASS_GLOBAL_FLAGS,
     &parseTaskGlobalClassOps
 };
 
 ParseTask::ParseTask(ParseTaskKind kind, JSContext* cx, JSObject* parseGlobal,
                      const char16_t* chars, size_t length,
                      JS::OffThreadCompileCallback callback, void* callbackData)
-  : kind(kind), options(cx),
+  : kind(kind), options(cx), data(AsVariant(TwoByteChars(chars, length))),
     alloc(JSContext::TEMP_LIFO_ALLOC_PRIMARY_CHUNK_SIZE),
     parseGlobal(parseGlobal),
     callback(callback), callbackData(callbackData),
     script(nullptr), sourceObject(nullptr),
     overRecursed(false), outOfMemory(false)
 {
-    data.construct<TwoByteChars>(chars, length);
 }
 
 ParseTask::ParseTask(ParseTaskKind kind, JSContext* cx, JSObject* parseGlobal,
                      const JS::TranscodeRange& range,
                      JS::OffThreadCompileCallback callback, void* callbackData)
-  : kind(kind), options(cx),
+  : kind(kind), options(cx), data(AsVariant(range)),
     alloc(JSContext::TEMP_LIFO_ALLOC_PRIMARY_CHUNK_SIZE),
     parseGlobal(parseGlobal),
     callback(callback), callbackData(callbackData),
     script(nullptr), sourceObject(nullptr),
     overRecursed(false), outOfMemory(false)
 {
-    data.construct<const JS::TranscodeRange>(range);
 }
 
 bool
 ParseTask::init(JSContext* cx, const ReadOnlyCompileOptions& options)
 {
     if (!this->options.copy(cx, options))
         return false;
 
@@ -382,17 +380,17 @@ ScriptParseTask::ScriptParseTask(JSConte
   : ParseTask(ParseTaskKind::Script, cx, parseGlobal, chars, length, callback,
               callbackData)
 {
 }
 
 void
 ScriptParseTask::parse(JSContext* cx)
 {
-    auto& range = data.ref<TwoByteChars>();
+    auto& range = data.as<TwoByteChars>();
     SourceBufferHolder srcBuf(range.begin().get(), range.length(), SourceBufferHolder::NoOwnership);
     script = frontend::CompileGlobalScript(cx, alloc, ScopeKind::Global,
                                            options, srcBuf,
                                            /* sourceObjectOut = */ &sourceObject);
 }
 
 ModuleParseTask::ModuleParseTask(JSContext* cx, JSObject* parseGlobal,
                                  const char16_t* chars, size_t length,
@@ -400,17 +398,17 @@ ModuleParseTask::ModuleParseTask(JSConte
   : ParseTask(ParseTaskKind::Module, cx, parseGlobal, chars, length, callback,
               callbackData)
 {
 }
 
 void
 ModuleParseTask::parse(JSContext* cx)
 {
-    auto& range = data.ref<TwoByteChars>();
+    auto& range = data.as<TwoByteChars>();
     SourceBufferHolder srcBuf(range.begin().get(), range.length(), SourceBufferHolder::NoOwnership);
     ModuleObject* module = frontend::CompileModule(cx, options, srcBuf, alloc, &sourceObject);
     if (module)
         script = module->script();
 }
 
 ScriptDecodeTask::ScriptDecodeTask(JSContext* cx, JSObject* parseGlobal,
                                    const JS::TranscodeRange& range,
@@ -420,17 +418,17 @@ ScriptDecodeTask::ScriptDecodeTask(JSCon
 {
 }
 
 void
 ScriptDecodeTask::parse(JSContext* cx)
 {
     RootedScript resultScript(cx);
     XDROffThreadDecoder decoder(cx, alloc, &options, /* sourceObjectOut = */ &sourceObject,
-                                data.ref<const JS::TranscodeRange>());
+                                data.as<const JS::TranscodeRange>());
     decoder.codeScript(&resultScript);
     MOZ_ASSERT(bool(resultScript) == (decoder.resultCode() == JS::TranscodeResult_Ok));
     if (decoder.resultCode() == JS::TranscodeResult_Ok) {
         script = resultScript.get();
     } else {
         sourceObject = nullptr;
     }
 }
--- a/js/src/vm/HelperThreads.h
+++ b/js/src/vm/HelperThreads.h
@@ -10,17 +10,16 @@
  * and are distinct from e.g. web workers.
  */
 
 #ifndef vm_HelperThreads_h
 #define vm_HelperThreads_h
 
 #include "mozilla/Attributes.h"
 #include "mozilla/GuardObjects.h"
-#include "mozilla/MaybeOneOf.h"
 #include "mozilla/PodOperations.h"
 #include "mozilla/TimeStamp.h"
 #include "mozilla/Variant.h"
 
 #include "jsapi.h"
 #include "jscntxt.h"
 
 #include "jit/Ion.h"
@@ -590,17 +589,17 @@ class MOZ_RAII AutoUnlockHelperThreadSta
     }
 };
 
 struct ParseTask
 {
     ParseTaskKind kind;
     OwningCompileOptions options;
 
-    mozilla::MaybeOneOf<const JS::TranscodeRange, JS::TwoByteChars> data;
+    mozilla::Variant<const JS::TranscodeRange, JS::TwoByteChars> data;
 
     LifoAlloc alloc;
 
     // Rooted pointer to the global object to use while parsing.
     JSObject* parseGlobal;
 
     // Callback invoked off thread when the parse finishes.
     JS::OffThreadCompileCallback callback;