Reviewers: jochen,

Description:
Run JS micro tasks in the appropriate context.

[email protected]
BUG=385349
LOG=Y

Please review this at https://codereview.chromium.org/332923003/

SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge

Affected files (+37, -6 lines):
  M src/isolate.cc
  M test/cctest/test-api.cc


Index: src/isolate.cc
diff --git a/src/isolate.cc b/src/isolate.cc
index a4b311f6ecacd7d4b4a760931475bf4d9405c2ec..a387c20b28cc964ec2ec02895f7eb4ae9e7bbdb7 100644
--- a/src/isolate.cc
+++ b/src/isolate.cc
@@ -2292,12 +2292,10 @@ void Isolate::EnqueueMicrotask(Handle<Object> microtask) {


 void Isolate::RunMicrotasks() {
-  // TODO(adamk): This ASSERT triggers in mjsunit tests which
-  // call the %RunMicrotasks runtime function. But it should
-  // never happen outside of tests, so it would be nice to
-  // uncomment it.
-  //
-  // ASSERT(handle_scope_implementer()->CallDepthIsZero());
+  // In some mjsunit tests %RunMicrotasks is called explicitly, violating
+  // this assertion.  Therefore we also check for --allow-natives-syntax.
+  ASSERT(FLAG_allow_natives_syntax ||
+         handle_scope_implementer()->CallDepthIsZero());

   // Increase call depth to prevent recursive callbacks.
   v8::Isolate::SuppressMicrotaskExecutionScope suppress(
@@ -2317,6 +2315,8 @@ void Isolate::RunMicrotasks() {
       if (microtask->IsJSFunction()) {
         Handle<JSFunction> microtask_function =
             Handle<JSFunction>::cast(microtask);
+        SaveContext save(this);
+        set_context(microtask_function->context()->native_context());
         Handle<Object> exception;
         MaybeHandle<Object> result = Execution::TryCall(
             microtask_function, factory()->undefined_value(),
Index: test/cctest/test-api.cc
diff --git a/test/cctest/test-api.cc b/test/cctest/test-api.cc
index 229950f8d48a7cbd1e11d975d4ba26fc67f336b6..5283a1d2f01bd49fe380768cf30a742b142ab3db 100644
--- a/test/cctest/test-api.cc
+++ b/test/cctest/test-api.cc
@@ -20953,6 +20953,37 @@ TEST(RunMicrotasksWithoutEnteringContext) {
 }


+static void DebugEventInObserver(const v8::Debug::EventDetails& event_details) {
+  v8::DebugEvent event = event_details.GetEvent();
+  if (event != v8::Break) return;
+  Handle<Object> exec_state = event_details.GetExecutionState();
+  Handle<Value> break_id = exec_state->Get(v8_str("break_id"));
+  CompileRun("function f(id) { new FrameDetails(id, 0); }");
+  Handle<Function> fun = Handle<Function>::Cast(
+      CcTest::global()->Get(v8_str("f"))->ToObject());
+  fun->Call(CcTest::global(), 1, &break_id);
+}
+
+
+TEST(Regress385349) {
+  i::FLAG_allow_natives_syntax = true;
+  v8::Isolate* isolate = CcTest::isolate();
+  HandleScope handle_scope(isolate);
+  isolate->SetAutorunMicrotasks(false);
+  Handle<Context> context = Context::New(isolate);
+  v8::Debug::SetDebugEventListener(DebugEventInObserver);
+  {
+    Context::Scope context_scope(context);
+    CompileRun("var obj = {};"
+               "Object.observe(obj, function(changes) { debugger; });"
+               "obj.a = 0;");
+  }
+  isolate->RunMicrotasks();
+  isolate->SetAutorunMicrotasks(true);
+  v8::Debug::SetDebugEventListener(NULL);
+}
+
+
 static int probes_counter = 0;
 static int misses_counter = 0;
 static int updates_counter = 0;


--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
--- You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to