Commit 9e3ba659 authored by yangguo@chromium.org's avatar yangguo@chromium.org

Run JS micro tasks in the appropriate context.

R=jochen@chromium.org
BUG=385349
LOG=Y

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

git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@21933 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 1b080a76
......@@ -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(),
......
......@@ -20828,6 +20828,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;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment