Make --always-opt also optimize top-level code.
authormstarzinger <mstarzinger@chromium.org>
Tue, 7 Apr 2015 15:44:16 +0000 (08:44 -0700)
committerCommit bot <commit-bot@chromium.org>
Tue, 7 Apr 2015 15:44:23 +0000 (15:44 +0000)
This enables eager optimization of top-level code with TurboFan and
extends test coverage by triggering it with the --always-opt flag.
Script contexts are now also properly allocated in TurboFan.

R=titzer@chromium.org

Review URL: https://codereview.chromium.org/1053063003

Cr-Commit-Position: refs/heads/master@{#27633}

22 files changed:
src/arm/lithium-codegen-arm.cc
src/arm64/lithium-codegen-arm64.cc
src/bailout-reason.h
src/compiler.cc
src/compiler/ast-graph-builder.cc
src/compiler/ast-graph-builder.h
src/compiler/js-generic-lowering.cc
src/compiler/linkage.cc
src/compiler/operator-properties.cc
src/factory.cc
src/hydrogen.cc
src/ia32/lithium-codegen-ia32.cc
src/mips/lithium-codegen-mips.cc
src/x64/lithium-codegen-x64.cc
test/cctest/cctest.status
test/cctest/test-api.cc
test/cctest/test-debug.cc
test/cctest/test-parsing.cc
test/cctest/test-thread-termination.cc
test/mjsunit/mjsunit.status
test/mozilla/mozilla.status
test/unittests/compiler/js-operator-unittest.cc

index cce0add..8a647d8 100644 (file)
@@ -180,6 +180,7 @@ bool LCodeGen::GeneratePrologue() {
     Comment(";;; Allocate local context");
     bool need_write_barrier = true;
     // Argument to NewContext is the function, which is in r1.
+    DCHECK(!info()->scope()->is_script_scope());
     if (heap_slots <= FastNewContextStub::kMaximumSlots) {
       FastNewContextStub stub(isolate(), heap_slots);
       __ CallStub(&stub);
index 6377499..8f32bdd 100644 (file)
@@ -703,6 +703,7 @@ bool LCodeGen::GeneratePrologue() {
     Comment(";;; Allocate local context");
     bool need_write_barrier = true;
     // Argument to NewContext is the function, which is in x1.
+    DCHECK(!info()->scope()->is_script_scope());
     if (heap_slots <= FastNewContextStub::kMaximumSlots) {
       FastNewContextStub stub(isolate(), heap_slots);
       __ CallStub(&stub);
index 9b801c8..e48d524 100644 (file)
@@ -164,7 +164,6 @@ namespace internal {
   V(kModuleVariable, "Module variable")                                        \
   V(kModuleUrl, "Module url")                                                  \
   V(kNativeFunctionLiteral, "Native function literal")                         \
-  V(kSuperReference, "Super reference")                                        \
   V(kNeedSmiLiteral, "Need a Smi literal here")                                \
   V(kNoCasesLeft, "No cases left")                                             \
   V(kNoEmptyArraysHereInEmitFastOneByteArrayJoin,                              \
@@ -215,10 +214,12 @@ namespace internal {
   V(kReturnAddressNotFoundInFrame, "Return address not found in frame")        \
   V(kRhsHasBeenClobbered, "Rhs has been clobbered")                            \
   V(kScopedBlock, "ScopedBlock")                                               \
+  V(kScriptContext, "Allocation of script context")                            \
   V(kSmiAdditionOverflow, "Smi addition overflow")                             \
   V(kSmiSubtractionOverflow, "Smi subtraction overflow")                       \
   V(kStackAccessBelowStackPointer, "Stack access below stack pointer")         \
   V(kStackFrameTypesMustMatch, "Stack frame types must match")                 \
+  V(kSuperReference, "Super reference")                                        \
   V(kTheCurrentStackPointerIsBelowCsp,                                         \
     "The current stack pointer is below csp")                                  \
   V(kTheInstructionShouldBeALis, "The instruction should be a lis")            \
index daadb57..4e9bec8 100644 (file)
@@ -1472,6 +1472,24 @@ MaybeHandle<Code> Compiler::GetOptimizedCode(Handle<JSFunction> function,
   }
   current_code->set_profiler_ticks(0);
 
+  // TODO(mstarzinger): We cannot properly deserialize a scope chain containing
+  // an eval scope and hence would fail at parsing the eval source again.
+  if (shared->disable_optimization_reason() == kEval) {
+    return MaybeHandle<Code>();
+  }
+
+  // TODO(mstarzinger): We cannot properly deserialize a scope chain for the
+  // builtin context, hence Genesis::InstallExperimentalNatives would fail.
+  if (shared->is_toplevel() && isolate->bootstrapper()->IsActive()) {
+    return MaybeHandle<Code>();
+  }
+
+  // TODO(titzer): Some top-level code times out because of missing interrupt
+  // checks at back-branches, these are currently marked with --no-turbo-osr.
+  if (shared->is_toplevel() && !FLAG_turbo_osr) {
+    return MaybeHandle<Code>();
+  }
+
   info->SetOptimizing(osr_ast_id, current_code);
 
   if (mode == CONCURRENT) {
index 18fb491..306afb6 100644 (file)
@@ -476,9 +476,7 @@ bool AstGraphBuilder::CreateGraph(bool constant_context, bool stack_check) {
   int heap_slots = info()->num_heap_slots() - Context::MIN_CONTEXT_SLOTS;
   if (heap_slots > 0) {
     // Push a new inner context scope for the function.
-    Node* closure = GetFunctionClosure();
-    Node* inner_context =
-        BuildLocalFunctionContext(function_context_.get(), closure);
+    Node* inner_context = BuildLocalFunctionContext(function_context_.get());
     ContextScope top_context(this, scope, inner_context);
     CreateGraphBody(stack_check);
   } else {
@@ -2474,7 +2472,8 @@ void AstGraphBuilder::VisitDeclarations(ZoneList<Declaration*>* declarations) {
   Node* flags = jsgraph()->Constant(encoded_flags);
   Node* pairs = jsgraph()->Constant(data);
   const Operator* op = javascript()->CallRuntime(Runtime::kDeclareGlobals, 3);
-  NewNode(op, current_context(), pairs, flags);
+  Node* call = NewNode(op, current_context(), pairs, flags);
+  PrepareFrameState(call, BailoutId::Declarations());
   globals()->clear();
 }
 
@@ -2633,10 +2632,14 @@ Node* AstGraphBuilder::BuildPatchReceiverToGlobalProxy(Node* receiver) {
 }
 
 
-Node* AstGraphBuilder::BuildLocalFunctionContext(Node* context, Node* closure) {
+Node* AstGraphBuilder::BuildLocalFunctionContext(Node* context) {
+  Node* closure = GetFunctionClosure();
+
   // Allocate a new local context.
-  const Operator* op = javascript()->CreateFunctionContext();
-  Node* local_context = NewNode(op, closure);
+  Node* local_context =
+      info()->scope()->is_script_scope()
+          ? BuildLocalScriptContext(info()->scope())
+          : NewNode(javascript()->CreateFunctionContext(), closure);
 
   // Copy parameters into context if necessary.
   int num_parameters = info()->scope()->num_parameters();
@@ -2656,12 +2659,25 @@ Node* AstGraphBuilder::BuildLocalFunctionContext(Node* context, Node* closure) {
 }
 
 
+Node* AstGraphBuilder::BuildLocalScriptContext(Scope* scope) {
+  Node* closure = GetFunctionClosure();
+
+  // Allocate a new local context.
+  const Operator* op = javascript()->CreateScriptContext();
+  Node* scope_info = jsgraph()->Constant(scope->GetScopeInfo(isolate()));
+  Node* local_context = NewNode(op, closure, scope_info);
+  PrepareFrameState(local_context, BailoutId::FunctionEntry());
+
+  return local_context;
+}
+
+
 Node* AstGraphBuilder::BuildLocalBlockContext(Scope* scope) {
   Node* closure = GetFunctionClosure();
 
   // Allocate a new local context.
   const Operator* op = javascript()->CreateBlockContext();
-  Node* scope_info = jsgraph()->Constant(scope->GetScopeInfo(info_->isolate()));
+  Node* scope_info = jsgraph()->Constant(scope->GetScopeInfo(isolate()));
   Node* local_context = NewNode(op, scope_info, closure);
 
   return local_context;
index 45f7451..4e3a9e3 100644 (file)
@@ -245,8 +245,9 @@ class AstGraphBuilder : public AstVisitor {
   // Builder to create a receiver check for sloppy mode.
   Node* BuildPatchReceiverToGlobalProxy(Node* receiver);
 
-  // Builders to create local function and block contexts.
-  Node* BuildLocalFunctionContext(Node* context, Node* closure);
+  // Builders to create local function, script and block contexts.
+  Node* BuildLocalFunctionContext(Node* context);
+  Node* BuildLocalScriptContext(Scope* scope);
   Node* BuildLocalBlockContext(Scope* scope);
 
   // Builder to create an arguments object if it is used.
index e1dac82..c628674 100644 (file)
@@ -98,7 +98,7 @@ REPLACE_RUNTIME_CALL(JSCreateFunctionContext, Runtime::kNewFunctionContext)
 REPLACE_RUNTIME_CALL(JSCreateWithContext, Runtime::kPushWithContext)
 REPLACE_RUNTIME_CALL(JSCreateBlockContext, Runtime::kPushBlockContext)
 REPLACE_RUNTIME_CALL(JSCreateModuleContext, Runtime::kPushModuleContext)
-REPLACE_RUNTIME_CALL(JSCreateScriptContext, Runtime::kAbort)
+REPLACE_RUNTIME_CALL(JSCreateScriptContext, Runtime::kNewScriptContext)
 #undef REPLACE_RUNTIME
 
 
index 72b7daf..a16f96f 100644 (file)
@@ -104,7 +104,6 @@ bool Linkage::NeedsFrameState(Runtime::FunctionId function) {
   // not to call into arbitrary JavaScript, not to throw, and not to deoptimize
   // are blacklisted here and can be called without a FrameState.
   switch (function) {
-    case Runtime::kDeclareGlobals:                 // TODO(jarin): Is it safe?
     case Runtime::kDefineClassMethod:              // TODO(jarin): Is it safe?
     case Runtime::kDefineGetterPropertyUnchecked:  // TODO(jarin): Is it safe?
     case Runtime::kDefineSetterPropertyUnchecked:  // TODO(jarin): Is it safe?
index 3a91fd6..3a7f2f0 100644 (file)
@@ -52,6 +52,7 @@ int OperatorProperties::GetFrameStateInputCount(const Operator* op) {
     case IrOpcode::kJSNotEqual:
 
     // Context operations
+    case IrOpcode::kJSCreateScriptContext:
     case IrOpcode::kJSCreateWithContext:
 
     // Conversions
index de4da94..96b564f 100644 (file)
@@ -1375,11 +1375,6 @@ Handle<JSObject> Factory::NewFunctionPrototype(Handle<JSFunction> function) {
 }
 
 
-static bool ShouldOptimizeNewClosure(Handle<SharedFunctionInfo> info) {
-  return !info->is_toplevel() && info->allows_lazy_compilation();
-}
-
-
 Handle<JSFunction> Factory::NewFunctionFromSharedFunctionInfo(
     Handle<SharedFunctionInfo> info,
     Handle<Context> context,
@@ -1393,6 +1388,10 @@ Handle<JSFunction> Factory::NewFunctionFromSharedFunctionInfo(
     info->ResetForNewContext(isolate()->heap()->global_ic_age());
   }
 
+  if (FLAG_always_opt && info->allows_lazy_compilation()) {
+    result->MarkForOptimization();
+  }
+
   int index = info->SearchOptimizedCodeMap(context->native_context(),
                                            BailoutId::None());
   if (!info->bound() && index < 0) {
@@ -1408,12 +1407,8 @@ Handle<JSFunction> Factory::NewFunctionFromSharedFunctionInfo(
     Code* code = info->GetCodeFromOptimizedCodeMap(index);
     DCHECK(!code->marked_for_deoptimization());
     result->ReplaceCode(code);
-    return result;
   }
 
-  if (FLAG_always_opt && ShouldOptimizeNewClosure(info)) {
-    result->MarkForOptimization();
-  }
   return result;
 }
 
index 038834c..56f1cf3 100644 (file)
@@ -4220,6 +4220,11 @@ bool HOptimizedGraphBuilder::BuildGraph() {
     return false;
   }
 
+  if (current_info()->scope()->is_script_scope()) {
+    Bailout(kScriptContext);
+    return false;
+  }
+
   Scope* scope = current_info()->scope();
   SetUpScope(scope);
 
@@ -11435,7 +11440,7 @@ void HOptimizedGraphBuilder::VisitFunctionDeclaration(
 
 void HOptimizedGraphBuilder::VisitModuleDeclaration(
     ModuleDeclaration* declaration) {
-  UNREACHABLE();
+  return Bailout(kModuleDeclaration);
 }
 
 
index 0ff819a..7714e9f 100644 (file)
@@ -257,6 +257,7 @@ bool LCodeGen::GeneratePrologue() {
     Comment(";;; Allocate local context");
     bool need_write_barrier = true;
     // Argument to NewContext is the function, which is still in edi.
+    DCHECK(!info()->scope()->is_script_scope());
     if (heap_slots <= FastNewContextStub::kMaximumSlots) {
       FastNewContextStub stub(isolate(), heap_slots);
       __ CallStub(&stub);
index ace163f..6293b2c 100644 (file)
@@ -200,6 +200,7 @@ bool LCodeGen::GeneratePrologue() {
     Comment(";;; Allocate local context");
     bool need_write_barrier = true;
     // Argument to NewContext is the function, which is in a1.
+    DCHECK(!info()->scope()->is_script_scope());
     if (heap_slots <= FastNewContextStub::kMaximumSlots) {
       FastNewContextStub stub(isolate(), heap_slots);
       __ CallStub(&stub);
index d8edeef..8da76fa 100644 (file)
@@ -195,6 +195,7 @@ bool LCodeGen::GeneratePrologue() {
     Comment(";;; Allocate local context");
     bool need_write_barrier = true;
     // Argument to NewContext is the function, which is still in rdi.
+    DCHECK(!info()->scope()->is_script_scope());
     if (heap_slots <= FastNewContextStub::kMaximumSlots) {
       FastNewContextStub stub(isolate(), heap_slots);
       __ CallStub(&stub);
index 6640891..7de531d 100644 (file)
   'test-api/Threading*': [PASS, NO_VARIANTS],
   'test-heap/IncrementalMarkingStepMakesBigProgressWithLargeObjects': [PASS, NO_VARIANTS],
   'test-heap-profiler/ManyLocalsInSharedContext': [PASS, NO_VARIANTS],
+  'test-serialize/SerializeToplevelLargeCodeObject': [PASS, NO_VARIANTS],
   'test-debug/ThreadedDebugging': [PASS, NO_VARIANTS],
   'test-debug/DebugBreakLoop': [PASS, NO_VARIANTS],
   # BUG(3742).
   'test-mark-compact/MarkCompactCollector': [PASS, ['arch==arm', NO_VARIANTS]],
 
+  # TODO(mstarzinger): The rewriter is not being called when top-level code is
+  # optimized and hence scripts don't "return" the correct value. Fix this.
+  'test-compiler/CompileFunctionInContext*': [PASS, NO_VARIANTS],
+
+  # TODO(mstarzinger): These tests count the number of optimized code objects
+  # and therefore break because top-level code is optimized. Fix the tests.
+  'test-heap/NextCodeLinkIsWeak': [PASS, NO_VARIANTS],
+  'test-heap/TestInternalWeakLists': [PASS, NO_VARIANTS],
+  'test-heap/TestInternalWeakListsTraverseWithGC': [PASS, NO_VARIANTS],
+
   # TODO(jarin): Cannot lazy-deoptimize from conversions before comparisons.
   'test-js-typed-lowering/OrderCompareEffects': [SKIP],
 
   # TODO(jochen): Reenable after we removed the CHECK() from the marking queue.
   'test-mark-compact/MarkingDeque': [SKIP],
 
-  'test-heap/TestInternalWeakLists': [PASS, ['arch==arm', NO_VARIANTS]],
-  'test-heap/TestInternalWeakListsTraverseWithGC': [PASS, ['arch==arm', NO_VARIANTS]],
-
   ############################################################################
   # Slow tests.
   'test-api/Threading1': [PASS, ['mode == debug', SLOW]],
index abf6c34..ca2fd08 100644 (file)
@@ -5312,7 +5312,8 @@ void TryCatchMixedNestingCheck(v8::TryCatch* try_catch) {
   CHECK_EQ(0,
            strcmp(*v8::String::Utf8Value(message->Get()), "Uncaught Error: a"));
   CHECK_EQ(1, message->GetLineNumber());
-  CHECK_EQ(6, message->GetStartColumn());
+  // TODO(3995): Our compilers disagree about the position.
+  if (!i::FLAG_always_opt) CHECK_EQ(6, message->GetStartColumn());
 }
 
 
@@ -9794,7 +9795,11 @@ THREADED_TEST(ConstructorForObject) {
     value = CompileRun("new obj2(28)");
     CHECK(try_catch.HasCaught());
     String::Utf8Value exception_value1(try_catch.Exception());
-    CHECK_EQ(0, strcmp("TypeError: obj2 is not a function", *exception_value1));
+    // TODO(3995): Our compilers disagree about the position (and message).
+    if (!i::FLAG_always_opt) {
+      CHECK_EQ(0,
+               strcmp("TypeError: obj2 is not a function", *exception_value1));
+    }
     try_catch.Reset();
 
     Local<Value> args[] = {v8_num(29)};
index 38bf2dd..2b85573 100644 (file)
@@ -6732,6 +6732,10 @@ TEST(Backtrace) {
 
   v8::Debug::SetMessageHandler(BacktraceData::MessageHandler);
 
+  // TODO(3995): This doesn't work with --always-opt because we don't have
+  // correct source positions in optimized code. Enable once we have.
+  i::FLAG_always_opt = false;
+
   const int kBufferSize = 1000;
   uint16_t buffer[kBufferSize];
   const char* scripts_command =
@@ -6988,7 +6992,6 @@ TEST(DeoptimizeDuringDebugBreak) {
                                         frame_function_name_source,
                                         "frame_function_name");
 
-
   // Set a debug event listener which will keep interrupting execution until
   // debug break. When inside function bar it will deoptimize all functions.
   // This tests lazy deoptimization bailout for the stack check, as the first
@@ -6997,13 +7000,12 @@ TEST(DeoptimizeDuringDebugBreak) {
   v8::Debug::SetDebugEventListener(DebugEventBreakDeoptimize);
 
   // Compile and run function bar which will optimize it for some flag settings.
-  v8::Script::Compile(v8::String::NewFromUtf8(
-                          env->GetIsolate(), "function bar(){}; bar()"))->Run();
+  v8::Local<v8::Function> f = CompileFunction(&env, "function bar(){}", "bar");
+  f->Call(v8::Undefined(env->GetIsolate()), 0, NULL);
 
   // Set debug break and call bar again.
   v8::Debug::DebugBreak(env->GetIsolate());
-  v8::Script::Compile(v8::String::NewFromUtf8(env->GetIsolate(), "bar()"))
-      ->Run();
+  f->Call(v8::Undefined(env->GetIsolate()), 0, NULL);
 
   CHECK(debug_event_break_deoptimize_done);
 
index ba10d7c..a086c3e 100644 (file)
@@ -3433,7 +3433,8 @@ TEST(UseAsmUseCount) {
              "var foo = 1;\n"
              "\"use asm\";\n"  // Only the first one counts.
              "function bar() { \"use asm\"; var baz = 1; }");
-  CHECK_EQ(2, use_counts[v8::Isolate::kUseAsm]);
+  // Optimizing will double-count because the source is parsed twice.
+  CHECK_EQ(i::FLAG_always_opt ? 4 : 2, use_counts[v8::Isolate::kUseAsm]);
 }
 
 
@@ -3452,7 +3453,8 @@ TEST(UseConstLegacyCount) {
       "    const z = 1; var baz = 1;\n"
       "    function q() { const k = 42; }\n"
       "}");
-  CHECK_EQ(4, use_counts[v8::Isolate::kLegacyConst]);
+  // Optimizing will double-count because the source is parsed twice.
+  CHECK_EQ(i::FLAG_always_opt ? 8 : 4, use_counts[v8::Isolate::kLegacyConst]);
 }
 
 
index 0d20e0f..e1f218c 100644 (file)
@@ -152,6 +152,7 @@ TEST(TerminateOnlyV8ThreadFromThreadItselfNoLoop) {
   // Run a loop that will be infinite if thread termination does not work.
   v8::Handle<v8::String> source = v8::String::NewFromUtf8(
       CcTest::isolate(), "try { loop(); fail(); } catch(e) { fail(); }");
+  i::FLAG_turbo_osr = false;  // TODO(titzer): interrupts in TF loops.
   v8::Script::Compile(source)->Run();
   CHECK(!v8::V8::IsExecutionTerminating(CcTest::isolate()));
   // Test that we can run the code again after thread termination.
@@ -361,6 +362,7 @@ TEST(TerminateCancelTerminateFromThreadItself) {
   CHECK(!v8::V8::IsExecutionTerminating(CcTest::isolate()));
   v8::Handle<v8::String> source = v8::String::NewFromUtf8(
       isolate, "try { doloop(); } catch(e) { fail(); } 'completed';");
+  i::FLAG_turbo_osr = false;  // TODO(titzer): interrupts in TF loops.
   // Check that execution completed with correct return value.
   CHECK(v8::Script::Compile(source)->Run()->Equals(v8_str("completed")));
 }
@@ -507,6 +509,7 @@ TEST(TerminationInInnerTryCall) {
   v8::Context::Scope context_scope(context);
   {
     v8::TryCatch try_catch;
+    i::FLAG_turbo_osr = false;  // TODO(titzer): interrupts in TF loops.
     CompileRun("inner_try_call_terminate()");
     CHECK(try_catch.HasTerminated());
   }
index 4b3ae5d..a70e497 100644 (file)
@@ -76,6 +76,7 @@
   'json2': [PASS, NO_VARIANTS],
   'packed-elements': [PASS, NO_VARIANTS],
   'unbox-double-arrays': [PASS, NO_VARIANTS],
+  'unicode-test': [PASS, NO_VARIANTS],
   'whitespaces': [PASS, NO_VARIANTS],
   'compiler/osr-assert': [PASS, NO_VARIANTS],
   'regress/regress-2185-2': [PASS, NO_VARIANTS],
   # not work, but we expect it to not crash.
   'debug-step-turbofan': [PASS, FAIL],
 
+  # TODO(mstarzinger): Optimizing top-level code revealed some issues. Fix!
+  'debug-compile-event-newfunction': [PASS, NO_VARIANTS],
+  'debug-evaluate-locals-optimized': [PASS, NO_VARIANTS],
+  'debug-evaluate-locals-optimized-double': [PASS, NO_VARIANTS],
+  'debug-evaluate-recursive': [PASS, NO_VARIANTS],  # only in no-snap debug.
+
+  # TODO(mstarzinger): Optimizing top-level code flushed out some correctness
+  # issues on ARM and ARM64.
+  'es6/math-log2-log10': [PASS, NO_VARIANTS],  # on ARM and ARM64.
+  'mirror-script': [PASS, NO_VARIANTS],  # on ARM64 only.
+
   # TODO(jarin/mstarzinger): Investigate debugger issues with TurboFan.
   'debug-evaluate-const': [PASS, NO_VARIANTS],
   'debug-evaluate-locals': [PASS, NO_VARIANTS],
   'regress/regress-crbug-217858': [PASS, ['mode == debug', SKIP]],
 
   ##############################################################################
-  # Only regexp stuff tested, no need for extensive Crankshaft tests.
+  # Only RegExp stuff tested, no need for extensive optimizing compiler tests.
   'regexp-global': [PASS, NO_VARIANTS],
+  'third_party/regexp-pcre': [PASS, NO_VARIANTS],
 
   ##############################################################################
   # No need to waste time for this test.
index a1254db..109efb7 100644 (file)
   'js1_4/Functions/function-001': [PASS, NO_VARIANTS],
   'js1_5/Regress/regress-80981': [PASS, NO_VARIANTS],
 
+  # TODO(turbofan): Causes timeouts since top-level code is optimized.
+  'ecma_3/Statements/regress-324650': [PASS, NO_VARIANTS],
+  'ecma_3/Statements/regress-74474-002': [PASS, NO_VARIANTS],
+  'ecma_3/Statements/regress-74474-003': [PASS, NO_VARIANTS],
+  'js1_5/Regress/regress-111557': [PASS, NO_VARIANTS],
+  'js1_5/Regress/regress-155081-2': [PASS, NO_VARIANTS],
+  'js1_5/Regress/regress-451322': [PASS, NO_VARIANTS],
+
   # TODO(turbofan): Large switch statements crash.
   'js1_5/Regress/regress-398085-01': [PASS, NO_VARIANTS],
 
+  # TODO(mstarzinger): Investigate failure with lookup slot declaration.
+  'js1_5/Regress/regress-343713': [PASS, NO_VARIANTS],
+
   ############################ INVALID TESTS #############################
 
   # Function length properties are configurable in ES6
index 7ecaed0..9b5181b 100644 (file)
@@ -81,7 +81,7 @@ const SharedOperator kSharedOperators[] = {
     SHARED(CreateWithContext, Operator::kNoProperties, 2, 1, 1, 1, 1, 1, 2),
     SHARED(CreateBlockContext, Operator::kNoProperties, 2, 0, 1, 1, 1, 1, 2),
     SHARED(CreateModuleContext, Operator::kNoProperties, 2, 0, 1, 1, 1, 1, 2),
-    SHARED(CreateScriptContext, Operator::kNoProperties, 2, 0, 1, 1, 1, 1, 2)
+    SHARED(CreateScriptContext, Operator::kNoProperties, 2, 1, 1, 1, 1, 1, 2)
 #undef SHARED
 };