1f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org// Copyright 2012 the V8 project authors. All rights reserved. 2f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org// Redistribution and use in source and binary forms, with or without 3f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org// modification, are permitted provided that the following conditions are 4f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org// met: 5f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org// 6f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org// * Redistributions of source code must retain the above copyright 7f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org// notice, this list of conditions and the following disclaimer. 8f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org// * Redistributions in binary form must reproduce the above 9f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org// copyright notice, this list of conditions and the following 10f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org// disclaimer in the documentation and/or other materials provided 11f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org// with the distribution. 12f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org// * Neither the name of Google Inc. nor the names of its 13f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org// contributors may be used to endorse or promote products derived 14f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org// from this software without specific prior written permission. 15f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org// 16f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 28196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/v8.h" 29f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 30196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "test/cctest/cctest.h" 31f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 32f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgusing namespace v8; 33f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgnamespace i = v8::internal; 34f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 35f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgnamespace { 36f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgclass HarmonyIsolate { 37f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org public: 38f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org HarmonyIsolate() { 39f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org isolate_ = Isolate::New(); 40f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org isolate_->Enter(); 41f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 42f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 43f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org ~HarmonyIsolate() { 44f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org isolate_->Exit(); 45f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org isolate_->Dispose(); 46f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 47f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 48f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org Isolate* GetIsolate() const { return isolate_; } 49f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 50f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org private: 51f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org Isolate* isolate_; 52f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}; 53f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 54f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 55f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 56f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgTEST(MicrotaskDeliverySimple) { 57f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org HarmonyIsolate isolate; 58f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org HandleScope scope(isolate.GetIsolate()); 59f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LocalContext context(isolate.GetIsolate()); 60f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org CompileRun( 61f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org "var ordering = [];" 62f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org "var resolver = {};" 63f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org "function handler(resolve) { resolver.resolve = resolve; }" 64f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org "var obj = {};" 65f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org "var observeOrders = [1, 4];" 66f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org "function observer() {" 67f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org "ordering.push(observeOrders.shift());" 68f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org "resolver.resolve();" 69f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org "}" 70f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org "var p = new Promise(handler);" 71f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org "p.then(function() {" 72f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org "ordering.push(2);" 73f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org "}).then(function() {" 74f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org "ordering.push(3);" 75f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org "obj.id++;" 76f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org "return new Promise(handler);" 77f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org "}).then(function() {" 78f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org "ordering.push(5);" 79f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org "}).then(function() {" 80f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org "ordering.push(6);" 81f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org "});" 82f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org "Object.observe(obj, observer);" 83f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org "obj.id = 1;"); 84f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org CHECK_EQ(6, CompileRun("ordering.length")->Int32Value()); 85f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org CHECK_EQ(1, CompileRun("ordering[0]")->Int32Value()); 86f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org CHECK_EQ(2, CompileRun("ordering[1]")->Int32Value()); 87f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org CHECK_EQ(3, CompileRun("ordering[2]")->Int32Value()); 88f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org CHECK_EQ(4, CompileRun("ordering[3]")->Int32Value()); 89f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org CHECK_EQ(5, CompileRun("ordering[4]")->Int32Value()); 90f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org CHECK_EQ(6, CompileRun("ordering[5]")->Int32Value()); 91f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 92f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 93f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 94f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgTEST(MicrotaskPerIsolateState) { 95f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org HarmonyIsolate isolate; 96f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org HandleScope scope(isolate.GetIsolate()); 97f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LocalContext context1(isolate.GetIsolate()); 98c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org isolate.GetIsolate()->SetAutorunMicrotasks(false); 99f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org CompileRun( 100f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org "var obj = { calls: 0 };"); 101f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org Handle<Value> obj = CompileRun("obj"); 102f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org { 103f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LocalContext context2(isolate.GetIsolate()); 104f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org context2->Global()->Set(String::NewFromUtf8(isolate.GetIsolate(), "obj"), 105f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org obj); 106f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org CompileRun( 107f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org "var resolver = {};" 108f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org "new Promise(function(resolve) {" 109f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org "resolver.resolve = resolve;" 110f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org "}).then(function() {" 111f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org "obj.calls++;" 112f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org "});" 113f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org "(function() {" 114f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org "resolver.resolve();" 115f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org "})();"); 116f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 117f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org { 118f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LocalContext context3(isolate.GetIsolate()); 119f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org context3->Global()->Set(String::NewFromUtf8(isolate.GetIsolate(), "obj"), 120f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org obj); 121f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org CompileRun( 122f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org "var foo = { id: 1 };" 123f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org "Object.observe(foo, function() {" 124f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org "obj.calls++;" 125f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org "});" 126f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org "foo.id++;"); 127f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 128f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org { 129f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org LocalContext context4(isolate.GetIsolate()); 130f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org context4->Global()->Set(String::NewFromUtf8(isolate.GetIsolate(), "obj"), 131f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org obj); 132c8e8806f9e54a027d667425f1bb1b28cf9cbb6f7machenbach@chromium.org isolate.GetIsolate()->RunMicrotasks(); 133f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org CHECK_EQ(2, CompileRun("obj.calls")->Int32Value()); 134f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 135f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org} 136