Attachment #9032167: bug1342012-12-associate-decoded-classic-scripts for bug #1342012

View | Details | Raw Unified | Return to bug 1342012
Collapse All | Expand All

(-)a/dom/script/ScriptLoader.cpp (-12 / +23 lines)
Line     Link Here 
 Lines 2435-2450   class MOZ_RAII AutoSetProcessingScriptTa Link Here 
2435
  explicit AutoSetProcessingScriptTag(nsIScriptContext* aContext)
2435
  explicit AutoSetProcessingScriptTag(nsIScriptContext* aContext)
2436
      : mContext(aContext), mOldTag(mContext->GetProcessingScriptTag()) {
2436
      : mContext(aContext), mOldTag(mContext->GetProcessingScriptTag()) {
2437
    mContext->SetProcessingScriptTag(true);
2437
    mContext->SetProcessingScriptTag(true);
2438
  }
2438
  }
2439
2439
2440
  ~AutoSetProcessingScriptTag() { mContext->SetProcessingScriptTag(mOldTag); }
2440
  ~AutoSetProcessingScriptTag() { mContext->SetProcessingScriptTag(mOldTag); }
2441
};
2441
};
2442
2442
2443
static nsresult ExecuteCompiledScript(JSContext* aCx,
2444
                                      ScriptLoadRequest* aRequest,
2445
                                      nsJSUtils::ExecutionContext& aExec) {
2446
  JS::Rooted<JSScript*> script(aCx, aExec.GetScript());
2447
2448
  // Create a ClassicScript object and associate it with the
2449
  // JSScript.
2450
  RefPtr<ClassicScript> classicScript = new ClassicScript(
2451
    aRequest->mFetchOptions, aRequest->mBaseURL);
2452
  classicScript->AssociateWithScript(script);
2453
2454
  return aExec.ExecScript();
2455
}
2456
2443
nsresult ScriptLoader::EvaluateScript(ScriptLoadRequest* aRequest) {
2457
nsresult ScriptLoader::EvaluateScript(ScriptLoadRequest* aRequest) {
2444
  using namespace mozilla::Telemetry;
2458
  using namespace mozilla::Telemetry;
2445
  MOZ_ASSERT(aRequest->IsReadyToRun());
2459
  MOZ_ASSERT(aRequest->IsReadyToRun());
2446
2460
2447
  // We need a document to evaluate scripts.
2461
  // We need a document to evaluate scripts.
2448
  if (!mDocument) {
2462
  if (!mDocument) {
2449
    return NS_ERROR_FAILURE;
2463
    return NS_ERROR_FAILURE;
2450
  }
2464
  }
 Lines 2543-2566   nsresult ScriptLoader::EvaluateScript(Sc Link Here 
2543
2557
2544
      if (NS_SUCCEEDED(rv)) {
2558
      if (NS_SUCCEEDED(rv)) {
2545
        if (aRequest->IsBytecode()) {
2559
        if (aRequest->IsBytecode()) {
2546
          TRACE_FOR_TEST(aRequest->Element(), "scriptloader_execute");
2560
          TRACE_FOR_TEST(aRequest->Element(), "scriptloader_execute");
2547
          nsJSUtils::ExecutionContext exec(cx, global);
2561
          nsJSUtils::ExecutionContext exec(cx, global);
2548
          if (aRequest->mOffThreadToken) {
2562
          if (aRequest->mOffThreadToken) {
2549
            LOG(("ScriptLoadRequest (%p): Decode Bytecode & Join and Execute",
2563
            LOG(("ScriptLoadRequest (%p): Decode Bytecode & Join and Execute",
2550
                 aRequest));
2564
                 aRequest));
2551
            exec.JoinDecode(&aRequest->mOffThreadToken);
2565
            rv = exec.JoinDecode(&aRequest->mOffThreadToken);
2552
          } else {
2566
          } else {
2553
            LOG(("ScriptLoadRequest (%p): Decode Bytecode and Execute",
2567
            LOG(("ScriptLoadRequest (%p): Decode Bytecode and Execute",
2554
                 aRequest));
2568
                 aRequest));
2555
            exec.Decode(options, aRequest->mScriptBytecode,
2569
            rv = exec.Decode(options, aRequest->mScriptBytecode,
2556
                        aRequest->mBytecodeOffset);
2570
                             aRequest->mBytecodeOffset);
2557
          }
2571
          }
2558
          rv = exec.ExecScript();
2572
2573
          if (rv == NS_OK) {
2574
            rv = ExecuteCompiledScript(cx, aRequest, exec);
2575
          }
2576
2559
          // We do not expect to be saving anything when we already have some
2577
          // We do not expect to be saving anything when we already have some
2560
          // bytecode.
2578
          // bytecode.
2561
          MOZ_ASSERT(!aRequest->mCacheInfo);
2579
          MOZ_ASSERT(!aRequest->mCacheInfo);
2562
        } else {
2580
        } else {
2563
          MOZ_ASSERT(aRequest->IsSource());
2581
          MOZ_ASSERT(aRequest->IsSource());
2564
          JS::Rooted<JSScript*> script(cx);
2582
          JS::Rooted<JSScript*> script(cx);
2565
          bool encodeBytecode = ShouldCacheBytecode(aRequest);
2583
          bool encodeBytecode = ShouldCacheBytecode(aRequest);
2566
2584
 Lines 2596-2619   nsresult ScriptLoader::EvaluateScript(Sc Link Here 
2596
                } else {
2614
                } else {
2597
                  rv = NS_ERROR_OUT_OF_MEMORY;
2615
                  rv = NS_ERROR_OUT_OF_MEMORY;
2598
                }
2616
                }
2599
              }
2617
              }
2600
            }
2618
            }
2601
2619
2602
            if (rv == NS_OK) {
2620
            if (rv == NS_OK) {
2603
              script = exec.GetScript();
2621
              script = exec.GetScript();
2604
2622
              rv = ExecuteCompiledScript(cx, aRequest, exec);
2605
              // Create a ClassicScript object and associate it with the
2606
              // JSScript.
2607
              RefPtr<ClassicScript> classicScript = new ClassicScript(
2608
                  aRequest->mFetchOptions, aRequest->mBaseURL);
2609
              classicScript->AssociateWithScript(script);
2610
2611
              rv = exec.ExecScript();
2612
            }
2623
            }
2613
          }
2624
          }
2614
2625
2615
          // Queue the current script load request to later save the bytecode.
2626
          // Queue the current script load request to later save the bytecode.
2616
          if (script && encodeBytecode) {
2627
          if (script && encodeBytecode) {
2617
            aRequest->SetScript(script);
2628
            aRequest->SetScript(script);
2618
            TRACE_FOR_TEST(aRequest->Element(), "scriptloader_encode");
2629
            TRACE_FOR_TEST(aRequest->Element(), "scriptloader_encode");
2619
            MOZ_ASSERT(aRequest->mBytecodeOffset ==
2630
            MOZ_ASSERT(aRequest->mBytecodeOffset ==

Return to bug 1342012