1659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org// Copyright 2012 the V8 project authors. All rights reserved. 29a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Redistribution and use in source and binary forms, with or without 39a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// modification, are permitted provided that the following conditions are 49a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// met: 59a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// 69a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// * Redistributions of source code must retain the above copyright 79a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// notice, this list of conditions and the following disclaimer. 89a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// * Redistributions in binary form must reproduce the above 99a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// copyright notice, this list of conditions and the following 109a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// disclaimer in the documentation and/or other materials provided 119a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// with the distribution. 129a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// * Neither the name of Google Inc. nor the names of its 139a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// contributors may be used to endorse or promote products derived 149a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// from this software without specific prior written permission. 159a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// 169a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 179a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 189a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 199a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 209a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 219a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 229a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 239a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 249a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 259a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 269a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 279a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 285ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org#ifdef ENABLE_DEBUGGER_SUPPORT 295ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org 309a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include <stdlib.h> 319a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 329a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include "v8.h" 339a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 349a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include "api.h" 35a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org#include "cctest.h" 36b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org#include "compilation-cache.h" 379a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include "debug.h" 38a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org#include "deoptimizer.h" 39639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org#include "frames.h" 409a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include "platform.h" 413d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org#include "platform/condition-variable.h" 423d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org#include "platform/socket.h" 439a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include "stub-cache.h" 44a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org#include "utils.h" 459a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 46b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org 473d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.orgusing ::v8::internal::Mutex; 483d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.orgusing ::v8::internal::LockGuard; 493d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.orgusing ::v8::internal::ConditionVariable; 503d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.orgusing ::v8::internal::Semaphore; 51b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.orgusing ::v8::internal::EmbeddedVector; 529a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comusing ::v8::internal::Object; 539a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comusing ::v8::internal::OS; 549a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comusing ::v8::internal::Handle; 559a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comusing ::v8::internal::Heap; 565a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.orgusing ::v8::internal::JSGlobalProxy; 579a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comusing ::v8::internal::Code; 589a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comusing ::v8::internal::Debug; 599a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comusing ::v8::internal::Debugger; 603a37e9b96c768f6b5b6b09542e1cb1a1ece7a022ager@chromium.orgusing ::v8::internal::CommandMessage; 613a37e9b96c768f6b5b6b09542e1cb1a1ece7a022ager@chromium.orgusing ::v8::internal::CommandMessageQueue; 62639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.orgusing ::v8::internal::StackFrame; 639a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comusing ::v8::internal::StepAction; 649a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comusing ::v8::internal::StepIn; // From StepAction enum 659a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comusing ::v8::internal::StepNext; // From StepAction enum 669a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comusing ::v8::internal::StepOut; // From StepAction enum 6765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.orgusing ::v8::internal::Vector; 68c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.orgusing ::v8::internal::StrLength; 699a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 709a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Size of temp buffer for formatting small strings. 719a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#define SMALL_STRING_BUFFER_SIZE 80 729a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 739a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// --- A d d i t i o n a l C h e c k H e l p e r s 749a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 759a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 769a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Helper function used by the CHECK_EQ function when given Address 779a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// arguments. Should not be called directly. 789a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comstatic inline void CheckEqualsHelper(const char* file, int line, 799a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com const char* expected_source, 809a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com ::v8::internal::Address expected, 819a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com const char* value_source, 829a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com ::v8::internal::Address value) { 839a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com if (expected != value) { 849a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com V8_Fatal(file, line, "CHECK_EQ(%s, %s) failed\n# " 859a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "Expected: %i\n# Found: %i", 869a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com expected_source, value_source, expected, value); 879a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com } 889a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 899a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 909a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 919a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Helper function used by the CHECK_NE function when given Address 929a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// arguments. Should not be called directly. 939a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comstatic inline void CheckNonEqualsHelper(const char* file, int line, 949a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com const char* unexpected_source, 959a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com ::v8::internal::Address unexpected, 969a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com const char* value_source, 979a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com ::v8::internal::Address value) { 989a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com if (unexpected == value) { 999a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com V8_Fatal(file, line, "CHECK_NE(%s, %s) failed\n# Value: %i", 1009a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com unexpected_source, value_source, value); 1019a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com } 1029a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 1039a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 1049a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 1059a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Helper function used by the CHECK function when given code 1069a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// arguments. Should not be called directly. 1079a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comstatic inline void CheckEqualsHelper(const char* file, int line, 1089a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com const char* expected_source, 1099a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com const Code* expected, 1109a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com const char* value_source, 1119a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com const Code* value) { 1129a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com if (expected != value) { 1139a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com V8_Fatal(file, line, "CHECK_EQ(%s, %s) failed\n# " 1149a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "Expected: %p\n# Found: %p", 1159a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com expected_source, value_source, expected, value); 1169a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com } 1179a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 1189a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 1199a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 1209a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comstatic inline void CheckNonEqualsHelper(const char* file, int line, 1219a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com const char* expected_source, 1229a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com const Code* expected, 1239a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com const char* value_source, 1249a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com const Code* value) { 1259a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com if (expected == value) { 1269a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com V8_Fatal(file, line, "CHECK_NE(%s, %s) failed\n# Value: %p", 1279a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com expected_source, value_source, value); 1289a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com } 1299a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 1309a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 1319a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 1329a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// --- H e l p e r C l a s s e s 1339a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 1349a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 1359a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Helper class for creating a V8 enviromnent for running tests 1369a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comclass DebugLocalContext { 1379a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com public: 1389a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com inline DebugLocalContext( 1399a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::ExtensionConfiguration* extensions = 0, 1409a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::Handle<v8::ObjectTemplate> global_template = 1419a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::Handle<v8::ObjectTemplate>(), 1429a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::Handle<v8::Value> global_object = v8::Handle<v8::Value>()) 143528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org : scope_(CcTest::isolate()), 14457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org context_( 145528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Context::New(CcTest::isolate(), 14657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org extensions, 14757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org global_template, 14857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org global_object)) { 1499a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com context_->Enter(); 1509a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com } 1519a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com inline ~DebugLocalContext() { 1529a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com context_->Exit(); 1539a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com } 154f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org inline v8::Local<v8::Context> context() { return context_; } 1559a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com inline v8::Context* operator->() { return *context_; } 1569a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com inline v8::Context* operator*() { return *context_; } 157f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org inline v8::Isolate* GetIsolate() { return context_->GetIsolate(); } 1589a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com inline bool IsReady() { return !context_.IsEmpty(); } 1599a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com void ExposeDebug() { 16009d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org v8::internal::Isolate* isolate = 16109d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org reinterpret_cast<v8::internal::Isolate*>(context_->GetIsolate()); 162d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org v8::internal::Factory* factory = isolate->factory(); 1638e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org v8::internal::Debug* debug = isolate->debug(); 1649a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Expose the debug context global object in the global object for testing. 165ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org debug->Load(); 166ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org debug->debug_context()->set_security_token( 1675a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org v8::Utils::OpenHandle(*context_)->security_token()); 1685a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org 1695a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org Handle<JSGlobalProxy> global(Handle<JSGlobalProxy>::cast( 1709a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::Utils::OpenHandle(*context_->Global()))); 1719a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com Handle<v8::internal::String> debug_string = 172d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org factory->InternalizeOneByteString(STATIC_ASCII_VECTOR("debug")); 173e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org v8::internal::Runtime::SetObjectProperty(isolate, global, debug_string, 174e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org Handle<Object>(debug->debug_context()->global_proxy(), isolate), 175e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org DONT_ENUM, 176e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org ::v8::internal::kNonStrictMode); 1779a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com } 17883e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org 1799a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com private: 18057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org v8::HandleScope scope_; 18157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org v8::Local<v8::Context> context_; 1829a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}; 1839a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 1849a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 1859a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// --- H e l p e r F u n c t i o n s 1869a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 1879a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 1889a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Compile and run the supplied source and return the fequested function. 1899a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comstatic v8::Local<v8::Function> CompileFunction(DebugLocalContext* env, 1909a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com const char* source, 1919a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com const char* function_name) { 192f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Script::Compile(v8::String::NewFromUtf8(env->GetIsolate(), source)) 193f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org ->Run(); 194f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org return v8::Local<v8::Function>::Cast((*env)->Global()->Get( 195f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::String::NewFromUtf8(env->GetIsolate(), function_name))); 1969a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 1979a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 1989085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org 1999085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org// Compile and run the supplied source and return the requested function. 200f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.orgstatic v8::Local<v8::Function> CompileFunction(v8::Isolate* isolate, 201f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org const char* source, 2029085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org const char* function_name) { 203f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Script::Compile(v8::String::NewFromUtf8(isolate, source))->Run(); 204528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Local<v8::Object> global = 205528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org CcTest::isolate()->GetCurrentContext()->Global(); 2069085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org return v8::Local<v8::Function>::Cast( 207f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org global->Get(v8::String::NewFromUtf8(isolate, function_name))); 2089085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org} 2099085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org 2109085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org 2119a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Is there any debug info for the function? 2129a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comstatic bool HasDebugInfo(v8::Handle<v8::Function> fun) { 2139a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com Handle<v8::internal::JSFunction> f = v8::Utils::OpenHandle(*fun); 2149a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com Handle<v8::internal::SharedFunctionInfo> shared(f->shared()); 2159a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com return Debug::HasDebugInfo(shared); 2169a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 2179a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 2189a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 2199a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Set a break point in a function and return the associated break point 2209a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// number. 2219a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comstatic int SetBreakPoint(Handle<v8::internal::JSFunction> fun, int position) { 2229a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com static int break_point = 0; 22309d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org v8::internal::Isolate* isolate = fun->GetIsolate(); 22409d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org v8::internal::Debug* debug = isolate->debug(); 225ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org debug->SetBreakPoint( 2265a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org fun, 22709d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org Handle<Object>(v8::internal::Smi::FromInt(++break_point), isolate), 2285ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org &position); 2299a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com return break_point; 2309a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 2319a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 2329a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 2339a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Set a break point in a function and return the associated break point 2349a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// number. 2359a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comstatic int SetBreakPoint(v8::Handle<v8::Function> fun, int position) { 2369a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com return SetBreakPoint(v8::Utils::OpenHandle(*fun), position); 2379a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 2389a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 2399a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 2409a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Set a break point in a function using the Debug object and return the 2419a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// associated break point number. 242f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.orgstatic int SetBreakPointFromJS(v8::Isolate* isolate, 243f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org const char* function_name, 2449a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com int line, int position) { 245b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org EmbeddedVector<char, SMALL_STRING_BUFFER_SIZE> buffer; 246b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org OS::SNPrintF(buffer, 2479a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "debug.Debug.setBreakPoint(%s,%d,%d)", 2489a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com function_name, line, position); 2499a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com buffer[SMALL_STRING_BUFFER_SIZE - 1] = '\0'; 250f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Handle<v8::String> str = v8::String::NewFromUtf8(isolate, buffer.start()); 251b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org return v8::Script::Compile(str)->Run()->Int32Value(); 2529a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 2539a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 2549a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 2557be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org// Set a break point in a script identified by id using the global Debug object. 256f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.orgstatic int SetScriptBreakPointByIdFromJS(v8::Isolate* isolate, int script_id, 257f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org int line, int column) { 258b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org EmbeddedVector<char, SMALL_STRING_BUFFER_SIZE> buffer; 2599a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com if (column >= 0) { 2609a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Column specified set script break point on precise location. 261b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org OS::SNPrintF(buffer, 2627be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org "debug.Debug.setScriptBreakPointById(%d,%d,%d)", 2637be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org script_id, line, column); 2649a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com } else { 2659a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Column not specified set script break point on line. 266b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org OS::SNPrintF(buffer, 2677be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org "debug.Debug.setScriptBreakPointById(%d,%d)", 2687be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org script_id, line); 2697be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org } 2707be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org buffer[SMALL_STRING_BUFFER_SIZE - 1] = '\0'; 2717be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org { 2727be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org v8::TryCatch try_catch; 273f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Handle<v8::String> str = 274f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::String::NewFromUtf8(isolate, buffer.start()); 2757be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org v8::Handle<v8::Value> value = v8::Script::Compile(str)->Run(); 2763a37e9b96c768f6b5b6b09542e1cb1a1ece7a022ager@chromium.org CHECK(!try_catch.HasCaught()); 2777be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org return value->Int32Value(); 2787be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org } 2797be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org} 2807be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org 2817be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org 2827be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org// Set a break point in a script identified by name using the global Debug 2837be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org// object. 284f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.orgstatic int SetScriptBreakPointByNameFromJS(v8::Isolate* isolate, 285f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org const char* script_name, int line, 286f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org int column) { 2877be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org EmbeddedVector<char, SMALL_STRING_BUFFER_SIZE> buffer; 2887be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org if (column >= 0) { 2897be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org // Column specified set script break point on precise location. 2907be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org OS::SNPrintF(buffer, 2917be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org "debug.Debug.setScriptBreakPointByName(\"%s\",%d,%d)", 2927be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org script_name, line, column); 2937be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org } else { 2947be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org // Column not specified set script break point on line. 2957be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org OS::SNPrintF(buffer, 2967be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org "debug.Debug.setScriptBreakPointByName(\"%s\",%d)", 2977be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org script_name, line); 2989a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com } 2999a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com buffer[SMALL_STRING_BUFFER_SIZE - 1] = '\0'; 3005a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org { 3015a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org v8::TryCatch try_catch; 302f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Handle<v8::String> str = 303f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::String::NewFromUtf8(isolate, buffer.start()); 3045a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org v8::Handle<v8::Value> value = v8::Script::Compile(str)->Run(); 3053a37e9b96c768f6b5b6b09542e1cb1a1ece7a022ager@chromium.org CHECK(!try_catch.HasCaught()); 3065a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org return value->Int32Value(); 3075a8ca6c70c6fc9716f18f6223c98d1fef5752cf6kasperl@chromium.org } 3089a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 3099a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 3109a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 3119a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Clear a break point. 3129a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comstatic void ClearBreakPoint(int break_point) { 313528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::internal::Isolate* isolate = CcTest::i_isolate(); 31409d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org v8::internal::Debug* debug = isolate->debug(); 315ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org debug->ClearBreakPoint( 31609d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org Handle<Object>(v8::internal::Smi::FromInt(break_point), isolate)); 3179a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 3189a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 3199a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 3209a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Clear a break point using the global Debug object. 321f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.orgstatic void ClearBreakPointFromJS(v8::Isolate* isolate, 322f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org int break_point_number) { 323b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org EmbeddedVector<char, SMALL_STRING_BUFFER_SIZE> buffer; 324b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org OS::SNPrintF(buffer, 3259a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "debug.Debug.clearBreakPoint(%d)", 3269a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_number); 3279a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com buffer[SMALL_STRING_BUFFER_SIZE - 1] = '\0'; 328f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Script::Compile(v8::String::NewFromUtf8(isolate, buffer.start()))->Run(); 3299a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 3309a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 3319a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 332f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.orgstatic void EnableScriptBreakPointFromJS(v8::Isolate* isolate, 333f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org int break_point_number) { 334b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org EmbeddedVector<char, SMALL_STRING_BUFFER_SIZE> buffer; 335b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org OS::SNPrintF(buffer, 3369a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "debug.Debug.enableScriptBreakPoint(%d)", 3379a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_number); 3389a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com buffer[SMALL_STRING_BUFFER_SIZE - 1] = '\0'; 339f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Script::Compile(v8::String::NewFromUtf8(isolate, buffer.start()))->Run(); 3409a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 3419a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 3429a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 343f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.orgstatic void DisableScriptBreakPointFromJS(v8::Isolate* isolate, 344f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org int break_point_number) { 345b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org EmbeddedVector<char, SMALL_STRING_BUFFER_SIZE> buffer; 346b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org OS::SNPrintF(buffer, 3479a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "debug.Debug.disableScriptBreakPoint(%d)", 3489a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_number); 3499a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com buffer[SMALL_STRING_BUFFER_SIZE - 1] = '\0'; 350f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Script::Compile(v8::String::NewFromUtf8(isolate, buffer.start()))->Run(); 3519a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 3529a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 3539a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 354f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.orgstatic void ChangeScriptBreakPointConditionFromJS(v8::Isolate* isolate, 355f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org int break_point_number, 3569a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com const char* condition) { 357b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org EmbeddedVector<char, SMALL_STRING_BUFFER_SIZE> buffer; 358b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org OS::SNPrintF(buffer, 3599a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "debug.Debug.changeScriptBreakPointCondition(%d, \"%s\")", 3609a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_number, condition); 3619a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com buffer[SMALL_STRING_BUFFER_SIZE - 1] = '\0'; 362f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Script::Compile(v8::String::NewFromUtf8(isolate, buffer.start()))->Run(); 3639a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 3649a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 3659a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 366f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.orgstatic void ChangeScriptBreakPointIgnoreCountFromJS(v8::Isolate* isolate, 367f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org int break_point_number, 3689a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com int ignoreCount) { 369b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org EmbeddedVector<char, SMALL_STRING_BUFFER_SIZE> buffer; 370b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org OS::SNPrintF(buffer, 3719a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "debug.Debug.changeScriptBreakPointIgnoreCount(%d, %d)", 3729a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_number, ignoreCount); 3739a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com buffer[SMALL_STRING_BUFFER_SIZE - 1] = '\0'; 374f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Script::Compile(v8::String::NewFromUtf8(isolate, buffer.start()))->Run(); 3759a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 3769a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 3779a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 3789a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Change break on exception. 3799a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comstatic void ChangeBreakOnException(bool caught, bool uncaught) { 380528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::internal::Debug* debug = CcTest::i_isolate()->debug(); 381ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org debug->ChangeBreakOnException(v8::internal::BreakException, caught); 382ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org debug->ChangeBreakOnException(v8::internal::BreakUncaughtException, uncaught); 3839a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 3849a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 3859a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 3869a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Change break on exception using the global Debug object. 387f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.orgstatic void ChangeBreakOnExceptionFromJS(v8::Isolate* isolate, bool caught, 388f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org bool uncaught) { 3899a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com if (caught) { 3909a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::Script::Compile( 391f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::String::NewFromUtf8(isolate, "debug.Debug.setBreakOnException()")) 392f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org ->Run(); 3939a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com } else { 3949a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::Script::Compile( 395f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::String::NewFromUtf8(isolate, "debug.Debug.clearBreakOnException()")) 396f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org ->Run(); 3979a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com } 3989a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com if (uncaught) { 3999a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::Script::Compile( 400f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::String::NewFromUtf8( 401f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org isolate, "debug.Debug.setBreakOnUncaughtException()"))->Run(); 4029a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com } else { 4039a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::Script::Compile( 404f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::String::NewFromUtf8( 405f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org isolate, "debug.Debug.clearBreakOnUncaughtException()"))->Run(); 4069a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com } 4079a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 4089a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 4099a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 4109a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Prepare to step to next break location. 4119a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comstatic void PrepareStep(StepAction step_action) { 412528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::internal::Debug* debug = CcTest::i_isolate()->debug(); 413639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org debug->PrepareStep(step_action, 1, StackFrame::NO_ID); 4149a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 4159a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 4169a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 4179a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// This function is in namespace v8::internal to be friend with class 4189a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// v8::internal::Debug. 41971affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace v8 { 42071affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace internal { 4219a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 4229a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Collect the currently debugged functions. 4239a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comHandle<FixedArray> GetDebuggedFunctions() { 424528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org Debug* debug = CcTest::i_isolate()->debug(); 425ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 426ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org v8::internal::DebugInfoListNode* node = debug->debug_info_list_; 4279a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 4289a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Find the number of debugged functions. 4299a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com int count = 0; 4309a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com while (node) { 4319a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com count++; 4329a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com node = node->next(); 4339a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com } 4349a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 4359a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Allocate array for the debugged functions 4369a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com Handle<FixedArray> debugged_functions = 437528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org CcTest::i_isolate()->factory()->NewFixedArray(count); 4389a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 4399a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Run through the debug info objects and collect all functions. 4409a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com count = 0; 4419a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com while (node) { 4429a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com debugged_functions->set(count++, *node->debug_info()); 4439a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com node = node->next(); 4449a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com } 4459a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 4469a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com return debugged_functions; 4479a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 4489a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 4499a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 4509a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comstatic Handle<Code> ComputeCallDebugBreak(int argc) { 451528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org return CcTest::i_isolate()->stub_cache()->ComputeCallDebugBreak(argc, 452394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com Code::CALL_IC); 4539a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 4549a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 455381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org 456381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org// Check that the debugger has been fully unloaded. 457381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.orgvoid CheckDebuggerUnloaded(bool check_functions) { 458381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org // Check that the debugger context is cleared and that there is no debug 459381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org // information stored for the debugger. 460528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org CHECK(CcTest::i_isolate()->debug()->debug_context().is_null()); 461528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org CHECK_EQ(NULL, CcTest::i_isolate()->debug()->debug_info_list_); 462381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org 463381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org // Collect garbage to ensure weak handles are cleared. 464528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org CcTest::heap()->CollectAllGarbage(Heap::kNoGCFlags); 465528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org CcTest::heap()->CollectAllGarbage(Heap::kMakeHeapIterableMask); 466381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org 467381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org // Iterate the head and check that there are no debugger related objects left. 468528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org HeapIterator iterator(CcTest::heap()); 469b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org for (HeapObject* obj = iterator.next(); obj != NULL; obj = iterator.next()) { 470381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org CHECK(!obj->IsDebugInfo()); 471381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org CHECK(!obj->IsBreakPointInfo()); 472381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org 473381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org // If deep check of functions is requested check that no debug break code 474381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org // is left in all functions. 475381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org if (check_functions) { 476381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org if (obj->IsJSFunction()) { 477381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org JSFunction* fun = JSFunction::cast(obj); 478381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org for (RelocIterator it(fun->shared()->code()); !it.done(); it.next()) { 479381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org RelocInfo::Mode rmode = it.rinfo()->rmode(); 480381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org if (RelocInfo::IsCodeTarget(rmode)) { 481381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org CHECK(!Debug::IsDebugBreak(it.rinfo()->target_address())); 482381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org } else if (RelocInfo::IsJSReturn(rmode)) { 483381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org CHECK(!Debug::IsDebugBreakAtReturn(it.rinfo())); 484381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org } 485381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org } 486381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org } 487381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org } 488381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org } 489381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org} 490381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org 491381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org 492c34f5802a37a9fa2ce8f3929d1d5159ddcf04ff3lrn@chromium.orgvoid ForceUnloadDebugger() { 493528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org CcTest::i_isolate()->debugger()->never_unload_debugger_ = false; 494528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org CcTest::i_isolate()->debugger()->UnloadDebugger(); 495c34f5802a37a9fa2ce8f3929d1d5159ddcf04ff3lrn@chromium.org} 496c34f5802a37a9fa2ce8f3929d1d5159ddcf04ff3lrn@chromium.org 497c34f5802a37a9fa2ce8f3929d1d5159ddcf04ff3lrn@chromium.org 4989a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} } // namespace v8::internal 4999a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 500381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org 501381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org// Check that the debugger has been fully unloaded. 502381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.orgstatic void CheckDebuggerUnloaded(bool check_functions = false) { 503b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org // Let debugger to unload itself synchronously 504b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org v8::Debug::ProcessDebugMessages(); 505b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 506381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org v8::internal::CheckDebuggerUnloaded(check_functions); 507381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org} 508381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org 509381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org 5109a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Inherit from BreakLocationIterator to get access to protected parts for 5119a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// testing. 5129a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comclass TestBreakLocationIterator: public v8::internal::BreakLocationIterator { 5139a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com public: 5149a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com explicit TestBreakLocationIterator(Handle<v8::internal::DebugInfo> debug_info) 5159a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com : BreakLocationIterator(debug_info, v8::internal::SOURCE_BREAK_LOCATIONS) {} 5169a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::internal::RelocIterator* it() { return reloc_iterator_; } 5179a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::internal::RelocIterator* it_original() { 5189a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com return reloc_iterator_original_; 5199a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com } 5209a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}; 5219a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 5229a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 5239a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Compile a function, set a break point and check that the call at the break 5249a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// location in the code is the expected debug_break function. 5259a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comvoid CheckDebugBreakFunction(DebugLocalContext* env, 5269a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com const char* source, const char* name, 527236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org int position, v8::internal::RelocInfo::Mode mode, 5289a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com Code* debug_break) { 529528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::internal::Debug* debug = CcTest::i_isolate()->debug(); 530ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 5319a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Create function and set the break point. 5329a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com Handle<v8::internal::JSFunction> fun = v8::Utils::OpenHandle( 5339a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com *CompileFunction(env, source, name)); 5349a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com int bp = SetBreakPoint(fun, position); 5359a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 5369a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Check that the debug break function is as expected. 5379a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com Handle<v8::internal::SharedFunctionInfo> shared(fun->shared()); 5389a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK(Debug::HasDebugInfo(shared)); 5399a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com TestBreakLocationIterator it1(Debug::GetDebugInfo(shared)); 54093a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org it1.FindBreakLocationFromPosition(position, v8::internal::STATEMENT_ALIGNED); 5418e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org v8::internal::RelocInfo::Mode actual_mode = it1.it()->rinfo()->rmode(); 5428e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org if (actual_mode == v8::internal::RelocInfo::CODE_TARGET_WITH_ID) { 5438e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org actual_mode = v8::internal::RelocInfo::CODE_TARGET; 5448e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org } 5458e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org CHECK_EQ(mode, actual_mode); 546236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org if (mode != v8::internal::RelocInfo::JS_RETURN) { 5479a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(debug_break, 5488bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org Code::GetCodeFromTargetAddress(it1.it()->rinfo()->target_address())); 5499a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com } else { 550911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org CHECK(Debug::IsDebugBreakAtReturn(it1.it()->rinfo())); 5519a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com } 5529a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 5539a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Clear the break point and check that the debug break function is no longer 5549a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // there 5559a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com ClearBreakPoint(bp); 556ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org CHECK(!debug->HasDebugInfo(shared)); 5575a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org CHECK(debug->EnsureDebugInfo(shared, fun)); 5589a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com TestBreakLocationIterator it2(Debug::GetDebugInfo(shared)); 55993a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org it2.FindBreakLocationFromPosition(position, v8::internal::STATEMENT_ALIGNED); 5608e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org actual_mode = it2.it()->rinfo()->rmode(); 5618e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org if (actual_mode == v8::internal::RelocInfo::CODE_TARGET_WITH_ID) { 5628e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org actual_mode = v8::internal::RelocInfo::CODE_TARGET; 5638e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org } 5648e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org CHECK_EQ(mode, actual_mode); 565236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org if (mode == v8::internal::RelocInfo::JS_RETURN) { 566911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org CHECK(!Debug::IsDebugBreakAtReturn(it2.it()->rinfo())); 5679a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com } 5689a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 5699a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 5709a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 5719a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// --- D e b u g E v e n t H a n d l e r s 5729a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// --- 5739a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// --- The different tests uses a number of debug event handlers. 5749a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// --- 5759a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 5769a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 577a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// Source for the JavaScript function which picks out the function 578a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// name of a frame. 5799a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comconst char* frame_function_name_source = 580a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org "function frame_function_name(exec_state, frame_number) {" 581a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org " return exec_state.frame(frame_number).func().name();" 5829a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "}"; 5839a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comv8::Local<v8::Function> frame_function_name; 5849a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 5858bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org 586a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// Source for the JavaScript function which pick out the name of the 587a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// first argument of a frame. 588a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgconst char* frame_argument_name_source = 589a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org "function frame_argument_name(exec_state, frame_number) {" 590a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org " return exec_state.frame(frame_number).argumentName(0);" 591a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org "}"; 592a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgv8::Local<v8::Function> frame_argument_name; 593a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 594a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 595a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// Source for the JavaScript function which pick out the value of the 596a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// first argument of a frame. 597a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgconst char* frame_argument_value_source = 598a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org "function frame_argument_value(exec_state, frame_number) {" 599a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org " return exec_state.frame(frame_number).argumentValue(0).value_;" 600a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org "}"; 601a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgv8::Local<v8::Function> frame_argument_value; 602a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 603a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 604a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// Source for the JavaScript function which pick out the name of the 605a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// first argument of a frame. 606a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgconst char* frame_local_name_source = 607a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org "function frame_local_name(exec_state, frame_number) {" 608a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org " return exec_state.frame(frame_number).localName(0);" 609a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org "}"; 610a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgv8::Local<v8::Function> frame_local_name; 611a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 612a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 613a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// Source for the JavaScript function which pick out the value of the 614a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// first argument of a frame. 615a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgconst char* frame_local_value_source = 616a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org "function frame_local_value(exec_state, frame_number) {" 617a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org " return exec_state.frame(frame_number).localValue(0).value_;" 618a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org "}"; 619a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgv8::Local<v8::Function> frame_local_value; 620a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 621a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 622a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// Source for the JavaScript function which picks out the source line for the 6232d18d10b30bbe822dcb5e2d6e90fd7863496243ckasperl@chromium.org// top frame. 6242d18d10b30bbe822dcb5e2d6e90fd7863496243ckasperl@chromium.orgconst char* frame_source_line_source = 6252d18d10b30bbe822dcb5e2d6e90fd7863496243ckasperl@chromium.org "function frame_source_line(exec_state) {" 6262d18d10b30bbe822dcb5e2d6e90fd7863496243ckasperl@chromium.org " return exec_state.frame(0).sourceLine();" 6272d18d10b30bbe822dcb5e2d6e90fd7863496243ckasperl@chromium.org "}"; 6282d18d10b30bbe822dcb5e2d6e90fd7863496243ckasperl@chromium.orgv8::Local<v8::Function> frame_source_line; 6292d18d10b30bbe822dcb5e2d6e90fd7863496243ckasperl@chromium.org 6302d18d10b30bbe822dcb5e2d6e90fd7863496243ckasperl@chromium.org 631a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// Source for the JavaScript function which picks out the source column for the 6322d18d10b30bbe822dcb5e2d6e90fd7863496243ckasperl@chromium.org// top frame. 6332d18d10b30bbe822dcb5e2d6e90fd7863496243ckasperl@chromium.orgconst char* frame_source_column_source = 6342d18d10b30bbe822dcb5e2d6e90fd7863496243ckasperl@chromium.org "function frame_source_column(exec_state) {" 6352d18d10b30bbe822dcb5e2d6e90fd7863496243ckasperl@chromium.org " return exec_state.frame(0).sourceColumn();" 6362d18d10b30bbe822dcb5e2d6e90fd7863496243ckasperl@chromium.org "}"; 6372d18d10b30bbe822dcb5e2d6e90fd7863496243ckasperl@chromium.orgv8::Local<v8::Function> frame_source_column; 6382d18d10b30bbe822dcb5e2d6e90fd7863496243ckasperl@chromium.org 6392d18d10b30bbe822dcb5e2d6e90fd7863496243ckasperl@chromium.org 640a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// Source for the JavaScript function which picks out the script name for the 64165dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org// top frame. 64265dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.orgconst char* frame_script_name_source = 64365dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org "function frame_script_name(exec_state) {" 64465dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org " return exec_state.frame(0).func().script().name();" 64565dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org "}"; 64665dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.orgv8::Local<v8::Function> frame_script_name; 64765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 64865dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 649a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// Source for the JavaScript function which picks out the script data for the 65065dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org// top frame. 65165dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.orgconst char* frame_script_data_source = 65265dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org "function frame_script_data(exec_state) {" 65365dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org " return exec_state.frame(0).func().script().data();" 65465dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org "}"; 65565dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.orgv8::Local<v8::Function> frame_script_data; 65665dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 65765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 658a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// Source for the JavaScript function which picks out the script data from 6595c838251403b0be9a882540f1922577abba4c872ager@chromium.org// AfterCompile event 6605c838251403b0be9a882540f1922577abba4c872ager@chromium.orgconst char* compiled_script_data_source = 6615c838251403b0be9a882540f1922577abba4c872ager@chromium.org "function compiled_script_data(event_data) {" 6625c838251403b0be9a882540f1922577abba4c872ager@chromium.org " return event_data.script().data();" 6635c838251403b0be9a882540f1922577abba4c872ager@chromium.org "}"; 6645c838251403b0be9a882540f1922577abba4c872ager@chromium.orgv8::Local<v8::Function> compiled_script_data; 6655c838251403b0be9a882540f1922577abba4c872ager@chromium.org 6665c838251403b0be9a882540f1922577abba4c872ager@chromium.org 667a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// Source for the JavaScript function which returns the number of frames. 6688bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.orgstatic const char* frame_count_source = 6698bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org "function frame_count(exec_state) {" 6708bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org " return exec_state.frameCount();" 6718bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org "}"; 6728bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.orgv8::Handle<v8::Function> frame_count; 6738bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org 6748bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org 6759a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Global variable to store the last function hit - used by some tests. 6769a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comchar last_function_hit[80]; 6779a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 67865dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org// Global variable to store the name and data for last script hit - used by some 67965dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org// tests. 68065dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.orgchar last_script_name_hit[80]; 68165dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.orgchar last_script_data_hit[80]; 68265dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 6832d18d10b30bbe822dcb5e2d6e90fd7863496243ckasperl@chromium.org// Global variables to store the last source position - used by some tests. 6842d18d10b30bbe822dcb5e2d6e90fd7863496243ckasperl@chromium.orgint last_source_line = -1; 6852d18d10b30bbe822dcb5e2d6e90fd7863496243ckasperl@chromium.orgint last_source_column = -1; 6862d18d10b30bbe822dcb5e2d6e90fd7863496243ckasperl@chromium.org 6879a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Debug event handler which counts the break points which have been hit. 6889a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comint break_point_hit_count = 0; 689ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.orgint break_point_hit_count_deoptimize = 0; 690662436e7b124b3535773535c671c53db322070b5verwaest@chromium.orgstatic void DebugEventBreakPointHitCount( 691662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org const v8::Debug::EventDetails& event_details) { 692662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::DebugEvent event = event_details.GetEvent(); 693662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Handle<v8::Object> exec_state = event_details.GetExecutionState(); 694662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Handle<v8::Object> event_data = event_details.GetEventData(); 695528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::internal::Isolate* isolate = CcTest::i_isolate(); 696876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org Debug* debug = isolate->debug(); 6978bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org // When hitting a debug event listener there must be a break set. 698ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org CHECK_NE(debug->break_id(), 0); 6998bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org 7009a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Count the number of breaks. 7019a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com if (event == v8::Break) { 7029a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_hit_count++; 7039a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com if (!frame_function_name.IsEmpty()) { 7049a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Get the name of the function. 705a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org const int argc = 2; 706a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org v8::Handle<v8::Value> argv[argc] = { exec_state, v8::Integer::New(0) }; 7079a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::Handle<v8::Value> result = frame_function_name->Call(exec_state, 7089a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com argc, argv); 7099a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com if (result->IsUndefined()) { 7109a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com last_function_hit[0] = '\0'; 7119a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com } else { 7129a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK(result->IsString()); 7139a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::Handle<v8::String> function_name(result->ToString()); 71457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org function_name->WriteUtf8(last_function_hit); 7159a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com } 7169a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com } 7172d18d10b30bbe822dcb5e2d6e90fd7863496243ckasperl@chromium.org 7182d18d10b30bbe822dcb5e2d6e90fd7863496243ckasperl@chromium.org if (!frame_source_line.IsEmpty()) { 7192d18d10b30bbe822dcb5e2d6e90fd7863496243ckasperl@chromium.org // Get the source line. 7202d18d10b30bbe822dcb5e2d6e90fd7863496243ckasperl@chromium.org const int argc = 1; 7212d18d10b30bbe822dcb5e2d6e90fd7863496243ckasperl@chromium.org v8::Handle<v8::Value> argv[argc] = { exec_state }; 7222d18d10b30bbe822dcb5e2d6e90fd7863496243ckasperl@chromium.org v8::Handle<v8::Value> result = frame_source_line->Call(exec_state, 7232d18d10b30bbe822dcb5e2d6e90fd7863496243ckasperl@chromium.org argc, argv); 7242d18d10b30bbe822dcb5e2d6e90fd7863496243ckasperl@chromium.org CHECK(result->IsNumber()); 7252d18d10b30bbe822dcb5e2d6e90fd7863496243ckasperl@chromium.org last_source_line = result->Int32Value(); 7262d18d10b30bbe822dcb5e2d6e90fd7863496243ckasperl@chromium.org } 7272d18d10b30bbe822dcb5e2d6e90fd7863496243ckasperl@chromium.org 7282d18d10b30bbe822dcb5e2d6e90fd7863496243ckasperl@chromium.org if (!frame_source_column.IsEmpty()) { 7292d18d10b30bbe822dcb5e2d6e90fd7863496243ckasperl@chromium.org // Get the source column. 7302d18d10b30bbe822dcb5e2d6e90fd7863496243ckasperl@chromium.org const int argc = 1; 7312d18d10b30bbe822dcb5e2d6e90fd7863496243ckasperl@chromium.org v8::Handle<v8::Value> argv[argc] = { exec_state }; 7322d18d10b30bbe822dcb5e2d6e90fd7863496243ckasperl@chromium.org v8::Handle<v8::Value> result = frame_source_column->Call(exec_state, 7332d18d10b30bbe822dcb5e2d6e90fd7863496243ckasperl@chromium.org argc, argv); 7342d18d10b30bbe822dcb5e2d6e90fd7863496243ckasperl@chromium.org CHECK(result->IsNumber()); 7352d18d10b30bbe822dcb5e2d6e90fd7863496243ckasperl@chromium.org last_source_column = result->Int32Value(); 7362d18d10b30bbe822dcb5e2d6e90fd7863496243ckasperl@chromium.org } 73765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 73865dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org if (!frame_script_name.IsEmpty()) { 73965dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org // Get the script name of the function script. 74065dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org const int argc = 1; 74165dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org v8::Handle<v8::Value> argv[argc] = { exec_state }; 74265dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org v8::Handle<v8::Value> result = frame_script_name->Call(exec_state, 74365dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org argc, argv); 74465dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org if (result->IsUndefined()) { 74565dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org last_script_name_hit[0] = '\0'; 74665dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org } else { 74765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org CHECK(result->IsString()); 74865dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org v8::Handle<v8::String> script_name(result->ToString()); 74957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org script_name->WriteUtf8(last_script_name_hit); 75065dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org } 75165dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org } 75265dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 75365dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org if (!frame_script_data.IsEmpty()) { 75465dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org // Get the script data of the function script. 75565dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org const int argc = 1; 75665dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org v8::Handle<v8::Value> argv[argc] = { exec_state }; 75765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org v8::Handle<v8::Value> result = frame_script_data->Call(exec_state, 75865dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org argc, argv); 75965dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org if (result->IsUndefined()) { 76065dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org last_script_data_hit[0] = '\0'; 76165dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org } else { 76265dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org result = result->ToString(); 76365dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org CHECK(result->IsString()); 76465dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org v8::Handle<v8::String> script_data(result->ToString()); 76557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org script_data->WriteUtf8(last_script_data_hit); 76665dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org } 76765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org } 768ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org 769ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org // Perform a full deoptimization when the specified number of 770ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org // breaks have been hit. 771ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org if (break_point_hit_count == break_point_hit_count_deoptimize) { 772876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org i::Deoptimizer::DeoptimizeAll(isolate); 773ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org } 7745c838251403b0be9a882540f1922577abba4c872ager@chromium.org } else if (event == v8::AfterCompile && !compiled_script_data.IsEmpty()) { 7755c838251403b0be9a882540f1922577abba4c872ager@chromium.org const int argc = 1; 7765c838251403b0be9a882540f1922577abba4c872ager@chromium.org v8::Handle<v8::Value> argv[argc] = { event_data }; 7775c838251403b0be9a882540f1922577abba4c872ager@chromium.org v8::Handle<v8::Value> result = compiled_script_data->Call(exec_state, 7785c838251403b0be9a882540f1922577abba4c872ager@chromium.org argc, argv); 7795c838251403b0be9a882540f1922577abba4c872ager@chromium.org if (result->IsUndefined()) { 7805c838251403b0be9a882540f1922577abba4c872ager@chromium.org last_script_data_hit[0] = '\0'; 7815c838251403b0be9a882540f1922577abba4c872ager@chromium.org } else { 7825c838251403b0be9a882540f1922577abba4c872ager@chromium.org result = result->ToString(); 7835c838251403b0be9a882540f1922577abba4c872ager@chromium.org CHECK(result->IsString()); 7845c838251403b0be9a882540f1922577abba4c872ager@chromium.org v8::Handle<v8::String> script_data(result->ToString()); 78557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org script_data->WriteUtf8(last_script_data_hit); 7865c838251403b0be9a882540f1922577abba4c872ager@chromium.org } 7879a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com } 7889a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 7899a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 7909a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 7918bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org// Debug event handler which counts a number of events and collects the stack 7928bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org// height if there is a function compiled for that. 7939a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comint exception_hit_count = 0; 7949a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comint uncaught_exception_hit_count = 0; 7958bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.orgint last_js_stack_height = -1; 7969a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 7979a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comstatic void DebugEventCounterClear() { 7989a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_hit_count = 0; 7999a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com exception_hit_count = 0; 8009a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com uncaught_exception_hit_count = 0; 8019a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 8029a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 803662436e7b124b3535773535c671c53db322070b5verwaest@chromium.orgstatic void DebugEventCounter( 804662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org const v8::Debug::EventDetails& event_details) { 805662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::DebugEvent event = event_details.GetEvent(); 806662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Handle<v8::Object> exec_state = event_details.GetExecutionState(); 807662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Handle<v8::Object> event_data = event_details.GetEventData(); 808528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::internal::Debug* debug = CcTest::i_isolate()->debug(); 809ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 8108bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org // When hitting a debug event listener there must be a break set. 811ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org CHECK_NE(debug->break_id(), 0); 8128bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org 8139a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Count the number of breaks. 8149a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com if (event == v8::Break) { 8159a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_hit_count++; 8169a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com } else if (event == v8::Exception) { 8179a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com exception_hit_count++; 8189a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 8199a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Check whether the exception was uncaught. 820f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Local<v8::String> fun_name = 821f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::String::NewFromUtf8(CcTest::isolate(), "uncaught"); 8229a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::Local<v8::Function> fun = 823f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org v8::Local<v8::Function>::Cast(event_data->Get(fun_name)); 824f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org v8::Local<v8::Value> result = fun->Call(event_data, 0, NULL); 8259a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com if (result->IsTrue()) { 8269a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com uncaught_exception_hit_count++; 8279a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com } 8289a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com } 8298bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org 8308bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org // Collect the JavsScript stack height if the function frame_count is 8318bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org // compiled. 8328bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org if (!frame_count.IsEmpty()) { 8338bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org static const int kArgc = 1; 8348bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org v8::Handle<v8::Value> argv[kArgc] = { exec_state }; 8358bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org // Using exec_state as receiver is just to have a receiver. 8368bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org v8::Handle<v8::Value> result = frame_count->Call(exec_state, kArgc, argv); 8378bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org last_js_stack_height = result->Int32Value(); 8388bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org } 8399a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 8409a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 8419a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 8429a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Debug event handler which evaluates a number of expressions when a break 8439a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// point is hit. Each evaluated expression is compared with an expected value. 8449a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// For this debug event handler to work the following two global varaibles 8459a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// must be initialized. 8469a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// checks: An array of expressions and expected results 8479a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// evaluate_check_function: A JavaScript function (see below) 8489a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 8499a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Structure for holding checks to do. 8509a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comstruct EvaluateCheck { 8519a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com const char* expr; // An expression to evaluate when a break point is hit. 8529a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::Handle<v8::Value> expected; // The expected result. 8539a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}; 854e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 855e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 8569a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Array of checks to do. 8579a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comstruct EvaluateCheck* checks = NULL; 8589a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Source for The JavaScript function which can do the evaluation when a break 8599a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// point is hit. 8609a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comconst char* evaluate_check_source = 8619a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "function evaluate_check(exec_state, expr, expected) {" 8629a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com " return exec_state.frame(0).evaluate(expr).value() === expected;" 8639a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "}"; 8649a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comv8::Local<v8::Function> evaluate_check_function; 8659a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 8669a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// The actual debug event described by the longer comment above. 867662436e7b124b3535773535c671c53db322070b5verwaest@chromium.orgstatic void DebugEventEvaluate( 868662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org const v8::Debug::EventDetails& event_details) { 869662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::DebugEvent event = event_details.GetEvent(); 870662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Handle<v8::Object> exec_state = event_details.GetExecutionState(); 871528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::internal::Debug* debug = CcTest::i_isolate()->debug(); 8728bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org // When hitting a debug event listener there must be a break set. 873ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org CHECK_NE(debug->break_id(), 0); 8748bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org 8759a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com if (event == v8::Break) { 8769a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com for (int i = 0; checks[i].expr != NULL; i++) { 8779a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com const int argc = 3; 878f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Handle<v8::Value> argv[argc] = { 879f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org exec_state, 880f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::String::NewFromUtf8(CcTest::isolate(), checks[i].expr), 881f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org checks[i].expected}; 8829a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::Handle<v8::Value> result = 8839a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com evaluate_check_function->Call(exec_state, argc, argv); 8849a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com if (!result->IsTrue()) { 885906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org v8::String::Utf8Value utf8(checks[i].expected->ToString()); 886906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org V8_Fatal(__FILE__, __LINE__, "%s != %s", checks[i].expr, *utf8); 8879a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com } 8889a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com } 8899a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com } 8909a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 8919a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 8929a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 8939a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// This debug event listener removes a breakpoint in a function 8949a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comint debug_event_remove_break_point = 0; 895662436e7b124b3535773535c671c53db322070b5verwaest@chromium.orgstatic void DebugEventRemoveBreakPoint( 896662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org const v8::Debug::EventDetails& event_details) { 897662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::DebugEvent event = event_details.GetEvent(); 898662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Handle<v8::Value> data = event_details.GetCallbackData(); 899528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::internal::Debug* debug = CcTest::i_isolate()->debug(); 9008bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org // When hitting a debug event listener there must be a break set. 901ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org CHECK_NE(debug->break_id(), 0); 9028bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org 9039a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com if (event == v8::Break) { 9049a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_hit_count++; 905659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org CHECK(data->IsFunction()); 9069a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com ClearBreakPoint(debug_event_remove_break_point); 9079a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com } 9089a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 9099a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 9109a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 9119a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Debug event handler which counts break points hit and performs a step 9129a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// afterwards. 9139a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comStepAction step_action = StepIn; // Step action to perform when stepping. 914662436e7b124b3535773535c671c53db322070b5verwaest@chromium.orgstatic void DebugEventStep( 915662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org const v8::Debug::EventDetails& event_details) { 916662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::DebugEvent event = event_details.GetEvent(); 917528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::internal::Debug* debug = CcTest::i_isolate()->debug(); 9188bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org // When hitting a debug event listener there must be a break set. 919ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org CHECK_NE(debug->break_id(), 0); 9208bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org 9219a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com if (event == v8::Break) { 9229a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_hit_count++; 9239a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com PrepareStep(step_action); 9249a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com } 9259a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 9269a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 9279a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 9289a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Debug event handler which counts break points hit and performs a step 9299a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// afterwards. For each call the expected function is checked. 9309a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// For this debug event handler to work the following two global varaibles 9319a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// must be initialized. 9329a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// expected_step_sequence: An array of the expected function call sequence. 9339a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// frame_function_name: A JavaScript function (see below). 9349a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 9359a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// String containing the expected function call sequence. Note: this only works 9369a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// if functions have name length of one. 9379a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comconst char* expected_step_sequence = NULL; 9389a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 9399a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// The actual debug event described by the longer comment above. 940662436e7b124b3535773535c671c53db322070b5verwaest@chromium.orgstatic void DebugEventStepSequence( 941662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org const v8::Debug::EventDetails& event_details) { 942662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::DebugEvent event = event_details.GetEvent(); 943662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Handle<v8::Object> exec_state = event_details.GetExecutionState(); 944528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::internal::Debug* debug = CcTest::i_isolate()->debug(); 9458bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org // When hitting a debug event listener there must be a break set. 946ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org CHECK_NE(debug->break_id(), 0); 9478bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org 9489a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com if (event == v8::Break || event == v8::Exception) { 9499a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Check that the current function is the expected. 9509a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK(break_point_hit_count < 951c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org StrLength(expected_step_sequence)); 952a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org const int argc = 2; 953a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org v8::Handle<v8::Value> argv[argc] = { exec_state, v8::Integer::New(0) }; 9549a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::Handle<v8::Value> result = frame_function_name->Call(exec_state, 9559a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com argc, argv); 9569a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK(result->IsString()); 957906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org v8::String::Utf8Value function_name(result->ToString()); 958c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org CHECK_EQ(1, StrLength(*function_name)); 9599a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ((*function_name)[0], 9609a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com expected_step_sequence[break_point_hit_count]); 9619a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 9629a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Perform step. 9639a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_hit_count++; 9649a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com PrepareStep(step_action); 9659a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com } 9669a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 9679a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 9689a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 9699a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Debug event handler which performs a garbage collection. 9709a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comstatic void DebugEventBreakPointCollectGarbage( 971662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org const v8::Debug::EventDetails& event_details) { 972662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::DebugEvent event = event_details.GetEvent(); 973528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::internal::Debug* debug = CcTest::i_isolate()->debug(); 9748bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org // When hitting a debug event listener there must be a break set. 975ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org CHECK_NE(debug->break_id(), 0); 9768bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org 9779a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Perform a garbage collection when break point is hit and continue. Based 9789a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // on the number of break points hit either scavenge or mark compact 9799a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // collector is used. 9809a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com if (event == v8::Break) { 9819a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_hit_count++; 9829a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com if (break_point_hit_count % 2 == 0) { 9839a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Scavenge. 984528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org CcTest::heap()->CollectGarbage(v8::internal::NEW_SPACE); 9859a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com } else { 986d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org // Mark sweep compact. 987528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org CcTest::heap()->CollectAllGarbage(Heap::kNoGCFlags); 9889a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com } 9899a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com } 9909a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 9919a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 9929a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 9939a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Debug event handler which re-issues a debug break and calls the garbage 9949a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// collector to have the heap verified. 995662436e7b124b3535773535c671c53db322070b5verwaest@chromium.orgstatic void DebugEventBreak( 996662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org const v8::Debug::EventDetails& event_details) { 997662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::DebugEvent event = event_details.GetEvent(); 998528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::internal::Debug* debug = CcTest::i_isolate()->debug(); 9998bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org // When hitting a debug event listener there must be a break set. 1000ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org CHECK_NE(debug->break_id(), 0); 10018bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org 10029a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com if (event == v8::Break) { 10039a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Count the number of breaks. 10049a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_hit_count++; 10059a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 10069a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Run the garbage collector to enforce heap verification if option 10079a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // --verify-heap is set. 1008528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org CcTest::heap()->CollectGarbage(v8::internal::NEW_SPACE); 10099a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 10109a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Set the break flag again to come back here as soon as possible. 1011528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Debug::DebugBreak(CcTest::isolate()); 10129a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com } 10139a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 10149a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 10159a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 1016c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org// Debug event handler which re-issues a debug break until a limit has been 1017c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org// reached. 1018c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.orgint max_break_point_hit_count = 0; 1019f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.orgbool terminate_after_max_break_point_hit = false; 1020662436e7b124b3535773535c671c53db322070b5verwaest@chromium.orgstatic void DebugEventBreakMax( 1021662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org const v8::Debug::EventDetails& event_details) { 1022662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::DebugEvent event = event_details.GetEvent(); 1023662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Handle<v8::Object> exec_state = event_details.GetExecutionState(); 1024528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Isolate* v8_isolate = CcTest::isolate(); 1025528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::internal::Isolate* isolate = CcTest::i_isolate(); 1026876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org v8::internal::Debug* debug = isolate->debug(); 1027c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org // When hitting a debug event listener there must be a break set. 1028ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org CHECK_NE(debug->break_id(), 0); 1029c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org 1030f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org if (event == v8::Break) { 1031f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org if (break_point_hit_count < max_break_point_hit_count) { 1032f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org // Count the number of breaks. 1033f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org break_point_hit_count++; 1034c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org 1035ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org // Collect the JavsScript stack height if the function frame_count is 1036ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org // compiled. 1037ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org if (!frame_count.IsEmpty()) { 1038ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org static const int kArgc = 1; 1039ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org v8::Handle<v8::Value> argv[kArgc] = { exec_state }; 1040ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org // Using exec_state as receiver is just to have a receiver. 1041ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org v8::Handle<v8::Value> result = 1042ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org frame_count->Call(exec_state, kArgc, argv); 1043ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org last_js_stack_height = result->Int32Value(); 1044ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org } 1045ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org 1046f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org // Set the break flag again to come back here as soon as possible. 1047528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Debug::DebugBreak(v8_isolate); 1048ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org 1049f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org } else if (terminate_after_max_break_point_hit) { 1050f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org // Terminate execution after the last break if requested. 1051528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::V8::TerminateExecution(v8_isolate); 1052f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org } 1053ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org 1054ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org // Perform a full deoptimization when the specified number of 1055ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org // breaks have been hit. 1056ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org if (break_point_hit_count == break_point_hit_count_deoptimize) { 1057876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org i::Deoptimizer::DeoptimizeAll(isolate); 1058ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org } 1059c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org } 1060c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org} 1061c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org 1062c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org 10639a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// --- M e s s a g e C a l l b a c k 10649a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 10659a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 10669a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Message callback which counts the number of messages. 10679a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comint message_callback_count = 0; 10689a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 10699a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comstatic void MessageCallbackCountClear() { 10709a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com message_callback_count = 0; 10719a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 10729a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 10739a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comstatic void MessageCallbackCount(v8::Handle<v8::Message> message, 10749a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::Handle<v8::Value> data) { 10759a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com message_callback_count++; 10769a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 10779a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 10789a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 10799a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// --- T h e A c t u a l T e s t s 10809a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 10819a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 10829a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Test that the debug break function is the expected one for different kinds 10839a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// of break locations. 10849a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(DebugStub) { 10859a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com using ::v8::internal::Builtins; 1086ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org using ::v8::internal::Isolate; 10879a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com DebugLocalContext env; 10882bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 10899a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 10909a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CheckDebugBreakFunction(&env, 10919a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "function f1(){}", "f1", 10929a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 0, 1093236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org v8::internal::RelocInfo::JS_RETURN, 10949a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com NULL); 10959a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CheckDebugBreakFunction(&env, 10969a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "function f2(){x=1;}", "f2", 10979a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 0, 1098496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org v8::internal::RelocInfo::CODE_TARGET_CONTEXT, 1099528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org CcTest::i_isolate()->builtins()->builtin( 11007979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org Builtins::kStoreIC_DebugBreak)); 11019a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CheckDebugBreakFunction(&env, 11029a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "function f3(){var a=x;}", "f3", 11039a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 0, 1104236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org v8::internal::RelocInfo::CODE_TARGET_CONTEXT, 1105528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org CcTest::i_isolate()->builtins()->builtin( 11067979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org Builtins::kLoadIC_DebugBreak)); 11079a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 1108236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org// TODO(1240753): Make the test architecture independent or split 1109236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org// parts of the debugger into architecture dependent files. This 1110236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org// part currently disabled as it is not portable between IA32/ARM. 11119a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Currently on ICs for keyed store/load on ARM. 11129a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#if !defined (__arm__) && !defined(__thumb__) 11139a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CheckDebugBreakFunction( 11149a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com &env, 11159a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "function f4(){var index='propertyName'; var a={}; a[index] = 'x';}", 11169a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "f4", 11179a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 0, 1118236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org v8::internal::RelocInfo::CODE_TARGET, 1119528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org CcTest::i_isolate()->builtins()->builtin( 11207979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org Builtins::kKeyedStoreIC_DebugBreak)); 11219a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CheckDebugBreakFunction( 11229a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com &env, 11239a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "function f5(){var index='propertyName'; var a={}; return a[index];}", 11249a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "f5", 11259a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 0, 1126236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org v8::internal::RelocInfo::CODE_TARGET, 1127528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org CcTest::i_isolate()->builtins()->builtin( 11287979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org Builtins::kKeyedLoadIC_DebugBreak)); 11299a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#endif 11309a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 1131f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org CheckDebugBreakFunction( 1132f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org &env, 1133f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org "function f6(a){return a==null;}", 1134f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org "f6", 1135f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org 0, 1136f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org v8::internal::RelocInfo::CODE_TARGET, 1137528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org CcTest::i_isolate()->builtins()->builtin( 1138f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org Builtins::kCompareNilIC_DebugBreak)); 1139f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org 11409a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Check the debug break code stubs for call ICs with different number of 11419a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // parameters. 11429a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com Handle<Code> debug_break_0 = v8::internal::ComputeCallDebugBreak(0); 11439a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com Handle<Code> debug_break_1 = v8::internal::ComputeCallDebugBreak(1); 11449a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com Handle<Code> debug_break_4 = v8::internal::ComputeCallDebugBreak(4); 11459a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 11469a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CheckDebugBreakFunction(&env, 11479a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "function f4_0(){x();}", "f4_0", 11489a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 0, 1149236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org v8::internal::RelocInfo::CODE_TARGET_CONTEXT, 11509a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com *debug_break_0); 11519a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 11529a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CheckDebugBreakFunction(&env, 11539a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "function f4_1(){x(1);}", "f4_1", 11549a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 0, 1155236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org v8::internal::RelocInfo::CODE_TARGET_CONTEXT, 11569a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com *debug_break_1); 11579a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 11589a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CheckDebugBreakFunction(&env, 11599a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "function f4_4(){x(1,2,3,4);}", "f4_4", 11609a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 0, 1161236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org v8::internal::RelocInfo::CODE_TARGET_CONTEXT, 11629a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com *debug_break_4); 11639a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 11649a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 11659a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 11669a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Test that the debug info in the VM is in sync with the functions being 11679a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// debugged. 11689a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(DebugInfo) { 11699a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com DebugLocalContext env; 11702bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 11719a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Create a couple of functions for the test. 11729a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::Local<v8::Function> foo = 11739a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CompileFunction(&env, "function foo(){}", "foo"); 11749a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::Local<v8::Function> bar = 11759a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CompileFunction(&env, "function bar(){}", "bar"); 11769a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Initially no functions are debugged. 11779a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(0, v8::internal::GetDebuggedFunctions()->length()); 11789a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK(!HasDebugInfo(foo)); 11799a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK(!HasDebugInfo(bar)); 11809a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // One function (foo) is debugged. 11819a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com int bp1 = SetBreakPoint(foo, 0); 11829a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(1, v8::internal::GetDebuggedFunctions()->length()); 11839a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK(HasDebugInfo(foo)); 11849a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK(!HasDebugInfo(bar)); 11859a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Two functions are debugged. 11869a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com int bp2 = SetBreakPoint(bar, 0); 11879a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(2, v8::internal::GetDebuggedFunctions()->length()); 11889a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK(HasDebugInfo(foo)); 11899a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK(HasDebugInfo(bar)); 11909a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // One function (bar) is debugged. 11919a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com ClearBreakPoint(bp1); 11929a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(1, v8::internal::GetDebuggedFunctions()->length()); 11939a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK(!HasDebugInfo(foo)); 11949a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK(HasDebugInfo(bar)); 11959a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // No functions are debugged. 11969a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com ClearBreakPoint(bp2); 11979a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(0, v8::internal::GetDebuggedFunctions()->length()); 11989a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK(!HasDebugInfo(foo)); 11999a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK(!HasDebugInfo(bar)); 12009a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 12019a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 12029a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 12039a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Test that a break point can be set at an IC store location. 12049a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(BreakPointICStore) { 12059a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_hit_count = 0; 12069a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com DebugLocalContext env; 12072bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 1208381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org 1209662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(DebugEventBreakPointHitCount); 1210f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Script::Compile(v8::String::NewFromUtf8(env->GetIsolate(), 1211f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org "function foo(){bar=0;}"))->Run(); 1212f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Local<v8::Function> foo = v8::Local<v8::Function>::Cast( 1213f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "foo"))); 12149a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 12159a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Run without breakpoints. 12169a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com foo->Call(env->Global(), 0, NULL); 12179a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(0, break_point_hit_count); 12189a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 12199a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Run with breakpoint 12209a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com int bp = SetBreakPoint(foo, 0); 12219a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com foo->Call(env->Global(), 0, NULL); 12229a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(1, break_point_hit_count); 12239a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com foo->Call(env->Global(), 0, NULL); 12249a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(2, break_point_hit_count); 12259a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 12269a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Run without breakpoints. 12279a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com ClearBreakPoint(bp); 12289a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com foo->Call(env->Global(), 0, NULL); 12299a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(2, break_point_hit_count); 12309a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 1231662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(NULL); 1232381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org CheckDebuggerUnloaded(); 12339a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 12349a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 12359a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 12369a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Test that a break point can be set at an IC load location. 12379a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(BreakPointICLoad) { 12389a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_hit_count = 0; 12399a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com DebugLocalContext env; 12402bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 1241662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(DebugEventBreakPointHitCount); 1242f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Script::Compile(v8::String::NewFromUtf8(env->GetIsolate(), "bar=1")) 1243f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org ->Run(); 1244f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Script::Compile( 1245f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::String::NewFromUtf8(env->GetIsolate(), "function foo(){var x=bar;}")) 1246f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org ->Run(); 1247f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Local<v8::Function> foo = v8::Local<v8::Function>::Cast( 1248f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "foo"))); 12499a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 12509a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Run without breakpoints. 12519a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com foo->Call(env->Global(), 0, NULL); 12529a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(0, break_point_hit_count); 12539a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 1254ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // Run with breakpoint. 12559a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com int bp = SetBreakPoint(foo, 0); 12569a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com foo->Call(env->Global(), 0, NULL); 12579a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(1, break_point_hit_count); 12589a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com foo->Call(env->Global(), 0, NULL); 12599a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(2, break_point_hit_count); 12609a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 12619a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Run without breakpoints. 12629a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com ClearBreakPoint(bp); 12639a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com foo->Call(env->Global(), 0, NULL); 12649a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(2, break_point_hit_count); 12659a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 1266662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(NULL); 1267381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org CheckDebuggerUnloaded(); 12689a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 12699a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 12709a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 12719a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Test that a break point can be set at an IC call location. 12729a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(BreakPointICCall) { 12739a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_hit_count = 0; 12749a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com DebugLocalContext env; 12752bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 1276662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(DebugEventBreakPointHitCount); 1277f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Script::Compile( 1278f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::String::NewFromUtf8(env->GetIsolate(), "function bar(){}"))->Run(); 1279f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Script::Compile(v8::String::NewFromUtf8(env->GetIsolate(), 1280f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org "function foo(){bar();}"))->Run(); 1281f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Local<v8::Function> foo = v8::Local<v8::Function>::Cast( 1282f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "foo"))); 12839a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 12849a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Run without breakpoints. 12859a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com foo->Call(env->Global(), 0, NULL); 12869a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(0, break_point_hit_count); 12879a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 1288ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // Run with breakpoint 12899a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com int bp = SetBreakPoint(foo, 0); 12909a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com foo->Call(env->Global(), 0, NULL); 12919a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(1, break_point_hit_count); 12929a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com foo->Call(env->Global(), 0, NULL); 12939a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(2, break_point_hit_count); 12949a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 12959a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Run without breakpoints. 12969a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com ClearBreakPoint(bp); 12979a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com foo->Call(env->Global(), 0, NULL); 12989a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(2, break_point_hit_count); 12999a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 1300662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(NULL); 1301381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org CheckDebuggerUnloaded(); 13029a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 13039a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 13049a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 130565fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org// Test that a break point can be set at an IC call location and survive a GC. 130665fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.orgTEST(BreakPointICCallWithGC) { 130765fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org break_point_hit_count = 0; 130865fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org DebugLocalContext env; 13092bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 1310662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(DebugEventBreakPointCollectGarbage); 1311f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Script::Compile( 1312f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::String::NewFromUtf8(env->GetIsolate(), "function bar(){return 1;}")) 1313f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org ->Run(); 1314f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Script::Compile(v8::String::NewFromUtf8(env->GetIsolate(), 1315f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org "function foo(){return bar();}")) 1316f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org ->Run(); 1317f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Local<v8::Function> foo = v8::Local<v8::Function>::Cast( 1318f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "foo"))); 131965fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org 132065fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org // Run without breakpoints. 132165fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org CHECK_EQ(1, foo->Call(env->Global(), 0, NULL)->Int32Value()); 1322d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org CHECK_EQ(0, break_point_hit_count); 1323d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org 1324d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org // Run with breakpoint. 1325d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org int bp = SetBreakPoint(foo, 0); 1326d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org CHECK_EQ(1, foo->Call(env->Global(), 0, NULL)->Int32Value()); 1327d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org CHECK_EQ(1, break_point_hit_count); 1328d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org CHECK_EQ(1, foo->Call(env->Global(), 0, NULL)->Int32Value()); 1329d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org CHECK_EQ(2, break_point_hit_count); 1330d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org 1331d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org // Run without breakpoints. 1332d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org ClearBreakPoint(bp); 1333d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org foo->Call(env->Global(), 0, NULL); 1334d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org CHECK_EQ(2, break_point_hit_count); 1335d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org 1336662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(NULL); 1337d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org CheckDebuggerUnloaded(); 1338d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org} 1339d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org 1340d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org 1341d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org// Test that a break point can be set at an IC call location and survive a GC. 1342d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.orgTEST(BreakPointConstructCallWithGC) { 1343d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org break_point_hit_count = 0; 1344d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org DebugLocalContext env; 13452bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 1346662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(DebugEventBreakPointCollectGarbage); 1347f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Script::Compile(v8::String::NewFromUtf8(env->GetIsolate(), 1348f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org "function bar(){ this.x = 1;}")) 1349f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org ->Run(); 1350f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Script::Compile( 1351f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::String::NewFromUtf8(env->GetIsolate(), 1352f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org "function foo(){return new bar(1).x;}"))->Run(); 1353f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Local<v8::Function> foo = v8::Local<v8::Function>::Cast( 1354f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "foo"))); 1355d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org 1356d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org // Run without breakpoints. 1357d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org CHECK_EQ(1, foo->Call(env->Global(), 0, NULL)->Int32Value()); 135865fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org CHECK_EQ(0, break_point_hit_count); 135965fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org 136065fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org // Run with breakpoint. 136165fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org int bp = SetBreakPoint(foo, 0); 136265fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org CHECK_EQ(1, foo->Call(env->Global(), 0, NULL)->Int32Value()); 136365fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org CHECK_EQ(1, break_point_hit_count); 136465fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org CHECK_EQ(1, foo->Call(env->Global(), 0, NULL)->Int32Value()); 136565fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org CHECK_EQ(2, break_point_hit_count); 136665fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org 136765fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org // Run without breakpoints. 136865fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org ClearBreakPoint(bp); 136965fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org foo->Call(env->Global(), 0, NULL); 137065fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org CHECK_EQ(2, break_point_hit_count); 137165fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org 1372662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(NULL); 137365fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org CheckDebuggerUnloaded(); 137465fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org} 137565fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org 137665fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org 13779a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Test that a break point can be set at a return store location. 13789a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(BreakPointReturn) { 13799a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_hit_count = 0; 13809a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com DebugLocalContext env; 13812bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 13822d18d10b30bbe822dcb5e2d6e90fd7863496243ckasperl@chromium.org 13832d18d10b30bbe822dcb5e2d6e90fd7863496243ckasperl@chromium.org // Create a functions for checking the source line and column when hitting 13842d18d10b30bbe822dcb5e2d6e90fd7863496243ckasperl@chromium.org // a break point. 13852d18d10b30bbe822dcb5e2d6e90fd7863496243ckasperl@chromium.org frame_source_line = CompileFunction(&env, 13862d18d10b30bbe822dcb5e2d6e90fd7863496243ckasperl@chromium.org frame_source_line_source, 13872d18d10b30bbe822dcb5e2d6e90fd7863496243ckasperl@chromium.org "frame_source_line"); 13882d18d10b30bbe822dcb5e2d6e90fd7863496243ckasperl@chromium.org frame_source_column = CompileFunction(&env, 13892d18d10b30bbe822dcb5e2d6e90fd7863496243ckasperl@chromium.org frame_source_column_source, 13902d18d10b30bbe822dcb5e2d6e90fd7863496243ckasperl@chromium.org "frame_source_column"); 13912d18d10b30bbe822dcb5e2d6e90fd7863496243ckasperl@chromium.org 13922d18d10b30bbe822dcb5e2d6e90fd7863496243ckasperl@chromium.org 1393662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(DebugEventBreakPointHitCount); 1394f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Script::Compile( 1395f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::String::NewFromUtf8(env->GetIsolate(), "function foo(){}"))->Run(); 1396f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Local<v8::Function> foo = v8::Local<v8::Function>::Cast( 1397f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "foo"))); 13989a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 13999a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Run without breakpoints. 14009a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com foo->Call(env->Global(), 0, NULL); 14019a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(0, break_point_hit_count); 14029a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 14039a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Run with breakpoint 14049a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com int bp = SetBreakPoint(foo, 0); 14059a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com foo->Call(env->Global(), 0, NULL); 14069a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(1, break_point_hit_count); 14072d18d10b30bbe822dcb5e2d6e90fd7863496243ckasperl@chromium.org CHECK_EQ(0, last_source_line); 1408e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org CHECK_EQ(15, last_source_column); 14099a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com foo->Call(env->Global(), 0, NULL); 14109a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(2, break_point_hit_count); 14112d18d10b30bbe822dcb5e2d6e90fd7863496243ckasperl@chromium.org CHECK_EQ(0, last_source_line); 1412e90029b96bc4097e0f14d33cc086030d7ad5007awhesse@chromium.org CHECK_EQ(15, last_source_column); 14139a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 14149a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Run without breakpoints. 14159a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com ClearBreakPoint(bp); 14169a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com foo->Call(env->Global(), 0, NULL); 14179a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(2, break_point_hit_count); 14189a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 1419662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(NULL); 1420381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org CheckDebuggerUnloaded(); 14219a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 14229a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 14239a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 14249a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comstatic void CallWithBreakPoints(v8::Local<v8::Object> recv, 14259a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::Local<v8::Function> f, 14269a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com int break_point_count, 14279a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com int call_count) { 14289a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_hit_count = 0; 14299a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com for (int i = 0; i < call_count; i++) { 14309a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com f->Call(recv, 0, NULL); 14319a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ((i + 1) * break_point_count, break_point_hit_count); 14329a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com } 14339a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 14349a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 1435e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 14369a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Test GC during break point processing. 14379a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(GCDuringBreakPointProcessing) { 14389a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_hit_count = 0; 14399a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com DebugLocalContext env; 14402bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 14419a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 1442662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(DebugEventBreakPointCollectGarbage); 14439a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::Local<v8::Function> foo; 14449a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 14459a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Test IC store break point with garbage collection. 14469a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com foo = CompileFunction(&env, "function foo(){bar=0;}", "foo"); 14479a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com SetBreakPoint(foo, 0); 14489a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CallWithBreakPoints(env->Global(), foo, 1, 10); 14499a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 14509a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Test IC load break point with garbage collection. 14519a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com foo = CompileFunction(&env, "bar=1;function foo(){var x=bar;}", "foo"); 14529a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com SetBreakPoint(foo, 0); 14539a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CallWithBreakPoints(env->Global(), foo, 1, 10); 14549a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 14559a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Test IC call break point with garbage collection. 14569a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com foo = CompileFunction(&env, "function bar(){};function foo(){bar();}", "foo"); 14579a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com SetBreakPoint(foo, 0); 14589a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CallWithBreakPoints(env->Global(), foo, 1, 10); 14599a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 14609a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Test return break point with garbage collection. 14619a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com foo = CompileFunction(&env, "function foo(){}", "foo"); 14629a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com SetBreakPoint(foo, 0); 14639a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CallWithBreakPoints(env->Global(), foo, 1, 25); 14649a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 14652356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org // Test debug break slot break point with garbage collection. 14662356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org foo = CompileFunction(&env, "function foo(){var a;}", "foo"); 14672356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org SetBreakPoint(foo, 0); 14682356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org CallWithBreakPoints(env->Global(), foo, 1, 25); 14692356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org 1470662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(NULL); 1471381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org CheckDebuggerUnloaded(); 14729a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 14739a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 14749a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 14759a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Call the function three times with different garbage collections in between 14769a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// and make sure that the break point survives. 1477c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.orgstatic void CallAndGC(v8::Local<v8::Object> recv, 1478c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com v8::Local<v8::Function> f) { 14799a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_hit_count = 0; 14809a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 14819a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com for (int i = 0; i < 3; i++) { 14829a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Call function. 14839a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com f->Call(recv, 0, NULL); 14849a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(1 + i * 3, break_point_hit_count); 14859a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 14869a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Scavenge and call function. 1487528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org CcTest::heap()->CollectGarbage(v8::internal::NEW_SPACE); 14889a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com f->Call(recv, 0, NULL); 14899a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(2 + i * 3, break_point_hit_count); 14909a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 14919a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Mark sweep (and perhaps compact) and call function. 1492528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org CcTest::heap()->CollectAllGarbage(Heap::kNoGCFlags); 14939a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com f->Call(recv, 0, NULL); 14949a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(3 + i * 3, break_point_hit_count); 14959a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com } 14969a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 14979a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 14989a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 1499c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// Test that a break point can be set at a return store location. 1500c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comTEST(BreakPointSurviveGC) { 15019a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_hit_count = 0; 15029a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com DebugLocalContext env; 15032bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 15049a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 1505662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(DebugEventBreakPointHitCount); 15069a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::Local<v8::Function> foo; 15079a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 15089a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Test IC store break point with garbage collection. 1509c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.org { 1510659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org CompileFunction(&env, "function foo(){}", "foo"); 1511c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.org foo = CompileFunction(&env, "function foo(){bar=0;}", "foo"); 1512c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.org SetBreakPoint(foo, 0); 1513c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.org } 1514c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com CallAndGC(env->Global(), foo); 15159a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 15169a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Test IC load break point with garbage collection. 1517c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.org { 1518659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org CompileFunction(&env, "function foo(){}", "foo"); 1519c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.org foo = CompileFunction(&env, "bar=1;function foo(){var x=bar;}", "foo"); 1520c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.org SetBreakPoint(foo, 0); 1521c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.org } 1522c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com CallAndGC(env->Global(), foo); 15239a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 15249a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Test IC call break point with garbage collection. 1525c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.org { 1526659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org CompileFunction(&env, "function foo(){}", "foo"); 1527c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.org foo = CompileFunction(&env, 1528c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.org "function bar(){};function foo(){bar();}", 1529c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.org "foo"); 1530c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.org SetBreakPoint(foo, 0); 1531c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.org } 1532c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com CallAndGC(env->Global(), foo); 15339a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 15349a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Test return break point with garbage collection. 1535c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.org { 1536659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org CompileFunction(&env, "function foo(){}", "foo"); 1537c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.org foo = CompileFunction(&env, "function foo(){}", "foo"); 1538c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.org SetBreakPoint(foo, 0); 1539c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.org } 1540c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com CallAndGC(env->Global(), foo); 1541c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.org 1542c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.org // Test non IC break point with garbage collection. 1543c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.org { 1544659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org CompileFunction(&env, "function foo(){}", "foo"); 1545c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.org foo = CompileFunction(&env, "function foo(){var bar=0;}", "foo"); 1546c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.org SetBreakPoint(foo, 0); 1547c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.org } 1548c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com CallAndGC(env->Global(), foo); 1549c4e51ac6d26b42753a57a4a9e4a419243b50151clrn@chromium.org 15509a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 1551662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(NULL); 1552381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org CheckDebuggerUnloaded(); 15539a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 15549a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 15559a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 15569a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Test that break points can be set using the global Debug object. 15579a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(BreakPointThroughJavaScript) { 15589a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_hit_count = 0; 15599a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com DebugLocalContext env; 15602bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 15619a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com env.ExposeDebug(); 15629a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 1563662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(DebugEventBreakPointHitCount); 1564f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Script::Compile( 1565f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::String::NewFromUtf8(env->GetIsolate(), "function bar(){}"))->Run(); 1566f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Script::Compile(v8::String::NewFromUtf8(env->GetIsolate(), 1567f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org "function foo(){bar();bar();}")) 1568f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org ->Run(); 15699a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // 012345678901234567890 15709a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // 1 2 15719a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Break points are set at position 3 and 9 1572f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Local<v8::Script> foo = 1573f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Script::Compile(v8::String::NewFromUtf8(env->GetIsolate(), "foo()")); 15749a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 15759a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Run without breakpoints. 15769a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com foo->Run(); 15779a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(0, break_point_hit_count); 15789a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 15799a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Run with one breakpoint 1580f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org int bp1 = SetBreakPointFromJS(env->GetIsolate(), "foo", 0, 3); 15819a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com foo->Run(); 15829a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(1, break_point_hit_count); 15839a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com foo->Run(); 15849a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(2, break_point_hit_count); 15859a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 15869a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Run with two breakpoints 1587f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org int bp2 = SetBreakPointFromJS(env->GetIsolate(), "foo", 0, 9); 15889a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com foo->Run(); 15899a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(4, break_point_hit_count); 15909a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com foo->Run(); 15919a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(6, break_point_hit_count); 15929a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 15939a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Run with one breakpoint 1594f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org ClearBreakPointFromJS(env->GetIsolate(), bp2); 15959a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com foo->Run(); 15969a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(7, break_point_hit_count); 15979a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com foo->Run(); 15989a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(8, break_point_hit_count); 15999a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 16009a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Run without breakpoints. 1601f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org ClearBreakPointFromJS(env->GetIsolate(), bp1); 16029a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com foo->Run(); 16039a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(8, break_point_hit_count); 16049a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 1605662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(NULL); 1606381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org CheckDebuggerUnloaded(); 16079a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 16089a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Make sure that the break point numbers are consecutive. 16099a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(1, bp1); 16109a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(2, bp2); 16119a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 16129a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 16139a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 16147be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org// Test that break points on scripts identified by name can be set using the 16157be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org// global Debug object. 16167be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.orgTEST(ScriptBreakPointByNameThroughJavaScript) { 16179a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_hit_count = 0; 16189a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com DebugLocalContext env; 16192bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 16209a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com env.ExposeDebug(); 16219a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 1622662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(DebugEventBreakPointHitCount); 16239a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 1624f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Local<v8::String> script = v8::String::NewFromUtf8( 1625f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org env->GetIsolate(), 16269a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "function f() {\n" 16279a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com " function h() {\n" 16289a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com " a = 0; // line 2\n" 16299a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com " }\n" 16309a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com " b = 1; // line 4\n" 16319a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com " return h();\n" 16329a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "}\n" 16339a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "\n" 16349a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "function g() {\n" 16359a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com " function h() {\n" 16369a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com " a = 0;\n" 16379a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com " }\n" 16389a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com " b = 2; // line 12\n" 16399a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com " h();\n" 16409a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com " b = 3; // line 14\n" 16419a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com " f(); // line 15\n" 16429a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "}"); 16439a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 16449a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Compile the script and get the two functions. 16459a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::ScriptOrigin origin = 1646f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::ScriptOrigin(v8::String::NewFromUtf8(env->GetIsolate(), "test")); 16479a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::Script::Compile(script, &origin)->Run(); 1648f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Local<v8::Function> f = v8::Local<v8::Function>::Cast( 1649f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "f"))); 1650f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Local<v8::Function> g = v8::Local<v8::Function>::Cast( 1651f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "g"))); 16529a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 16539a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Call f and g without break points. 16549a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_hit_count = 0; 16559a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com f->Call(env->Global(), 0, NULL); 16569a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(0, break_point_hit_count); 16579a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com g->Call(env->Global(), 0, NULL); 16589a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(0, break_point_hit_count); 16599a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 16609a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Call f and g with break point on line 12. 1661f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org int sbp1 = SetScriptBreakPointByNameFromJS(env->GetIsolate(), "test", 12, 0); 16629a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_hit_count = 0; 16639a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com f->Call(env->Global(), 0, NULL); 16649a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(0, break_point_hit_count); 16659a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com g->Call(env->Global(), 0, NULL); 16669a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(1, break_point_hit_count); 16679a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 16689a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Remove the break point again. 16699a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_hit_count = 0; 1670f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org ClearBreakPointFromJS(env->GetIsolate(), sbp1); 16719a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com f->Call(env->Global(), 0, NULL); 16729a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(0, break_point_hit_count); 16739a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com g->Call(env->Global(), 0, NULL); 16749a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(0, break_point_hit_count); 16759a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 16769a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Call f and g with break point on line 2. 1677f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org int sbp2 = SetScriptBreakPointByNameFromJS(env->GetIsolate(), "test", 2, 0); 16789a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_hit_count = 0; 16799a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com f->Call(env->Global(), 0, NULL); 16809a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(1, break_point_hit_count); 16819a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com g->Call(env->Global(), 0, NULL); 16829a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(2, break_point_hit_count); 16839a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 16849a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Call f and g with break point on line 2, 4, 12, 14 and 15. 1685f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org int sbp3 = SetScriptBreakPointByNameFromJS(env->GetIsolate(), "test", 4, 0); 1686f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org int sbp4 = SetScriptBreakPointByNameFromJS(env->GetIsolate(), "test", 12, 0); 1687f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org int sbp5 = SetScriptBreakPointByNameFromJS(env->GetIsolate(), "test", 14, 0); 1688f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org int sbp6 = SetScriptBreakPointByNameFromJS(env->GetIsolate(), "test", 15, 0); 16899a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_hit_count = 0; 16909a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com f->Call(env->Global(), 0, NULL); 16919a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(2, break_point_hit_count); 16929a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com g->Call(env->Global(), 0, NULL); 16939a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(7, break_point_hit_count); 16949a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 16957be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org // Remove all the break points again. 16969a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_hit_count = 0; 1697f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org ClearBreakPointFromJS(env->GetIsolate(), sbp2); 1698f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org ClearBreakPointFromJS(env->GetIsolate(), sbp3); 1699f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org ClearBreakPointFromJS(env->GetIsolate(), sbp4); 1700f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org ClearBreakPointFromJS(env->GetIsolate(), sbp5); 1701f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org ClearBreakPointFromJS(env->GetIsolate(), sbp6); 17029a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com f->Call(env->Global(), 0, NULL); 17039a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(0, break_point_hit_count); 17049a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com g->Call(env->Global(), 0, NULL); 17059a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(0, break_point_hit_count); 17069a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 1707662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(NULL); 17087be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org CheckDebuggerUnloaded(); 17097be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org 17107be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org // Make sure that the break point numbers are consecutive. 17117be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org CHECK_EQ(1, sbp1); 17127be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org CHECK_EQ(2, sbp2); 17137be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org CHECK_EQ(3, sbp3); 17147be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org CHECK_EQ(4, sbp4); 17157be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org CHECK_EQ(5, sbp5); 17167be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org CHECK_EQ(6, sbp6); 17177be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org} 17187be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org 17197be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org 17207be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.orgTEST(ScriptBreakPointByIdThroughJavaScript) { 17217be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org break_point_hit_count = 0; 17227be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org DebugLocalContext env; 17232bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 17247be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org env.ExposeDebug(); 17257be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org 1726662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(DebugEventBreakPointHitCount); 17277be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org 1728f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Local<v8::String> source = v8::String::NewFromUtf8( 1729f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org env->GetIsolate(), 17307be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org "function f() {\n" 17317be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org " function h() {\n" 17327be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org " a = 0; // line 2\n" 17337be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org " }\n" 17347be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org " b = 1; // line 4\n" 17357be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org " return h();\n" 17367be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org "}\n" 17377be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org "\n" 17387be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org "function g() {\n" 17397be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org " function h() {\n" 17407be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org " a = 0;\n" 17417be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org " }\n" 17427be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org " b = 2; // line 12\n" 17437be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org " h();\n" 17447be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org " b = 3; // line 14\n" 17457be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org " f(); // line 15\n" 17467be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org "}"); 17477be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org 17487be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org // Compile the script and get the two functions. 17497be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org v8::ScriptOrigin origin = 1750f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::ScriptOrigin(v8::String::NewFromUtf8(env->GetIsolate(), "test")); 17517be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org v8::Local<v8::Script> script = v8::Script::Compile(source, &origin); 17527be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org script->Run(); 1753f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Local<v8::Function> f = v8::Local<v8::Function>::Cast( 1754f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "f"))); 1755f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Local<v8::Function> g = v8::Local<v8::Function>::Cast( 1756f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "g"))); 17577be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org 17587be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org // Get the script id knowing that internally it is a 32 integer. 1759f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org int script_id = script->GetId(); 17607be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org 17617be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org // Call f and g without break points. 17627be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org break_point_hit_count = 0; 17637be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org f->Call(env->Global(), 0, NULL); 17647be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org CHECK_EQ(0, break_point_hit_count); 17657be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org g->Call(env->Global(), 0, NULL); 17667be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org CHECK_EQ(0, break_point_hit_count); 17677be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org 17687be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org // Call f and g with break point on line 12. 1769f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org int sbp1 = SetScriptBreakPointByIdFromJS(env->GetIsolate(), script_id, 12, 0); 17707be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org break_point_hit_count = 0; 17717be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org f->Call(env->Global(), 0, NULL); 17727be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org CHECK_EQ(0, break_point_hit_count); 17739a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com g->Call(env->Global(), 0, NULL); 17749a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(1, break_point_hit_count); 17759a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 17767be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org // Remove the break point again. 17777be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org break_point_hit_count = 0; 1778f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org ClearBreakPointFromJS(env->GetIsolate(), sbp1); 17797be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org f->Call(env->Global(), 0, NULL); 17807be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org CHECK_EQ(0, break_point_hit_count); 17817be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org g->Call(env->Global(), 0, NULL); 17827be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org CHECK_EQ(0, break_point_hit_count); 17837be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org 17847be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org // Call f and g with break point on line 2. 1785f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org int sbp2 = SetScriptBreakPointByIdFromJS(env->GetIsolate(), script_id, 2, 0); 17867be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org break_point_hit_count = 0; 17877be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org f->Call(env->Global(), 0, NULL); 17887be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org CHECK_EQ(1, break_point_hit_count); 17899a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com g->Call(env->Global(), 0, NULL); 17909a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(2, break_point_hit_count); 17919a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 17927be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org // Call f and g with break point on line 2, 4, 12, 14 and 15. 1793f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org int sbp3 = SetScriptBreakPointByIdFromJS(env->GetIsolate(), script_id, 4, 0); 1794f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org int sbp4 = SetScriptBreakPointByIdFromJS(env->GetIsolate(), script_id, 12, 0); 1795f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org int sbp5 = SetScriptBreakPointByIdFromJS(env->GetIsolate(), script_id, 14, 0); 1796f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org int sbp6 = SetScriptBreakPointByIdFromJS(env->GetIsolate(), script_id, 15, 0); 17977be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org break_point_hit_count = 0; 17987be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org f->Call(env->Global(), 0, NULL); 17997be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org CHECK_EQ(2, break_point_hit_count); 18007be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org g->Call(env->Global(), 0, NULL); 18017be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org CHECK_EQ(7, break_point_hit_count); 18027be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org 18037be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org // Remove all the break points again. 18047be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org break_point_hit_count = 0; 1805f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org ClearBreakPointFromJS(env->GetIsolate(), sbp2); 1806f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org ClearBreakPointFromJS(env->GetIsolate(), sbp3); 1807f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org ClearBreakPointFromJS(env->GetIsolate(), sbp4); 1808f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org ClearBreakPointFromJS(env->GetIsolate(), sbp5); 1809f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org ClearBreakPointFromJS(env->GetIsolate(), sbp6); 18107be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org f->Call(env->Global(), 0, NULL); 18117be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org CHECK_EQ(0, break_point_hit_count); 18127be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org g->Call(env->Global(), 0, NULL); 18137be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org CHECK_EQ(0, break_point_hit_count); 18147be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org 1815662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(NULL); 1816381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org CheckDebuggerUnloaded(); 18179a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 18189a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Make sure that the break point numbers are consecutive. 18199a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(1, sbp1); 18209a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(2, sbp2); 18219a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(3, sbp3); 18229a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(4, sbp4); 18239a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(5, sbp5); 18249a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(6, sbp6); 18259a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 18269a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 18279a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 18289a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Test conditional script break points. 18299a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(EnableDisableScriptBreakPoint) { 18309a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_hit_count = 0; 18319a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com DebugLocalContext env; 18322bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 18339a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com env.ExposeDebug(); 18349a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 1835662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(DebugEventBreakPointHitCount); 18369a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 1837f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Local<v8::String> script = v8::String::NewFromUtf8( 1838f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org env->GetIsolate(), 18399a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "function f() {\n" 18409a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com " a = 0; // line 1\n" 18419a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "};"); 18429a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 18439a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Compile the script and get function f. 18449a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::ScriptOrigin origin = 1845f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::ScriptOrigin(v8::String::NewFromUtf8(env->GetIsolate(), "test")); 18469a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::Script::Compile(script, &origin)->Run(); 1847f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Local<v8::Function> f = v8::Local<v8::Function>::Cast( 1848f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "f"))); 18499a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 18509a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Set script break point on line 1 (in function f). 1851f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org int sbp = SetScriptBreakPointByNameFromJS(env->GetIsolate(), "test", 1, 0); 18529a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 18539a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Call f while enabeling and disabling the script break point. 18549a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_hit_count = 0; 18559a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com f->Call(env->Global(), 0, NULL); 18569a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(1, break_point_hit_count); 18579a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 1858f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org DisableScriptBreakPointFromJS(env->GetIsolate(), sbp); 18599a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com f->Call(env->Global(), 0, NULL); 18609a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(1, break_point_hit_count); 18619a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 1862f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org EnableScriptBreakPointFromJS(env->GetIsolate(), sbp); 18639a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com f->Call(env->Global(), 0, NULL); 18649a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(2, break_point_hit_count); 18659a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 1866f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org DisableScriptBreakPointFromJS(env->GetIsolate(), sbp); 18679a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com f->Call(env->Global(), 0, NULL); 18689a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(2, break_point_hit_count); 18699a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 18709a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Reload the script and get f again checking that the disabeling survives. 18719a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::Script::Compile(script, &origin)->Run(); 1872f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org f = v8::Local<v8::Function>::Cast( 1873f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "f"))); 18749a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com f->Call(env->Global(), 0, NULL); 18759a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(2, break_point_hit_count); 18769a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 1877f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org EnableScriptBreakPointFromJS(env->GetIsolate(), sbp); 18789a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com f->Call(env->Global(), 0, NULL); 18799a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(3, break_point_hit_count); 18809a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 1881662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(NULL); 1882381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org CheckDebuggerUnloaded(); 18839a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 18849a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 18859a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 18869a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Test conditional script break points. 18879a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(ConditionalScriptBreakPoint) { 18889a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_hit_count = 0; 18899a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com DebugLocalContext env; 18902bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 18919a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com env.ExposeDebug(); 18929a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 1893662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(DebugEventBreakPointHitCount); 18949a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 1895f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Local<v8::String> script = v8::String::NewFromUtf8( 1896f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org env->GetIsolate(), 18979a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "count = 0;\n" 18989a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "function f() {\n" 18999a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com " g(count++); // line 2\n" 19009a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "};\n" 19019a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "function g(x) {\n" 19029a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com " var a=x; // line 5\n" 19039a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "};"); 19049a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 19059a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Compile the script and get function f. 19069a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::ScriptOrigin origin = 1907f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::ScriptOrigin(v8::String::NewFromUtf8(env->GetIsolate(), "test")); 19089a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::Script::Compile(script, &origin)->Run(); 1909f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Local<v8::Function> f = v8::Local<v8::Function>::Cast( 1910f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "f"))); 19119a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 19129a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Set script break point on line 5 (in function g). 1913f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org int sbp1 = SetScriptBreakPointByNameFromJS(env->GetIsolate(), "test", 5, 0); 19149a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 19159a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Call f with different conditions on the script break point. 19169a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_hit_count = 0; 1917f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org ChangeScriptBreakPointConditionFromJS(env->GetIsolate(), sbp1, "false"); 19189a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com f->Call(env->Global(), 0, NULL); 19199a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(0, break_point_hit_count); 19209a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 1921f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org ChangeScriptBreakPointConditionFromJS(env->GetIsolate(), sbp1, "true"); 19229a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_hit_count = 0; 19239a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com f->Call(env->Global(), 0, NULL); 19249a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(1, break_point_hit_count); 19259a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 1926f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org ChangeScriptBreakPointConditionFromJS(env->GetIsolate(), sbp1, "x % 2 == 0"); 19279a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_hit_count = 0; 19289a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com for (int i = 0; i < 10; i++) { 19299a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com f->Call(env->Global(), 0, NULL); 19309a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com } 19319a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(5, break_point_hit_count); 19329a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 19339a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Reload the script and get f again checking that the condition survives. 19349a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::Script::Compile(script, &origin)->Run(); 1935f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org f = v8::Local<v8::Function>::Cast( 1936f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "f"))); 19379a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 19389a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_hit_count = 0; 19399a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com for (int i = 0; i < 10; i++) { 19409a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com f->Call(env->Global(), 0, NULL); 19419a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com } 19429a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(5, break_point_hit_count); 19439a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 1944662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(NULL); 1945381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org CheckDebuggerUnloaded(); 19469a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 19479a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 19489a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 19499a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Test ignore count on script break points. 19509a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(ScriptBreakPointIgnoreCount) { 19519a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_hit_count = 0; 19529a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com DebugLocalContext env; 19532bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 19549a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com env.ExposeDebug(); 19559a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 1956662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(DebugEventBreakPointHitCount); 19579a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 1958f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Local<v8::String> script = v8::String::NewFromUtf8( 1959f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org env->GetIsolate(), 19609a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "function f() {\n" 19619a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com " a = 0; // line 1\n" 19629a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "};"); 19639a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 19649a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Compile the script and get function f. 19659a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::ScriptOrigin origin = 1966f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::ScriptOrigin(v8::String::NewFromUtf8(env->GetIsolate(), "test")); 19679a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::Script::Compile(script, &origin)->Run(); 1968f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Local<v8::Function> f = v8::Local<v8::Function>::Cast( 1969f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "f"))); 19709a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 19719a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Set script break point on line 1 (in function f). 1972f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org int sbp = SetScriptBreakPointByNameFromJS(env->GetIsolate(), "test", 1, 0); 19739a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 19749a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Call f with different ignores on the script break point. 19759a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_hit_count = 0; 1976f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org ChangeScriptBreakPointIgnoreCountFromJS(env->GetIsolate(), sbp, 1); 19779a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com f->Call(env->Global(), 0, NULL); 19789a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(0, break_point_hit_count); 19799a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com f->Call(env->Global(), 0, NULL); 19809a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(1, break_point_hit_count); 19819a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 1982f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org ChangeScriptBreakPointIgnoreCountFromJS(env->GetIsolate(), sbp, 5); 19839a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_hit_count = 0; 19849a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com for (int i = 0; i < 10; i++) { 19859a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com f->Call(env->Global(), 0, NULL); 19869a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com } 19879a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(5, break_point_hit_count); 19889a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 19899a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Reload the script and get f again checking that the ignore survives. 19909a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::Script::Compile(script, &origin)->Run(); 1991f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org f = v8::Local<v8::Function>::Cast( 1992f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "f"))); 19939a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 19949a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_hit_count = 0; 19959a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com for (int i = 0; i < 10; i++) { 19969a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com f->Call(env->Global(), 0, NULL); 19979a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com } 19989a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(5, break_point_hit_count); 19999a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 2000662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(NULL); 2001381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org CheckDebuggerUnloaded(); 20029a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 20039a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 20049a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 20059a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Test that script break points survive when a script is reloaded. 20069a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(ScriptBreakPointReload) { 20079a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_hit_count = 0; 20089a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com DebugLocalContext env; 20092bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 20109a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com env.ExposeDebug(); 20119a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 2012662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(DebugEventBreakPointHitCount); 20139a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 20149a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::Local<v8::Function> f; 2015f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Local<v8::String> script = v8::String::NewFromUtf8( 2016f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org env->GetIsolate(), 20179a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "function f() {\n" 20189a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com " function h() {\n" 20199a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com " a = 0; // line 2\n" 20209a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com " }\n" 20219a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com " b = 1; // line 4\n" 20229a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com " return h();\n" 20239a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "}"); 20249a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 2025f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::ScriptOrigin origin_1 = 2026f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::ScriptOrigin(v8::String::NewFromUtf8(env->GetIsolate(), "1")); 2027f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::ScriptOrigin origin_2 = 2028f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::ScriptOrigin(v8::String::NewFromUtf8(env->GetIsolate(), "2")); 20299a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 20309a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Set a script break point before the script is loaded. 2031f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org SetScriptBreakPointByNameFromJS(env->GetIsolate(), "1", 2, 0); 20329a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 20339a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Compile the script and get the function. 20349a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::Script::Compile(script, &origin_1)->Run(); 2035f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org f = v8::Local<v8::Function>::Cast( 2036f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "f"))); 20379a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 20389a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Call f and check that the script break point is active. 20399a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_hit_count = 0; 20409a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com f->Call(env->Global(), 0, NULL); 20419a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(1, break_point_hit_count); 20429a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 20439a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Compile the script again with a different script data and get the 20449a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // function. 20459a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::Script::Compile(script, &origin_2)->Run(); 2046f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org f = v8::Local<v8::Function>::Cast( 2047f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "f"))); 20489a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 20499a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Call f and check that no break points are set. 20509a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_hit_count = 0; 20519a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com f->Call(env->Global(), 0, NULL); 20529a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(0, break_point_hit_count); 20539a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 20549a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Compile the script again and get the function. 20559a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::Script::Compile(script, &origin_1)->Run(); 2056f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org f = v8::Local<v8::Function>::Cast( 2057f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "f"))); 20589a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 20599a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Call f and check that the script break point is active. 20609a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_hit_count = 0; 20619a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com f->Call(env->Global(), 0, NULL); 20629a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(1, break_point_hit_count); 20639a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 2064662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(NULL); 2065381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org CheckDebuggerUnloaded(); 20669a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 20679a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 20689a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 20699a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Test when several scripts has the same script data 20709a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(ScriptBreakPointMultiple) { 20719a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_hit_count = 0; 20729a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com DebugLocalContext env; 20732bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 20749a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com env.ExposeDebug(); 20759a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 2076662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(DebugEventBreakPointHitCount); 20779a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 20789a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::Local<v8::Function> f; 2079f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Local<v8::String> script_f = 2080f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::String::NewFromUtf8(env->GetIsolate(), 2081f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org "function f() {\n" 2082f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org " a = 0; // line 1\n" 2083f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org "}"); 20849a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 20859a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::Local<v8::Function> g; 2086f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Local<v8::String> script_g = 2087f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::String::NewFromUtf8(env->GetIsolate(), 2088f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org "function g() {\n" 2089f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org " b = 0; // line 1\n" 2090f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org "}"); 20919a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 20929a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::ScriptOrigin origin = 2093f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::ScriptOrigin(v8::String::NewFromUtf8(env->GetIsolate(), "test")); 20949a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 20959a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Set a script break point before the scripts are loaded. 2096f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org int sbp = SetScriptBreakPointByNameFromJS(env->GetIsolate(), "test", 1, 0); 20979a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 20989a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Compile the scripts with same script data and get the functions. 20999a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::Script::Compile(script_f, &origin)->Run(); 2100f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org f = v8::Local<v8::Function>::Cast( 2101f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "f"))); 21029a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::Script::Compile(script_g, &origin)->Run(); 2103f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org g = v8::Local<v8::Function>::Cast( 2104f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "g"))); 21059a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 21069a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Call f and g and check that the script break point is active. 21079a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_hit_count = 0; 21089a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com f->Call(env->Global(), 0, NULL); 21099a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(1, break_point_hit_count); 21109a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com g->Call(env->Global(), 0, NULL); 21119a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(2, break_point_hit_count); 21129a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 21139a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Clear the script break point. 2114f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org ClearBreakPointFromJS(env->GetIsolate(), sbp); 21159a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 21169a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Call f and g and check that the script break point is no longer active. 21179a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_hit_count = 0; 21189a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com f->Call(env->Global(), 0, NULL); 21199a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(0, break_point_hit_count); 21209a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com g->Call(env->Global(), 0, NULL); 21219a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(0, break_point_hit_count); 21229a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 21239a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Set script break point with the scripts loaded. 2124f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org sbp = SetScriptBreakPointByNameFromJS(env->GetIsolate(), "test", 1, 0); 21259a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 21269a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Call f and g and check that the script break point is active. 21279a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_hit_count = 0; 21289a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com f->Call(env->Global(), 0, NULL); 21299a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(1, break_point_hit_count); 21309a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com g->Call(env->Global(), 0, NULL); 21319a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(2, break_point_hit_count); 21329a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 2133662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(NULL); 2134381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org CheckDebuggerUnloaded(); 21359a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 21369a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 21379a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 21389a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Test the script origin which has both name and line offset. 21399a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(ScriptBreakPointLineOffset) { 21409a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_hit_count = 0; 21419a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com DebugLocalContext env; 21422bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 21439a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com env.ExposeDebug(); 21449a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 2145662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(DebugEventBreakPointHitCount); 21469a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 21479a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::Local<v8::Function> f; 2148f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Local<v8::String> script = v8::String::NewFromUtf8( 2149f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org env->GetIsolate(), 2150f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org "function f() {\n" 2151f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org " a = 0; // line 8 as this script has line offset 7\n" 2152f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org " b = 0; // line 9 as this script has line offset 7\n" 2153f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org "}"); 21549a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 21559a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Create script origin both name and line offset. 2156f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::ScriptOrigin origin( 2157f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::String::NewFromUtf8(env->GetIsolate(), "test.html"), 2158f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Integer::New(7)); 21599a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 21609a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Set two script break points before the script is loaded. 2161f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org int sbp1 = 2162f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org SetScriptBreakPointByNameFromJS(env->GetIsolate(), "test.html", 8, 0); 2163f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org int sbp2 = 2164f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org SetScriptBreakPointByNameFromJS(env->GetIsolate(), "test.html", 9, 0); 21659a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 21669a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Compile the script and get the function. 21679a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::Script::Compile(script, &origin)->Run(); 2168f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org f = v8::Local<v8::Function>::Cast( 2169f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "f"))); 21709a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 21719a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Call f and check that the script break point is active. 21729a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_hit_count = 0; 21739a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com f->Call(env->Global(), 0, NULL); 21749a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(2, break_point_hit_count); 21759a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 21769a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Clear the script break points. 2177f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org ClearBreakPointFromJS(env->GetIsolate(), sbp1); 2178f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org ClearBreakPointFromJS(env->GetIsolate(), sbp2); 21799a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 21809a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Call f and check that no script break points are active. 21819a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_hit_count = 0; 21829a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com f->Call(env->Global(), 0, NULL); 21839a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(0, break_point_hit_count); 21849a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 21859a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Set a script break point with the script loaded. 2186f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org sbp1 = SetScriptBreakPointByNameFromJS(env->GetIsolate(), "test.html", 9, 0); 21879a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 21889a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Call f and check that the script break point is active. 21899a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_hit_count = 0; 21909a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com f->Call(env->Global(), 0, NULL); 21919a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(1, break_point_hit_count); 21929a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 2193662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(NULL); 2194381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org CheckDebuggerUnloaded(); 21959a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 21969a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 21979a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 21989a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Test script break points set on lines. 21999a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(ScriptBreakPointLine) { 22009a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com DebugLocalContext env; 22012bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 22029a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com env.ExposeDebug(); 22039a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 22049a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Create a function for checking the function when hitting a break point. 22059a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com frame_function_name = CompileFunction(&env, 22069a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com frame_function_name_source, 22079a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "frame_function_name"); 22089a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 2209662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(DebugEventBreakPointHitCount); 22109a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 22119a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::Local<v8::Function> f; 22129a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::Local<v8::Function> g; 2213f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Local<v8::String> script = 2214f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::String::NewFromUtf8(env->GetIsolate(), 2215f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org "a = 0 // line 0\n" 2216f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org "function f() {\n" 2217f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org " a = 1; // line 2\n" 2218f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org "}\n" 2219f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org " a = 2; // line 4\n" 2220f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org " /* xx */ function g() { // line 5\n" 2221f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org " function h() { // line 6\n" 2222f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org " a = 3; // line 7\n" 2223f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org " }\n" 2224f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org " h(); // line 9\n" 2225f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org " a = 4; // line 10\n" 2226f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org " }\n" 2227f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org " a=5; // line 12"); 22289a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 22299a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Set a couple script break point before the script is loaded. 2230f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org int sbp1 = 2231f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org SetScriptBreakPointByNameFromJS(env->GetIsolate(), "test.html", 0, -1); 2232f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org int sbp2 = 2233f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org SetScriptBreakPointByNameFromJS(env->GetIsolate(), "test.html", 1, -1); 2234f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org int sbp3 = 2235f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org SetScriptBreakPointByNameFromJS(env->GetIsolate(), "test.html", 5, -1); 22369a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 22379a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Compile the script and get the function. 22389a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_hit_count = 0; 2239f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::ScriptOrigin origin( 2240f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::String::NewFromUtf8(env->GetIsolate(), "test.html"), 2241f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Integer::New(0)); 22429a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::Script::Compile(script, &origin)->Run(); 2243f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org f = v8::Local<v8::Function>::Cast( 2244f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "f"))); 2245f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org g = v8::Local<v8::Function>::Cast( 2246f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "g"))); 22479a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 22484668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org // Check that a break point was hit when the script was run. 22499a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(1, break_point_hit_count); 2250c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org CHECK_EQ(0, StrLength(last_function_hit)); 22519a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 22529a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Call f and check that the script break point. 22539a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com f->Call(env->Global(), 0, NULL); 22549a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(2, break_point_hit_count); 22559a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ("f", last_function_hit); 22569a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 22579a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Call g and check that the script break point. 22589a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com g->Call(env->Global(), 0, NULL); 22599a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(3, break_point_hit_count); 22609a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ("g", last_function_hit); 22619a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 22629a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Clear the script break point on g and set one on h. 2263f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org ClearBreakPointFromJS(env->GetIsolate(), sbp3); 2264f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org int sbp4 = 2265f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org SetScriptBreakPointByNameFromJS(env->GetIsolate(), "test.html", 6, -1); 22669a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 22679a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Call g and check that the script break point in h is hit. 22689a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com g->Call(env->Global(), 0, NULL); 22699a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(4, break_point_hit_count); 22709a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ("h", last_function_hit); 22719a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 22729a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Clear break points in f and h. Set a new one in the script between 22739a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // functions f and g and test that there is no break points in f and g any 22749a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // more. 2275f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org ClearBreakPointFromJS(env->GetIsolate(), sbp2); 2276f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org ClearBreakPointFromJS(env->GetIsolate(), sbp4); 2277f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org int sbp5 = 2278f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org SetScriptBreakPointByNameFromJS(env->GetIsolate(), "test.html", 4, -1); 22799a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_hit_count = 0; 22809a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com f->Call(env->Global(), 0, NULL); 22819a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com g->Call(env->Global(), 0, NULL); 22829a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(0, break_point_hit_count); 22839a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 22849a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Reload the script which should hit two break points. 22859a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_hit_count = 0; 22869a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::Script::Compile(script, &origin)->Run(); 22879a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(2, break_point_hit_count); 2288c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org CHECK_EQ(0, StrLength(last_function_hit)); 22899a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 22909a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Set a break point in the code after the last function decleration. 2291f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org int sbp6 = 2292f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org SetScriptBreakPointByNameFromJS(env->GetIsolate(), "test.html", 12, -1); 22939a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 22949a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Reload the script which should hit three break points. 22959a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_hit_count = 0; 22969a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::Script::Compile(script, &origin)->Run(); 22979a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(3, break_point_hit_count); 2298c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org CHECK_EQ(0, StrLength(last_function_hit)); 22999a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 23009a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Clear the last break points, and reload the script which should not hit any 23019a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // break points. 2302f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org ClearBreakPointFromJS(env->GetIsolate(), sbp1); 2303f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org ClearBreakPointFromJS(env->GetIsolate(), sbp5); 2304f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org ClearBreakPointFromJS(env->GetIsolate(), sbp6); 23059a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_hit_count = 0; 23069a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::Script::Compile(script, &origin)->Run(); 23079a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(0, break_point_hit_count); 23089a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 2309662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(NULL); 2310381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org CheckDebuggerUnloaded(); 23119a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 23129a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 23139a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 23145ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org// Test top level script break points set on lines. 23155ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.orgTEST(ScriptBreakPointLineTopLevel) { 23165ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org DebugLocalContext env; 23172bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 23185ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org env.ExposeDebug(); 23195ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org 2320662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(DebugEventBreakPointHitCount); 23215ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org 2322f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Local<v8::String> script = 2323f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::String::NewFromUtf8(env->GetIsolate(), 2324f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org "function f() {\n" 2325f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org " a = 1; // line 1\n" 2326f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org "}\n" 2327f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org "a = 2; // line 3\n"); 23285ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org v8::Local<v8::Function> f; 23295ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org { 23302bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 2331f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Script::Compile( 2332f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org script, v8::String::NewFromUtf8(env->GetIsolate(), "test.html"))->Run(); 23335ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org } 2334f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org f = v8::Local<v8::Function>::Cast( 2335f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "f"))); 23365ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org 2337528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org CcTest::heap()->CollectAllGarbage(Heap::kNoGCFlags); 23385ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org 2339f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org SetScriptBreakPointByNameFromJS(env->GetIsolate(), "test.html", 3, -1); 23405ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org 23415ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org // Call f and check that there was no break points. 23425ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org break_point_hit_count = 0; 23435ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org f->Call(env->Global(), 0, NULL); 23445ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org CHECK_EQ(0, break_point_hit_count); 23455ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org 23465ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org // Recompile and run script and check that break point was hit. 23475ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org break_point_hit_count = 0; 2348f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Script::Compile( 2349f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org script, v8::String::NewFromUtf8(env->GetIsolate(), "test.html"))->Run(); 23505ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org CHECK_EQ(1, break_point_hit_count); 23515ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org 23525ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org // Call f and check that there are still no break points. 23535ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org break_point_hit_count = 0; 2354f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org f = v8::Local<v8::Function>::Cast( 2355f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "f"))); 23565ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org CHECK_EQ(0, break_point_hit_count); 23575ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org 2358662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(NULL); 23595ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org CheckDebuggerUnloaded(); 23605ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org} 23615ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org 23625ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org 236369ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org// Test that it is possible to add and remove break points in a top level 236469ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org// function which has no references but has not been collected yet. 236569ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.orgTEST(ScriptBreakPointTopLevelCrash) { 236669ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org DebugLocalContext env; 23672bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 236869ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org env.ExposeDebug(); 236969ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org 2370662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(DebugEventBreakPointHitCount); 237169ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org 2372f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Local<v8::String> script_source = 2373f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::String::NewFromUtf8(env->GetIsolate(), 2374f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org "function f() {\n" 2375f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org " return 0;\n" 2376f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org "}\n" 2377f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org "f()"); 237869ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org 2379f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org int sbp1 = 2380f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org SetScriptBreakPointByNameFromJS(env->GetIsolate(), "test.html", 3, -1); 238169ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org { 23822bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 238369ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org break_point_hit_count = 0; 2384f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Script::Compile(script_source, 2385f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::String::NewFromUtf8(env->GetIsolate(), "test.html")) 2386f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org ->Run(); 238769ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org CHECK_EQ(1, break_point_hit_count); 238869ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org } 238969ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org 2390f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org int sbp2 = 2391f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org SetScriptBreakPointByNameFromJS(env->GetIsolate(), "test.html", 3, -1); 2392f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org ClearBreakPointFromJS(env->GetIsolate(), sbp1); 2393f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org ClearBreakPointFromJS(env->GetIsolate(), sbp2); 239469ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org 2395662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(NULL); 239669ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org CheckDebuggerUnloaded(); 239769ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org} 239869ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org 239969ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org 24009a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Test that it is possible to remove the last break point for a function 24019a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// inside the break handling of that break point. 24029a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(RemoveBreakPointInBreak) { 24039a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com DebugLocalContext env; 24042bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 24059a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 24069a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::Local<v8::Function> foo = 24079a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CompileFunction(&env, "function foo(){a=1;}", "foo"); 24089a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com debug_event_remove_break_point = SetBreakPoint(foo, 0); 24099a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 24109a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Register the debug event listener pasing the function 2411662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(DebugEventRemoveBreakPoint, foo); 24129a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 24139a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_hit_count = 0; 24149a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com foo->Call(env->Global(), 0, NULL); 24159a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(1, break_point_hit_count); 24169a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 24179a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_hit_count = 0; 24189a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com foo->Call(env->Global(), 0, NULL); 24199a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(0, break_point_hit_count); 24209a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 2421662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(NULL); 2422381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org CheckDebuggerUnloaded(); 24239a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 24249a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 24259a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 24269a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Test that the debugger statement causes a break. 24279a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(DebuggerStatement) { 24289a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_hit_count = 0; 24299a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com DebugLocalContext env; 24302bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 2431662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(DebugEventBreakPointHitCount); 2432f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Script::Compile( 2433f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::String::NewFromUtf8(env->GetIsolate(), "function bar(){debugger}")) 2434f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org ->Run(); 2435f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Script::Compile( 2436f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::String::NewFromUtf8(env->GetIsolate(), 2437f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org "function foo(){debugger;debugger;}"))->Run(); 2438f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Local<v8::Function> foo = v8::Local<v8::Function>::Cast( 2439f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "foo"))); 2440f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Local<v8::Function> bar = v8::Local<v8::Function>::Cast( 2441f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "bar"))); 24429a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 24439a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Run function with debugger statement 24449a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com bar->Call(env->Global(), 0, NULL); 24459a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(1, break_point_hit_count); 24469a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 24479a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Run function with two debugger statement 24489a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com foo->Call(env->Global(), 0, NULL); 24499a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(3, break_point_hit_count); 24509a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 2451662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(NULL); 2452381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org CheckDebuggerUnloaded(); 24539a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 24549a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 24559a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 245669ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org// Test setting a breakpoint on the debugger statement. 2457b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgTEST(DebuggerStatementBreakpoint) { 2458b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org break_point_hit_count = 0; 2459b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org DebugLocalContext env; 24602bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 2461662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(DebugEventBreakPointHitCount); 2462f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Script::Compile( 2463f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::String::NewFromUtf8(env->GetIsolate(), "function foo(){debugger;}")) 2464f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org ->Run(); 2465f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Local<v8::Function> foo = v8::Local<v8::Function>::Cast( 2466f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "foo"))); 2467b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 2468b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org // The debugger statement triggers breakpint hit 2469b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org foo->Call(env->Global(), 0, NULL); 2470b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org CHECK_EQ(1, break_point_hit_count); 2471b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 2472b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org int bp = SetBreakPoint(foo, 0); 2473b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 2474b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org // Set breakpoint does not duplicate hits 2475b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org foo->Call(env->Global(), 0, NULL); 2476b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org CHECK_EQ(2, break_point_hit_count); 2477b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 2478b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org ClearBreakPoint(bp); 2479662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(NULL); 2480b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org CheckDebuggerUnloaded(); 2481b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org} 2482b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 2483b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 2484c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org// Test that the evaluation of expressions when a break point is hit generates 24859a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// the correct results. 24869a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(DebugEvaluate) { 24879a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com DebugLocalContext env; 2488cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org v8::Isolate* isolate = env->GetIsolate(); 2489cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org v8::HandleScope scope(isolate); 24909a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com env.ExposeDebug(); 24919a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 24929a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Create a function for checking the evaluation when hitting a break point. 24939a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com evaluate_check_function = CompileFunction(&env, 24949a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com evaluate_check_source, 24959a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "evaluate_check"); 24969a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Register the debug event listener 2497662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(DebugEventEvaluate); 24989a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 24999a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Different expected vaules of x and a when in a break point (u = undefined, 25009a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // d = Hello, world!). 25019a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com struct EvaluateCheck checks_uu[] = { 2502cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org {"x", v8::Undefined(isolate)}, 2503cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org {"a", v8::Undefined(isolate)}, 25049a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com {NULL, v8::Handle<v8::Value>()} 25059a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com }; 25069a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com struct EvaluateCheck checks_hu[] = { 2507f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org {"x", v8::String::NewFromUtf8(env->GetIsolate(), "Hello, world!")}, 2508cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org {"a", v8::Undefined(isolate)}, 25099a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com {NULL, v8::Handle<v8::Value>()} 25109a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com }; 25119a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com struct EvaluateCheck checks_hh[] = { 2512f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org {"x", v8::String::NewFromUtf8(env->GetIsolate(), "Hello, world!")}, 2513f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org {"a", v8::String::NewFromUtf8(env->GetIsolate(), "Hello, world!")}, 25149a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com {NULL, v8::Handle<v8::Value>()} 25159a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com }; 25169a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 25179a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Simple test function. The "y=0" is in the function foo to provide a break 25189a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // location. For "y=0" the "y" is at position 15 in the barbar function 25199a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // therefore setting breakpoint at position 15 will break at "y=0" and 25209a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // setting it higher will break after. 25219a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::Local<v8::Function> foo = CompileFunction(&env, 25229a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "function foo(x) {" 25239a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com " var a;" 25242356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org " y=0;" // To ensure break location 1. 25259a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com " a=x;" 25262356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org " y=0;" // To ensure break location 2. 25279a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "}", 25289a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "foo"); 25292356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org const int foo_break_position_1 = 15; 25302356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org const int foo_break_position_2 = 29; 25319a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 25329a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Arguments with one parameter "Hello, world!" 2533f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Handle<v8::Value> argv_foo[1] = { 2534f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::String::NewFromUtf8(env->GetIsolate(), "Hello, world!")}; 25359a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 25369a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Call foo with breakpoint set before a=x and undefined as parameter. 25372356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org int bp = SetBreakPoint(foo, foo_break_position_1); 25389a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com checks = checks_uu; 25399a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com foo->Call(env->Global(), 0, NULL); 25409a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 25419a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Call foo with breakpoint set before a=x and parameter "Hello, world!". 25429a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com checks = checks_hu; 25439a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com foo->Call(env->Global(), 1, argv_foo); 25449a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 25459a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Call foo with breakpoint set after a=x and parameter "Hello, world!". 25469a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com ClearBreakPoint(bp); 25472356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org SetBreakPoint(foo, foo_break_position_2); 25489a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com checks = checks_hh; 25499a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com foo->Call(env->Global(), 1, argv_foo); 25509a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 25519a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Test function with an inner function. The "y=0" is in function barbar 25529a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // to provide a break location. For "y=0" the "y" is at position 8 in the 25539a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // barbar function therefore setting breakpoint at position 8 will break at 25549a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // "y=0" and setting it higher will break after. 25559a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::Local<v8::Function> bar = CompileFunction(&env, 25569a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "y = 0;" 25579a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "x = 'Goodbye, world!';" 25589a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "function bar(x, b) {" 25599a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com " var a;" 25609a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com " function barbar() {" 25619a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com " y=0; /* To ensure break location.*/" 25629a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com " a=x;" 25639a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com " };" 25649a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com " debug.Debug.clearAllBreakPoints();" 25659a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com " barbar();" 25669a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com " y=0;a=x;" 25679a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "}", 25689a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "bar"); 25699a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com const int barbar_break_position = 8; 25709a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 25719a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Call bar setting breakpoint before a=x in barbar and undefined as 25729a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // parameter. 25739a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com checks = checks_uu; 25749a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::Handle<v8::Value> argv_bar_1[2] = { 2575cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org v8::Undefined(isolate), 25769a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::Number::New(barbar_break_position) 25779a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com }; 25789a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com bar->Call(env->Global(), 2, argv_bar_1); 25799a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 25809a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Call bar setting breakpoint before a=x in barbar and parameter 25819a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // "Hello, world!". 25829a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com checks = checks_hu; 25839a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::Handle<v8::Value> argv_bar_2[2] = { 2584f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::String::NewFromUtf8(env->GetIsolate(), "Hello, world!"), 25859a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::Number::New(barbar_break_position) 25869a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com }; 25879a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com bar->Call(env->Global(), 2, argv_bar_2); 25889a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 25899a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Call bar setting breakpoint after a=x in barbar and parameter 25909a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // "Hello, world!". 25919a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com checks = checks_hh; 25929a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::Handle<v8::Value> argv_bar_3[2] = { 2593f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::String::NewFromUtf8(env->GetIsolate(), "Hello, world!"), 25949a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::Number::New(barbar_break_position + 1) 25959a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com }; 25969a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com bar->Call(env->Global(), 2, argv_bar_3); 25979a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 2598662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(NULL); 2599381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org CheckDebuggerUnloaded(); 26009a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 26019a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 2602c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org 2603c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.orgint debugEventCount = 0; 2604c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.orgstatic void CheckDebugEvent(const v8::Debug::EventDetails& eventDetails) { 2605c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org if (eventDetails.GetEvent() == v8::Break) ++debugEventCount; 2606c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org} 2607c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org 2608e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 2609c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org// Test that the conditional breakpoints work event if code generation from 2610c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org// strings is prohibited in the debugee context. 2611c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.orgTEST(ConditionalBreakpointWithCodeGenerationDisallowed) { 2612c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org DebugLocalContext env; 26132bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 2614c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org env.ExposeDebug(); 2615c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org 2616c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org v8::Debug::SetDebugEventListener2(CheckDebugEvent); 2617c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org 2618c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org v8::Local<v8::Function> foo = CompileFunction(&env, 2619c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org "function foo(x) {\n" 2620c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org " var s = 'String value2';\n" 2621c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org " return s + x;\n" 2622c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org "}", 2623c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org "foo"); 2624c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org 2625c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org // Set conditional breakpoint with condition 'true'. 2626c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org CompileRun("debug.Debug.setBreakPoint(foo, 2, 0, 'true')"); 2627c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org 2628c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org debugEventCount = 0; 2629c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org env->AllowCodeGenerationFromStrings(false); 2630c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org foo->Call(env->Global(), 0, NULL); 2631c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org CHECK_EQ(1, debugEventCount); 2632c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org 2633c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org v8::Debug::SetDebugEventListener2(NULL); 2634c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org CheckDebuggerUnloaded(); 2635c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org} 2636c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org 2637c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org 2638c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.orgbool checkedDebugEvals = true; 2639c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.orgv8::Handle<v8::Function> checkGlobalEvalFunction; 2640c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.orgv8::Handle<v8::Function> checkFrameEvalFunction; 2641c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.orgstatic void CheckDebugEval(const v8::Debug::EventDetails& eventDetails) { 2642c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org if (eventDetails.GetEvent() == v8::Break) { 2643c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org ++debugEventCount; 2644528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::HandleScope handleScope(CcTest::isolate()); 2645c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org 2646c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org v8::Handle<v8::Value> args[] = { eventDetails.GetExecutionState() }; 2647c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org CHECK(checkGlobalEvalFunction->Call( 2648c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org eventDetails.GetEventContext()->Global(), 1, args)->IsTrue()); 2649c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org CHECK(checkFrameEvalFunction->Call( 2650c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org eventDetails.GetEventContext()->Global(), 1, args)->IsTrue()); 2651c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org } 2652c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org} 2653c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org 2654e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 2655c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org// Test that the evaluation of expressions when a break point is hit generates 2656c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org// the correct results in case code generation from strings is disallowed in the 2657c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org// debugee context. 2658c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.orgTEST(DebugEvaluateWithCodeGenerationDisallowed) { 2659c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org DebugLocalContext env; 26602bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 2661c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org env.ExposeDebug(); 2662c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org 2663c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org v8::Debug::SetDebugEventListener2(CheckDebugEval); 2664c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org 2665c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org v8::Local<v8::Function> foo = CompileFunction(&env, 2666c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org "var global = 'Global';\n" 2667c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org "function foo(x) {\n" 2668c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org " var local = 'Local';\n" 2669c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org " debugger;\n" 2670c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org " return local + x;\n" 2671c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org "}", 2672c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org "foo"); 2673c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org checkGlobalEvalFunction = CompileFunction(&env, 2674c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org "function checkGlobalEval(exec_state) {\n" 2675c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org " return exec_state.evaluateGlobal('global').value() === 'Global';\n" 2676c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org "}", 2677c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org "checkGlobalEval"); 2678c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org 2679c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org checkFrameEvalFunction = CompileFunction(&env, 2680c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org "function checkFrameEval(exec_state) {\n" 2681c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org " return exec_state.frame(0).evaluate('local').value() === 'Local';\n" 2682c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org "}", 2683c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org "checkFrameEval"); 2684c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org debugEventCount = 0; 2685c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org env->AllowCodeGenerationFromStrings(false); 2686c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org foo->Call(env->Global(), 0, NULL); 2687c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org CHECK_EQ(1, debugEventCount); 2688c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org 2689c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org checkGlobalEvalFunction.Clear(); 2690c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org checkFrameEvalFunction.Clear(); 2691c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org v8::Debug::SetDebugEventListener2(NULL); 2692c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org CheckDebuggerUnloaded(); 2693c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org} 2694c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org 2695c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org 2696b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org// Copies a C string to a 16-bit string. Does not check for buffer overflow. 2697b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org// Does not use the V8 engine to convert strings, so it can be used 2698b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org// in any thread. Returns the length of the string. 2699b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgint AsciiToUtf16(const char* input_buffer, uint16_t* output_buffer) { 2700b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org int i; 2701b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org for (i = 0; input_buffer[i] != '\0'; ++i) { 2702b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org // ASCII does not use chars > 127, but be careful anyway. 2703b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org output_buffer[i] = static_cast<unsigned char>(input_buffer[i]); 2704b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org } 2705b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org output_buffer[i] = 0; 2706b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org return i; 2707b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org} 2708b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 2709e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 2710b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org// Copies a 16-bit string to a C string by dropping the high byte of 2711b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org// each character. Does not check for buffer overflow. 2712b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org// Can be used in any thread. Requires string length as an input. 2713b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgint Utf16ToAscii(const uint16_t* input_buffer, int length, 2714b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org char* output_buffer, int output_len = -1) { 2715b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org if (output_len >= 0) { 2716b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org if (length > output_len - 1) { 2717b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org length = output_len - 1; 2718b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org } 2719b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org } 2720b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 2721b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org for (int i = 0; i < length; ++i) { 2722b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org output_buffer[i] = static_cast<char>(input_buffer[i]); 2723b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org } 2724b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org output_buffer[length] = '\0'; 2725b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org return length; 2726b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org} 2727b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 2728b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 2729b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org// We match parts of the message to get evaluate result int value. 2730b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgbool GetEvaluateStringResult(char *message, char* buffer, int buffer_size) { 2731b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org if (strstr(message, "\"command\":\"evaluate\"") == NULL) { 2732b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org return false; 2733b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org } 2734b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org const char* prefix = "\"text\":\""; 2735b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org char* pos1 = strstr(message, prefix); 2736b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org if (pos1 == NULL) { 2737b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org return false; 2738b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org } 2739b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org pos1 += strlen(prefix); 2740b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org char* pos2 = strchr(pos1, '"'); 2741b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org if (pos2 == NULL) { 2742b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org return false; 2743b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org } 2744b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org Vector<char> buf(buffer, buffer_size); 2745b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org int len = static_cast<int>(pos2 - pos1); 2746b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org if (len > buffer_size - 1) { 2747b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org len = buffer_size - 1; 2748b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org } 2749b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org OS::StrNCpy(buf, pos1, len); 2750b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org buffer[buffer_size - 1] = '\0'; 2751b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org return true; 2752b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org} 2753b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 2754b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 2755b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgstruct EvaluateResult { 2756b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org static const int kBufferSize = 20; 2757b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org char buffer[kBufferSize]; 2758b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org}; 2759b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 2760b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgstruct DebugProcessDebugMessagesData { 2761b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org static const int kArraySize = 5; 2762b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org int counter; 2763b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org EvaluateResult results[kArraySize]; 2764b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 2765b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org void reset() { 2766b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org counter = 0; 2767b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org } 2768b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org EvaluateResult* current() { 2769b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org return &results[counter % kArraySize]; 2770b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org } 2771b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org void next() { 2772b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org counter++; 2773b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org } 2774b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org}; 2775b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 2776b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgDebugProcessDebugMessagesData process_debug_messages_data; 2777b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 2778b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgstatic void DebugProcessDebugMessagesHandler( 2779662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org const v8::Debug::Message& message) { 2780662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Handle<v8::String> json = message.GetJSON(); 2781f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::String::Utf8Value utf8(json); 2782b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org EvaluateResult* array_item = process_debug_messages_data.current(); 2783b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 2784f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org bool res = GetEvaluateStringResult(*utf8, 2785b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org array_item->buffer, 2786b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org EvaluateResult::kBufferSize); 2787b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org if (res) { 2788b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org process_debug_messages_data.next(); 2789b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org } 2790b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org} 2791b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 2792e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 2793b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org// Test that the evaluation of expressions works even from ProcessDebugMessages 2794b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org// i.e. with empty stack. 2795b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgTEST(DebugEvaluateWithoutStack) { 2796662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetMessageHandler2(DebugProcessDebugMessagesHandler); 2797b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 2798b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org DebugLocalContext env; 27992bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 2800b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 2801b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org const char* source = 2802b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org "var v1 = 'Pinguin';\n function getAnimal() { return 'Capy' + 'bara'; }"; 2803b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 2804f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Script::Compile(v8::String::NewFromUtf8(env->GetIsolate(), source)) 2805f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org ->Run(); 2806b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 2807b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org v8::Debug::ProcessDebugMessages(); 2808b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 2809b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org const int kBufferSize = 1000; 2810b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org uint16_t buffer[kBufferSize]; 2811b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 2812b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org const char* command_111 = "{\"seq\":111," 2813b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org "\"type\":\"request\"," 2814b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org "\"command\":\"evaluate\"," 2815b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org "\"arguments\":{" 2816b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org " \"global\":true," 2817b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org " \"expression\":\"v1\",\"disable_break\":true" 2818b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org "}}"; 2819b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 2820528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Isolate* isolate = CcTest::isolate(); 2821528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Debug::SendCommand(isolate, buffer, AsciiToUtf16(command_111, buffer)); 2822b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 2823b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org const char* command_112 = "{\"seq\":112," 2824b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org "\"type\":\"request\"," 2825b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org "\"command\":\"evaluate\"," 2826b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org "\"arguments\":{" 2827b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org " \"global\":true," 2828b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org " \"expression\":\"getAnimal()\",\"disable_break\":true" 2829b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org "}}"; 2830b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 2831528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Debug::SendCommand(isolate, buffer, AsciiToUtf16(command_112, buffer)); 2832b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 2833b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org const char* command_113 = "{\"seq\":113," 2834b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org "\"type\":\"request\"," 2835b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org "\"command\":\"evaluate\"," 2836b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org "\"arguments\":{" 2837b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org " \"global\":true," 2838b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org " \"expression\":\"239 + 566\",\"disable_break\":true" 2839b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org "}}"; 2840b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 2841528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Debug::SendCommand(isolate, buffer, AsciiToUtf16(command_113, buffer)); 2842b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 2843b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org v8::Debug::ProcessDebugMessages(); 2844b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 2845b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org CHECK_EQ(3, process_debug_messages_data.counter); 2846b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 2847b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org CHECK_EQ(strcmp("Pinguin", process_debug_messages_data.results[0].buffer), 0); 2848b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org CHECK_EQ(strcmp("Capybara", process_debug_messages_data.results[1].buffer), 2849b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 0); 2850b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org CHECK_EQ(strcmp("805", process_debug_messages_data.results[2].buffer), 0); 2851b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 2852662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetMessageHandler2(NULL); 2853662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(NULL); 2854b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org CheckDebuggerUnloaded(); 2855b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org} 2856b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 28579a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 28589a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Simple test of the stepping mechanism using only store ICs. 28599a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(DebugStepLinear) { 28609a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com DebugLocalContext env; 28612bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 28629a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 28639a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Create a function for testing stepping. 28649a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::Local<v8::Function> foo = CompileFunction(&env, 28659a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "function foo(){a=1;b=1;c=1;}", 28669a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "foo"); 2867a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2868a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Run foo to allow it to get optimized. 2869a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org CompileRun("a=0; b=0; c=0; foo();"); 2870a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 28719a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com SetBreakPoint(foo, 3); 28729a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 28739a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Register a debug event listener which steps and counts. 2874662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(DebugEventStep); 28759a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 28769a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com step_action = StepIn; 28779a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_hit_count = 0; 28789a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com foo->Call(env->Global(), 0, NULL); 28799a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 28809a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // With stepping all break locations are hit. 28819a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(4, break_point_hit_count); 28829a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 2883662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(NULL); 2884381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org CheckDebuggerUnloaded(); 28859a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 28869a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Register a debug event listener which just counts. 2887662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(DebugEventBreakPointHitCount); 28889a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 2889381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org SetBreakPoint(foo, 3); 28909a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_hit_count = 0; 28919a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com foo->Call(env->Global(), 0, NULL); 28929a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 28939a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Without stepping only active break points are hit. 28949a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(1, break_point_hit_count); 28959a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 2896662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(NULL); 2897381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org CheckDebuggerUnloaded(); 28989a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 28999a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 29009a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 290165dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org// Test of the stepping mechanism for keyed load in a loop. 290265dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.orgTEST(DebugStepKeyedLoadLoop) { 290365dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org DebugLocalContext env; 29042bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 290565dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 29062356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org // Register a debug event listener which steps and counts. 2907662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(DebugEventStep); 29082356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org 290965dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org // Create a function for testing stepping of keyed load. The statement 'y=1' 291065dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org // is there to have more than one breakable statement in the loop, TODO(315). 291165dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org v8::Local<v8::Function> foo = CompileFunction( 291265dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org &env, 291365dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org "function foo(a) {\n" 291465dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org " var x;\n" 291565dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org " var len = a.length;\n" 291665dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org " for (var i = 0; i < len; i++) {\n" 291765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org " y = 1;\n" 291865dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org " x = a[i];\n" 291965dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org " }\n" 2920a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org "}\n" 2921a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org "y=0\n", 292265dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org "foo"); 292365dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 292465dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org // Create array [0,1,2,3,4,5,6,7,8,9] 29259f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.org v8::Local<v8::Array> a = v8::Array::New(env->GetIsolate(), 10); 292665dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org for (int i = 0; i < 10; i++) { 292765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org a->Set(v8::Number::New(i), v8::Number::New(i)); 292865dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org } 292965dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 293065dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org // Call function without any break points to ensure inlining is in place. 293165dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org const int kArgc = 1; 293265dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org v8::Handle<v8::Value> args[kArgc] = { a }; 293365dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org foo->Call(env->Global(), kArgc, args); 293465dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 2935f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com // Set up break point and step through the function. 293665dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org SetBreakPoint(foo, 3); 293765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org step_action = StepNext; 293865dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org break_point_hit_count = 0; 293965dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org foo->Call(env->Global(), kArgc, args); 294065dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 294165dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org // With stepping all break locations are hit. 2942a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org CHECK_EQ(35, break_point_hit_count); 294365dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 2944662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(NULL); 294565dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org CheckDebuggerUnloaded(); 294665dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org} 294765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 294865dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 2949eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org// Test of the stepping mechanism for keyed store in a loop. 2950eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.orgTEST(DebugStepKeyedStoreLoop) { 2951eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org DebugLocalContext env; 29522bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 2953eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org 29542356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org // Register a debug event listener which steps and counts. 2955662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(DebugEventStep); 29562356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org 2957eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org // Create a function for testing stepping of keyed store. The statement 'y=1' 2958eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org // is there to have more than one breakable statement in the loop, TODO(315). 2959eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org v8::Local<v8::Function> foo = CompileFunction( 2960eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org &env, 2961eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org "function foo(a) {\n" 2962eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org " var len = a.length;\n" 2963eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org " for (var i = 0; i < len; i++) {\n" 2964eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org " y = 1;\n" 2965eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org " a[i] = 42;\n" 2966eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org " }\n" 2967a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org "}\n" 2968a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org "y=0\n", 2969eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org "foo"); 2970eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org 2971eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org // Create array [0,1,2,3,4,5,6,7,8,9] 29729f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.org v8::Local<v8::Array> a = v8::Array::New(env->GetIsolate(), 10); 2973eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org for (int i = 0; i < 10; i++) { 2974eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org a->Set(v8::Number::New(i), v8::Number::New(i)); 2975eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org } 2976eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org 2977eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org // Call function without any break points to ensure inlining is in place. 2978eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org const int kArgc = 1; 2979eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org v8::Handle<v8::Value> args[kArgc] = { a }; 2980eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org foo->Call(env->Global(), kArgc, args); 2981eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org 2982f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com // Set up break point and step through the function. 2983eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org SetBreakPoint(foo, 3); 2984eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org step_action = StepNext; 2985eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org break_point_hit_count = 0; 2986eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org foo->Call(env->Global(), kArgc, args); 2987eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org 2988eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org // With stepping all break locations are hit. 2989a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org CHECK_EQ(34, break_point_hit_count); 2990eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org 2991662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(NULL); 2992eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org CheckDebuggerUnloaded(); 2993eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org} 2994eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org 2995eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org 2996720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org// Test of the stepping mechanism for named load in a loop. 2997720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.orgTEST(DebugStepNamedLoadLoop) { 2998720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org DebugLocalContext env; 29992bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 3000720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org 30012356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org // Register a debug event listener which steps and counts. 3002662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(DebugEventStep); 30032356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org 3004720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org // Create a function for testing stepping of named load. 3005720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org v8::Local<v8::Function> foo = CompileFunction( 3006720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org &env, 3007720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org "function foo() {\n" 3008720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org " var a = [];\n" 3009720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org " var s = \"\";\n" 3010720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org " for (var i = 0; i < 10; i++) {\n" 3011720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org " var v = new V(i, i + 1);\n" 3012720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org " v.y;\n" 3013720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org " a.length;\n" // Special case: array length. 3014720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org " s.length;\n" // Special case: string length. 3015720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org " }\n" 3016720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org "}\n" 3017720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org "function V(x, y) {\n" 3018720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org " this.x = x;\n" 3019720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org " this.y = y;\n" 3020720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org "}\n", 3021720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org "foo"); 3022720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org 3023720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org // Call function without any break points to ensure inlining is in place. 3024720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org foo->Call(env->Global(), 0, NULL); 3025720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org 3026f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com // Set up break point and step through the function. 3027720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org SetBreakPoint(foo, 4); 3028720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org step_action = StepNext; 3029720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org break_point_hit_count = 0; 3030720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org foo->Call(env->Global(), 0, NULL); 3031720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org 3032720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org // With stepping all break locations are hit. 3033a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org CHECK_EQ(55, break_point_hit_count); 3034720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org 3035662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(NULL); 3036720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org CheckDebuggerUnloaded(); 3037720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org} 3038720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org 3039720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org 3040a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgstatic void DoDebugStepNamedStoreLoop(int expected) { 30410b9f850f0e9dc624b9e0c5254393112ecc7f8bc9ricow@chromium.org DebugLocalContext env; 30422bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 30430b9f850f0e9dc624b9e0c5254393112ecc7f8bc9ricow@chromium.org 3044a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Register a debug event listener which steps and counts. 3045662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(DebugEventStep); 30460b9f850f0e9dc624b9e0c5254393112ecc7f8bc9ricow@chromium.org 30470b9f850f0e9dc624b9e0c5254393112ecc7f8bc9ricow@chromium.org // Create a function for testing stepping of named store. 30480b9f850f0e9dc624b9e0c5254393112ecc7f8bc9ricow@chromium.org v8::Local<v8::Function> foo = CompileFunction( 30490b9f850f0e9dc624b9e0c5254393112ecc7f8bc9ricow@chromium.org &env, 30500b9f850f0e9dc624b9e0c5254393112ecc7f8bc9ricow@chromium.org "function foo() {\n" 30510b9f850f0e9dc624b9e0c5254393112ecc7f8bc9ricow@chromium.org " var a = {a:1};\n" 30520b9f850f0e9dc624b9e0c5254393112ecc7f8bc9ricow@chromium.org " for (var i = 0; i < 10; i++) {\n" 30530b9f850f0e9dc624b9e0c5254393112ecc7f8bc9ricow@chromium.org " a.a = 2\n" 30540b9f850f0e9dc624b9e0c5254393112ecc7f8bc9ricow@chromium.org " }\n" 30550b9f850f0e9dc624b9e0c5254393112ecc7f8bc9ricow@chromium.org "}\n", 30560b9f850f0e9dc624b9e0c5254393112ecc7f8bc9ricow@chromium.org "foo"); 30570b9f850f0e9dc624b9e0c5254393112ecc7f8bc9ricow@chromium.org 30580b9f850f0e9dc624b9e0c5254393112ecc7f8bc9ricow@chromium.org // Call function without any break points to ensure inlining is in place. 30590b9f850f0e9dc624b9e0c5254393112ecc7f8bc9ricow@chromium.org foo->Call(env->Global(), 0, NULL); 30600b9f850f0e9dc624b9e0c5254393112ecc7f8bc9ricow@chromium.org 3061f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com // Set up break point and step through the function. 30620b9f850f0e9dc624b9e0c5254393112ecc7f8bc9ricow@chromium.org SetBreakPoint(foo, 3); 30630b9f850f0e9dc624b9e0c5254393112ecc7f8bc9ricow@chromium.org step_action = StepNext; 30640b9f850f0e9dc624b9e0c5254393112ecc7f8bc9ricow@chromium.org break_point_hit_count = 0; 30650b9f850f0e9dc624b9e0c5254393112ecc7f8bc9ricow@chromium.org foo->Call(env->Global(), 0, NULL); 30660b9f850f0e9dc624b9e0c5254393112ecc7f8bc9ricow@chromium.org 30670b9f850f0e9dc624b9e0c5254393112ecc7f8bc9ricow@chromium.org // With stepping all expected break locations are hit. 30680b9f850f0e9dc624b9e0c5254393112ecc7f8bc9ricow@chromium.org CHECK_EQ(expected, break_point_hit_count); 30690b9f850f0e9dc624b9e0c5254393112ecc7f8bc9ricow@chromium.org 3070662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(NULL); 30710b9f850f0e9dc624b9e0c5254393112ecc7f8bc9ricow@chromium.org CheckDebuggerUnloaded(); 30720b9f850f0e9dc624b9e0c5254393112ecc7f8bc9ricow@chromium.org} 30730b9f850f0e9dc624b9e0c5254393112ecc7f8bc9ricow@chromium.org 30740b9f850f0e9dc624b9e0c5254393112ecc7f8bc9ricow@chromium.org 30750b9f850f0e9dc624b9e0c5254393112ecc7f8bc9ricow@chromium.org// Test of the stepping mechanism for named load in a loop. 3076a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgTEST(DebugStepNamedStoreLoop) { 3077a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org DoDebugStepNamedStoreLoop(24); 30780b9f850f0e9dc624b9e0c5254393112ecc7f8bc9ricow@chromium.org} 30790b9f850f0e9dc624b9e0c5254393112ecc7f8bc9ricow@chromium.org 30800b9f850f0e9dc624b9e0c5254393112ecc7f8bc9ricow@chromium.org 30819a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Test the stepping mechanism with different ICs. 30829a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(DebugStepLinearMixedICs) { 30839a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com DebugLocalContext env; 30842bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 30859a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 30862356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org // Register a debug event listener which steps and counts. 3087662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(DebugEventStep); 30882356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org 30899a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Create a function for testing stepping. 30909a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::Local<v8::Function> foo = CompileFunction(&env, 30919a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "function bar() {};" 30929a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "function foo() {" 30939a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com " var x;" 30949a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com " var index='name';" 30959a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com " var y = {};" 30969a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com " a=1;b=2;x=a;y[index]=3;x=y[index];bar();}", "foo"); 3097a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 3098a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Run functions to allow them to get optimized. 3099a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org CompileRun("a=0; b=0; bar(); foo();"); 3100a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 31019a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com SetBreakPoint(foo, 0); 31029a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 31039a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com step_action = StepIn; 31049a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_hit_count = 0; 31059a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com foo->Call(env->Global(), 0, NULL); 31069a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 31074af710e493dc8583f3b7b7ce65127ad4e7c3f8a1ager@chromium.org // With stepping all break locations are hit. 31082356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org CHECK_EQ(11, break_point_hit_count); 31099a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 3110662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(NULL); 3111381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org CheckDebuggerUnloaded(); 31129a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 31139a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Register a debug event listener which just counts. 3114662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(DebugEventBreakPointHitCount); 31159a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 3116381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org SetBreakPoint(foo, 0); 31179a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_hit_count = 0; 31189a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com foo->Call(env->Global(), 0, NULL); 31199a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 31209a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Without stepping only active break points are hit. 31219a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(1, break_point_hit_count); 31229a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 3123662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(NULL); 3124381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org CheckDebuggerUnloaded(); 31259a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 31269a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 31279a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 31282356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.orgTEST(DebugStepDeclarations) { 31292356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org DebugLocalContext env; 31302bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 31312356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org 31322356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org // Register a debug event listener which steps and counts. 3133662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(DebugEventStep); 31342356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org 3135a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Create a function for testing stepping. Run it to allow it to get 3136a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // optimized. 31372356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org const char* src = "function foo() { " 31382356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org " var a;" 31392356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org " var b = 1;" 31402356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org " var c = foo;" 31412356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org " var d = Math.floor;" 31422356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org " var e = b + d(1.2);" 3143a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org "}" 3144a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org "foo()"; 31452356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org v8::Local<v8::Function> foo = CompileFunction(&env, src, "foo"); 3146a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 31472356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org SetBreakPoint(foo, 0); 31482356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org 31492356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org // Stepping through the declarations. 31502356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org step_action = StepIn; 31512356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org break_point_hit_count = 0; 31522356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org foo->Call(env->Global(), 0, NULL); 31532356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org CHECK_EQ(6, break_point_hit_count); 31542356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org 31552356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org // Get rid of the debug event listener. 3156662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(NULL); 31572356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org CheckDebuggerUnloaded(); 31582356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org} 31592356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org 31602356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org 31612356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.orgTEST(DebugStepLocals) { 31622356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org DebugLocalContext env; 31632bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 31642356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org 31652356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org // Register a debug event listener which steps and counts. 3166662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(DebugEventStep); 31672356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org 3168a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Create a function for testing stepping. Run it to allow it to get 3169a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // optimized. 31702356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org const char* src = "function foo() { " 31712356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org " var a,b;" 31722356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org " a = 1;" 31732356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org " b = a + 2;" 31742356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org " b = 1 + 2 + 3;" 31752356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org " a = Math.floor(b);" 3176a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org "}" 3177a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org "foo()"; 31782356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org v8::Local<v8::Function> foo = CompileFunction(&env, src, "foo"); 3179a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 31802356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org SetBreakPoint(foo, 0); 31812356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org 31822356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org // Stepping through the declarations. 31832356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org step_action = StepIn; 31842356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org break_point_hit_count = 0; 31852356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org foo->Call(env->Global(), 0, NULL); 31862356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org CHECK_EQ(6, break_point_hit_count); 31872356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org 31882356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org // Get rid of the debug event listener. 3189662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(NULL); 31902356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org CheckDebuggerUnloaded(); 31912356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org} 31922356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org 31932356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org 31949a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(DebugStepIf) { 31959a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com DebugLocalContext env; 3196cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org v8::Isolate* isolate = env->GetIsolate(); 3197cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org v8::HandleScope scope(isolate); 31989a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 31999a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Register a debug event listener which steps and counts. 3200662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(DebugEventStep); 32019a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 3202a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Create a function for testing stepping. Run it to allow it to get 3203a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // optimized. 32049a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com const int argc = 1; 32059a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com const char* src = "function foo(x) { " 32069a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com " a = 1;" 32079a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com " if (x) {" 32089a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com " b = 1;" 32099a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com " } else {" 32109a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com " c = 1;" 32119a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com " d = 1;" 32129a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com " }" 3213a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org "}" 3214a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org "a=0; b=0; c=0; d=0; foo()"; 32159a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::Local<v8::Function> foo = CompileFunction(&env, src, "foo"); 32169a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com SetBreakPoint(foo, 0); 32179a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 32189a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Stepping through the true part. 32199a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com step_action = StepIn; 32209a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_hit_count = 0; 3221cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org v8::Handle<v8::Value> argv_true[argc] = { v8::True(isolate) }; 32229a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com foo->Call(env->Global(), argc, argv_true); 32232356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org CHECK_EQ(4, break_point_hit_count); 32249a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 32259a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Stepping through the false part. 32269a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com step_action = StepIn; 32279a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_hit_count = 0; 3228cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org v8::Handle<v8::Value> argv_false[argc] = { v8::False(isolate) }; 32299a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com foo->Call(env->Global(), argc, argv_false); 32302356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org CHECK_EQ(5, break_point_hit_count); 32319a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 32329a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Get rid of the debug event listener. 3233662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(NULL); 3234381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org CheckDebuggerUnloaded(); 32359a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 32369a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 32379a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 32389a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(DebugStepSwitch) { 32399a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com DebugLocalContext env; 32402bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 32419a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 32429a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Register a debug event listener which steps and counts. 3243662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(DebugEventStep); 32449a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 3245a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Create a function for testing stepping. Run it to allow it to get 3246a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // optimized. 32479a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com const int argc = 1; 32489a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com const char* src = "function foo(x) { " 32499a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com " a = 1;" 32509a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com " switch (x) {" 32519a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com " case 1:" 32529a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com " b = 1;" 32539a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com " case 2:" 32549a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com " c = 1;" 32559a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com " break;" 32569a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com " case 3:" 32579a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com " d = 1;" 32589a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com " e = 1;" 32592356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org " f = 1;" 32609a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com " break;" 32619a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com " }" 3262a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org "}" 3263a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org "a=0; b=0; c=0; d=0; e=0; f=0; foo()"; 32649a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::Local<v8::Function> foo = CompileFunction(&env, src, "foo"); 32659a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com SetBreakPoint(foo, 0); 32669a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 32679a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // One case with fall-through. 32689a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com step_action = StepIn; 32699a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_hit_count = 0; 32709a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::Handle<v8::Value> argv_1[argc] = { v8::Number::New(1) }; 32719a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com foo->Call(env->Global(), argc, argv_1); 32722356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org CHECK_EQ(6, break_point_hit_count); 32739a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 32749a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Another case. 32759a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com step_action = StepIn; 32769a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_hit_count = 0; 32779a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::Handle<v8::Value> argv_2[argc] = { v8::Number::New(2) }; 32789a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com foo->Call(env->Global(), argc, argv_2); 32792356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org CHECK_EQ(5, break_point_hit_count); 32809a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 32819a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Last case. 32829a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com step_action = StepIn; 32839a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_hit_count = 0; 32849a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::Handle<v8::Value> argv_3[argc] = { v8::Number::New(3) }; 32859a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com foo->Call(env->Global(), argc, argv_3); 32862356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org CHECK_EQ(7, break_point_hit_count); 32872356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org 32882356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org // Get rid of the debug event listener. 3289662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(NULL); 32902356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org CheckDebuggerUnloaded(); 32912356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org} 32922356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org 32932356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org 32942356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.orgTEST(DebugStepWhile) { 32952356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org DebugLocalContext env; 32962bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 32972356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org 32982356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org // Register a debug event listener which steps and counts. 3299662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(DebugEventStep); 33002356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org 3301a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Create a function for testing stepping. Run it to allow it to get 3302a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // optimized. 33032356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org const int argc = 1; 33042356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org const char* src = "function foo(x) { " 33052356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org " var a = 0;" 33062356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org " while (a < x) {" 33072356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org " a++;" 33082356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org " }" 3309a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org "}" 3310a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org "foo()"; 33112356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org v8::Local<v8::Function> foo = CompileFunction(&env, src, "foo"); 33122356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org SetBreakPoint(foo, 8); // "var a = 0;" 33132356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org 33142356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org // Looping 10 times. 33152356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org step_action = StepIn; 33162356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org break_point_hit_count = 0; 33172356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org v8::Handle<v8::Value> argv_10[argc] = { v8::Number::New(10) }; 33182356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org foo->Call(env->Global(), argc, argv_10); 3319a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org CHECK_EQ(22, break_point_hit_count); 33202356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org 33212356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org // Looping 100 times. 33222356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org step_action = StepIn; 33232356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org break_point_hit_count = 0; 33242356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org v8::Handle<v8::Value> argv_100[argc] = { v8::Number::New(100) }; 33252356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org foo->Call(env->Global(), argc, argv_100); 3326a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org CHECK_EQ(202, break_point_hit_count); 33272356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org 33282356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org // Get rid of the debug event listener. 3329662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(NULL); 33302356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org CheckDebuggerUnloaded(); 33312356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org} 33322356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org 33332356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org 33342356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.orgTEST(DebugStepDoWhile) { 33352356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org DebugLocalContext env; 33362bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 33372356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org 33382356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org // Register a debug event listener which steps and counts. 3339662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(DebugEventStep); 33402356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org 3341a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Create a function for testing stepping. Run it to allow it to get 3342a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // optimized. 33432356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org const int argc = 1; 33442356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org const char* src = "function foo(x) { " 33452356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org " var a = 0;" 33462356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org " do {" 33472356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org " a++;" 33482356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org " } while (a < x)" 3349a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org "}" 3350a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org "foo()"; 33512356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org v8::Local<v8::Function> foo = CompileFunction(&env, src, "foo"); 33522356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org SetBreakPoint(foo, 8); // "var a = 0;" 33532356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org 33542356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org // Looping 10 times. 33552356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org step_action = StepIn; 33562356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org break_point_hit_count = 0; 33572356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org v8::Handle<v8::Value> argv_10[argc] = { v8::Number::New(10) }; 33582356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org foo->Call(env->Global(), argc, argv_10); 33592356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org CHECK_EQ(22, break_point_hit_count); 33602356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org 33612356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org // Looping 100 times. 33622356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org step_action = StepIn; 33632356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org break_point_hit_count = 0; 33642356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org v8::Handle<v8::Value> argv_100[argc] = { v8::Number::New(100) }; 33652356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org foo->Call(env->Global(), argc, argv_100); 33662356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org CHECK_EQ(202, break_point_hit_count); 33679a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 33689a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Get rid of the debug event listener. 3369662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(NULL); 3370381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org CheckDebuggerUnloaded(); 33719a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 33729a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 33739a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 33749a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(DebugStepFor) { 33759a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com DebugLocalContext env; 33762bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 33779a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 33789a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Register a debug event listener which steps and counts. 3379662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(DebugEventStep); 33809a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 3381a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Create a function for testing stepping. Run it to allow it to get 3382a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // optimized. 33839a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com const int argc = 1; 33849a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com const char* src = "function foo(x) { " 33859a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com " a = 1;" 33869a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com " for (i = 0; i < x; i++) {" 33879a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com " b = 1;" 33889a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com " }" 3389a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org "}" 3390a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org "a=0; b=0; i=0; foo()"; 33919a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::Local<v8::Function> foo = CompileFunction(&env, src, "foo"); 3392a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 33939a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com SetBreakPoint(foo, 8); // "a = 1;" 33949a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 33959a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Looping 10 times. 33969a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com step_action = StepIn; 33979a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_hit_count = 0; 33989a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::Handle<v8::Value> argv_10[argc] = { v8::Number::New(10) }; 33999a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com foo->Call(env->Global(), argc, argv_10); 34009a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(23, break_point_hit_count); 34019a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 34029a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Looping 100 times. 34039a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com step_action = StepIn; 34049a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_hit_count = 0; 34059a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::Handle<v8::Value> argv_100[argc] = { v8::Number::New(100) }; 34069a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com foo->Call(env->Global(), argc, argv_100); 34079a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(203, break_point_hit_count); 34089a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 34099a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Get rid of the debug event listener. 3410662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(NULL); 3411381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org CheckDebuggerUnloaded(); 34129a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 34139a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 34149a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 34152356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.orgTEST(DebugStepForContinue) { 34162356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org DebugLocalContext env; 34172bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 34182356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org 34192356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org // Register a debug event listener which steps and counts. 3420662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(DebugEventStep); 34212356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org 3422a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Create a function for testing stepping. Run it to allow it to get 3423a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // optimized. 34242356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org const int argc = 1; 34252356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org const char* src = "function foo(x) { " 34262356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org " var a = 0;" 34272356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org " var b = 0;" 34282356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org " var c = 0;" 34292356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org " for (var i = 0; i < x; i++) {" 34302356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org " a++;" 34312356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org " if (a % 2 == 0) continue;" 34322356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org " b++;" 34332356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org " c++;" 34342356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org " }" 34352356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org " return b;" 3436a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org "}" 3437a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org "foo()"; 34382356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org v8::Local<v8::Function> foo = CompileFunction(&env, src, "foo"); 34392356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org v8::Handle<v8::Value> result; 34402356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org SetBreakPoint(foo, 8); // "var a = 0;" 34412356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org 34422356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org // Each loop generates 4 or 5 steps depending on whether a is equal. 34432356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org 34442356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org // Looping 10 times. 34452356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org step_action = StepIn; 34462356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org break_point_hit_count = 0; 34472356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org v8::Handle<v8::Value> argv_10[argc] = { v8::Number::New(10) }; 34482356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org result = foo->Call(env->Global(), argc, argv_10); 34492356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org CHECK_EQ(5, result->Int32Value()); 3450a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org CHECK_EQ(52, break_point_hit_count); 34512356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org 34522356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org // Looping 100 times. 34532356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org step_action = StepIn; 34542356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org break_point_hit_count = 0; 34552356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org v8::Handle<v8::Value> argv_100[argc] = { v8::Number::New(100) }; 34562356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org result = foo->Call(env->Global(), argc, argv_100); 34572356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org CHECK_EQ(50, result->Int32Value()); 3458a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org CHECK_EQ(457, break_point_hit_count); 34592356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org 34602356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org // Get rid of the debug event listener. 3461662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(NULL); 34622356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org CheckDebuggerUnloaded(); 34632356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org} 34642356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org 34652356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org 34662356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.orgTEST(DebugStepForBreak) { 34672356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org DebugLocalContext env; 34682bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 34692356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org 34702356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org // Register a debug event listener which steps and counts. 3471662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(DebugEventStep); 34722356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org 3473a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Create a function for testing stepping. Run it to allow it to get 3474a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // optimized. 34752356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org const int argc = 1; 34762356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org const char* src = "function foo(x) { " 34772356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org " var a = 0;" 34782356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org " var b = 0;" 34792356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org " var c = 0;" 34802356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org " for (var i = 0; i < 1000; i++) {" 34812356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org " a++;" 34822356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org " if (a == x) break;" 34832356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org " b++;" 34842356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org " c++;" 34852356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org " }" 34862356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org " return b;" 3487a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org "}" 3488a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org "foo()"; 34892356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org v8::Local<v8::Function> foo = CompileFunction(&env, src, "foo"); 34902356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org v8::Handle<v8::Value> result; 34912356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org SetBreakPoint(foo, 8); // "var a = 0;" 34922356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org 34932356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org // Each loop generates 5 steps except for the last (when break is executed) 34942356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org // which only generates 4. 34952356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org 34962356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org // Looping 10 times. 34972356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org step_action = StepIn; 34982356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org break_point_hit_count = 0; 34992356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org v8::Handle<v8::Value> argv_10[argc] = { v8::Number::New(10) }; 35002356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org result = foo->Call(env->Global(), argc, argv_10); 35012356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org CHECK_EQ(9, result->Int32Value()); 3502a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org CHECK_EQ(55, break_point_hit_count); 35032356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org 35042356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org // Looping 100 times. 35052356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org step_action = StepIn; 35062356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org break_point_hit_count = 0; 35072356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org v8::Handle<v8::Value> argv_100[argc] = { v8::Number::New(100) }; 35082356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org result = foo->Call(env->Global(), argc, argv_100); 35092356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org CHECK_EQ(99, result->Int32Value()); 3510a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org CHECK_EQ(505, break_point_hit_count); 35112356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org 35122356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org // Get rid of the debug event listener. 3513662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(NULL); 35142356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org CheckDebuggerUnloaded(); 35152356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org} 35162356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org 35172356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org 35182356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.orgTEST(DebugStepForIn) { 35192356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org DebugLocalContext env; 35202bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 35212356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org 35222356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org // Register a debug event listener which steps and counts. 3523662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(DebugEventStep); 35242356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org 3525a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Create a function for testing stepping. Run it to allow it to get 3526a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // optimized. 35272356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org v8::Local<v8::Function> foo; 35282356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org const char* src_1 = "function foo() { " 35292356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org " var a = [1, 2];" 35302356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org " for (x in a) {" 35312356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org " b = 0;" 35322356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org " }" 3533a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org "}" 3534a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org "foo()"; 35352356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org foo = CompileFunction(&env, src_1, "foo"); 35362356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org SetBreakPoint(foo, 0); // "var a = ..." 35372356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org 35382356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org step_action = StepIn; 35392356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org break_point_hit_count = 0; 35402356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org foo->Call(env->Global(), 0, NULL); 35412356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org CHECK_EQ(6, break_point_hit_count); 35422356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org 3543a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Create a function for testing stepping. Run it to allow it to get 3544a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // optimized. 35452356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org const char* src_2 = "function foo() { " 35462356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org " var a = {a:[1, 2, 3]};" 35472356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org " for (x in a.a) {" 35482356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org " b = 0;" 35492356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org " }" 3550a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org "}" 3551a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org "foo()"; 35522356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org foo = CompileFunction(&env, src_2, "foo"); 35532356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org SetBreakPoint(foo, 0); // "var a = ..." 35542356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org 35552356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org step_action = StepIn; 35562356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org break_point_hit_count = 0; 35572356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org foo->Call(env->Global(), 0, NULL); 35582356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org CHECK_EQ(8, break_point_hit_count); 35592356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org 35602356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org // Get rid of the debug event listener. 3561662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(NULL); 35622356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org CheckDebuggerUnloaded(); 35632356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org} 35642356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org 35652356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org 35662356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.orgTEST(DebugStepWith) { 35672356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org DebugLocalContext env; 35682bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 35692356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org 35702356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org // Register a debug event listener which steps and counts. 3571662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(DebugEventStep); 35722356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org 3573a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Create a function for testing stepping. Run it to allow it to get 3574a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // optimized. 35752356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org const char* src = "function foo(x) { " 35762356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org " var a = {};" 35772356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org " with (a) {}" 35782356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org " with (b) {}" 3579a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org "}" 3580a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org "foo()"; 3581f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org env->Global()->Set(v8::String::NewFromUtf8(env->GetIsolate(), "b"), 3582f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Object::New()); 35832356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org v8::Local<v8::Function> foo = CompileFunction(&env, src, "foo"); 35842356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org v8::Handle<v8::Value> result; 35852356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org SetBreakPoint(foo, 8); // "var a = {};" 35862356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org 35872356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org step_action = StepIn; 35882356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org break_point_hit_count = 0; 35892356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org foo->Call(env->Global(), 0, NULL); 35902356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org CHECK_EQ(4, break_point_hit_count); 35912356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org 35922356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org // Get rid of the debug event listener. 3593662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(NULL); 35942356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org CheckDebuggerUnloaded(); 35952356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org} 35962356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org 35972356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org 35982356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.orgTEST(DebugConditional) { 35992356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org DebugLocalContext env; 3600cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org v8::Isolate* isolate = env->GetIsolate(); 3601cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org v8::HandleScope scope(isolate); 36022356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org 36032356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org // Register a debug event listener which steps and counts. 3604662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(DebugEventStep); 36052356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org 3606a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Create a function for testing stepping. Run it to allow it to get 3607a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // optimized. 36082356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org const char* src = "function foo(x) { " 36092356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org " var a;" 36102356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org " a = x ? 1 : 2;" 36112356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org " return a;" 3612a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org "}" 3613a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org "foo()"; 36142356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org v8::Local<v8::Function> foo = CompileFunction(&env, src, "foo"); 36152356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org SetBreakPoint(foo, 0); // "var a;" 36162356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org 36172356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org step_action = StepIn; 36182356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org break_point_hit_count = 0; 36192356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org foo->Call(env->Global(), 0, NULL); 36202356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org CHECK_EQ(5, break_point_hit_count); 36212356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org 36222356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org step_action = StepIn; 36232356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org break_point_hit_count = 0; 36242356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org const int argc = 1; 3625cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org v8::Handle<v8::Value> argv_true[argc] = { v8::True(isolate) }; 36262356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org foo->Call(env->Global(), argc, argv_true); 36272356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org CHECK_EQ(5, break_point_hit_count); 36282356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org 36292356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org // Get rid of the debug event listener. 3630662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(NULL); 36312356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org CheckDebuggerUnloaded(); 36322356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org} 36332356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org 36342356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org 36359a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(StepInOutSimple) { 36369a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com DebugLocalContext env; 36372bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 36389a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 36399a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Create a function for checking the function when hitting a break point. 36409a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com frame_function_name = CompileFunction(&env, 36419a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com frame_function_name_source, 36429a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "frame_function_name"); 36439a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 36449a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Register a debug event listener which steps and counts. 3645662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(DebugEventStepSequence); 36469a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 3647a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Create a function for testing stepping. Run it to allow it to get 3648a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // optimized. 36499a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com const char* src = "function a() {b();c();}; " 36509a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "function b() {c();}; " 3651a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org "function c() {}; " 3652a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org "a(); b(); c()"; 36539a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::Local<v8::Function> a = CompileFunction(&env, src, "a"); 36549a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com SetBreakPoint(a, 0); 36559a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 36569a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Step through invocation of a with step in. 36579a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com step_action = StepIn; 36589a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_hit_count = 0; 36599a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com expected_step_sequence = "abcbaca"; 36609a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com a->Call(env->Global(), 0, NULL); 3661c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org CHECK_EQ(StrLength(expected_step_sequence), 3662c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org break_point_hit_count); 36639a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 36649a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Step through invocation of a with step next. 36659a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com step_action = StepNext; 36669a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_hit_count = 0; 36679a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com expected_step_sequence = "aaa"; 36689a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com a->Call(env->Global(), 0, NULL); 3669c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org CHECK_EQ(StrLength(expected_step_sequence), 3670c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org break_point_hit_count); 36719a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 36729a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Step through invocation of a with step out. 36739a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com step_action = StepOut; 36749a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_hit_count = 0; 36759a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com expected_step_sequence = "a"; 36769a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com a->Call(env->Global(), 0, NULL); 3677c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org CHECK_EQ(StrLength(expected_step_sequence), 3678c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org break_point_hit_count); 36799a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 36809a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Get rid of the debug event listener. 3681662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(NULL); 3682381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org CheckDebuggerUnloaded(); 36839a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 36849a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 36859a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 36869a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(StepInOutTree) { 36879a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com DebugLocalContext env; 36882bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 36899a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 36909a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Create a function for checking the function when hitting a break point. 36919a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com frame_function_name = CompileFunction(&env, 36929a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com frame_function_name_source, 36939a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "frame_function_name"); 36949a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 36959a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Register a debug event listener which steps and counts. 3696662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(DebugEventStepSequence); 36979a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 3698a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Create a function for testing stepping. Run it to allow it to get 3699a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // optimized. 37009a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com const char* src = "function a() {b(c(d()),d());c(d());d()}; " 37019a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "function b(x,y) {c();}; " 37029a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "function c(x) {}; " 3703a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org "function d() {}; " 3704a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org "a(); b(); c(); d()"; 37059a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::Local<v8::Function> a = CompileFunction(&env, src, "a"); 37069a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com SetBreakPoint(a, 0); 37079a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 37089a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Step through invocation of a with step in. 37099a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com step_action = StepIn; 37109a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_hit_count = 0; 37119a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com expected_step_sequence = "adacadabcbadacada"; 37129a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com a->Call(env->Global(), 0, NULL); 3713c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org CHECK_EQ(StrLength(expected_step_sequence), 3714c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org break_point_hit_count); 37159a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 37169a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Step through invocation of a with step next. 37179a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com step_action = StepNext; 37189a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_hit_count = 0; 37199a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com expected_step_sequence = "aaaa"; 37209a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com a->Call(env->Global(), 0, NULL); 3721c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org CHECK_EQ(StrLength(expected_step_sequence), 3722c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org break_point_hit_count); 37239a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 37249a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Step through invocation of a with step out. 37259a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com step_action = StepOut; 37269a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_hit_count = 0; 37279a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com expected_step_sequence = "a"; 37289a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com a->Call(env->Global(), 0, NULL); 3729c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org CHECK_EQ(StrLength(expected_step_sequence), 3730c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org break_point_hit_count); 37319a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 37329a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Get rid of the debug event listener. 3733662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(NULL); 3734381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org CheckDebuggerUnloaded(true); 37359a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 37369a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 37379a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 37389a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(StepInOutBranch) { 37399a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com DebugLocalContext env; 37402bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 37419a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 37429a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Create a function for checking the function when hitting a break point. 37439a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com frame_function_name = CompileFunction(&env, 37449a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com frame_function_name_source, 37459a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "frame_function_name"); 37469a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 37479a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Register a debug event listener which steps and counts. 3748662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(DebugEventStepSequence); 37499a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 3750a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Create a function for testing stepping. Run it to allow it to get 3751a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // optimized. 37529a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com const char* src = "function a() {b(false);c();}; " 37539a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "function b(x) {if(x){c();};}; " 3754a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org "function c() {}; " 3755a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org "a(); b(); c()"; 37569a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::Local<v8::Function> a = CompileFunction(&env, src, "a"); 37579a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com SetBreakPoint(a, 0); 37589a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 37599a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Step through invocation of a. 37609a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com step_action = StepIn; 37619a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_hit_count = 0; 37622356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org expected_step_sequence = "abbaca"; 37639a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com a->Call(env->Global(), 0, NULL); 3764c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org CHECK_EQ(StrLength(expected_step_sequence), 3765c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org break_point_hit_count); 37669a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 37679a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Get rid of the debug event listener. 3768662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(NULL); 3769381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org CheckDebuggerUnloaded(); 37709a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 37719a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 37729a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 37739a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Test that step in does not step into native functions. 37749a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(DebugStepNatives) { 37759a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com DebugLocalContext env; 37762bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 37779a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 37789a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Create a function for testing stepping. 37799a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::Local<v8::Function> foo = CompileFunction( 37809a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com &env, 37819a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "function foo(){debugger;Math.sin(1);}", 37829a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "foo"); 37839a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 37849a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Register a debug event listener which steps and counts. 3785662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(DebugEventStep); 37869a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 37879a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com step_action = StepIn; 37889a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_hit_count = 0; 37899a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com foo->Call(env->Global(), 0, NULL); 37909a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 37919a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // With stepping all break locations are hit. 37929a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(3, break_point_hit_count); 37939a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 3794662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(NULL); 3795381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org CheckDebuggerUnloaded(); 37969a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 37979a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Register a debug event listener which just counts. 3798662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(DebugEventBreakPointHitCount); 37999a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 38009a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_hit_count = 0; 38019a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com foo->Call(env->Global(), 0, NULL); 38029a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 38039a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Without stepping only active break points are hit. 38049a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(1, break_point_hit_count); 38059a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 3806662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(NULL); 3807381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org CheckDebuggerUnloaded(); 38089a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 38099a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 38109a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 3811acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org// Test that step in works with function.apply. 3812acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.orgTEST(DebugStepFunctionApply) { 3813acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org DebugLocalContext env; 38142bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 3815acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org 3816acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org // Create a function for testing stepping. 3817acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org v8::Local<v8::Function> foo = CompileFunction( 3818acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org &env, 3819acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org "function bar(x, y, z) { if (x == 1) { a = y; b = z; } }" 3820acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org "function foo(){ debugger; bar.apply(this, [1,2,3]); }", 3821acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org "foo"); 3822acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org 3823acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org // Register a debug event listener which steps and counts. 3824662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(DebugEventStep); 3825acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org 3826acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org step_action = StepIn; 3827acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org break_point_hit_count = 0; 3828acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org foo->Call(env->Global(), 0, NULL); 3829acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org 3830acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org // With stepping all break locations are hit. 38312356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org CHECK_EQ(7, break_point_hit_count); 3832acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org 3833662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(NULL); 3834acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org CheckDebuggerUnloaded(); 3835acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org 3836acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org // Register a debug event listener which just counts. 3837662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(DebugEventBreakPointHitCount); 3838acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org 3839acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org break_point_hit_count = 0; 3840acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org foo->Call(env->Global(), 0, NULL); 3841acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org 3842acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org // Without stepping only the debugger statement is hit. 3843acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org CHECK_EQ(1, break_point_hit_count); 3844acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org 3845662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(NULL); 3846acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org CheckDebuggerUnloaded(); 3847acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org} 3848acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org 3849acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org 3850acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org// Test that step in works with function.call. 3851acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.orgTEST(DebugStepFunctionCall) { 3852acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org DebugLocalContext env; 3853cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org v8::Isolate* isolate = env->GetIsolate(); 3854cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org v8::HandleScope scope(isolate); 3855acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org 3856acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org // Create a function for testing stepping. 3857acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org v8::Local<v8::Function> foo = CompileFunction( 3858acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org &env, 3859acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org "function bar(x, y, z) { if (x == 1) { a = y; b = z; } }" 3860acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org "function foo(a){ debugger;" 3861acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org " if (a) {" 3862acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org " bar.call(this, 1, 2, 3);" 3863acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org " } else {" 3864acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org " bar.call(this, 0);" 3865acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org " }" 3866acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org "}", 3867acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org "foo"); 3868acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org 3869acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org // Register a debug event listener which steps and counts. 3870662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(DebugEventStep); 3871acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org step_action = StepIn; 3872acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org 3873acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org // Check stepping where the if condition in bar is false. 3874acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org break_point_hit_count = 0; 3875acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org foo->Call(env->Global(), 0, NULL); 38762356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org CHECK_EQ(6, break_point_hit_count); 3877acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org 3878acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org // Check stepping where the if condition in bar is true. 3879acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org break_point_hit_count = 0; 3880acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org const int argc = 1; 3881cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org v8::Handle<v8::Value> argv[argc] = { v8::True(isolate) }; 3882acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org foo->Call(env->Global(), argc, argv); 38832356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org CHECK_EQ(8, break_point_hit_count); 3884acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org 3885662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(NULL); 3886acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org CheckDebuggerUnloaded(); 3887acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org 3888acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org // Register a debug event listener which just counts. 3889662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(DebugEventBreakPointHitCount); 3890acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org 3891acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org break_point_hit_count = 0; 3892acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org foo->Call(env->Global(), 0, NULL); 3893acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org 3894acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org // Without stepping only the debugger statement is hit. 3895acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org CHECK_EQ(1, break_point_hit_count); 3896acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org 3897662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(NULL); 3898acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org CheckDebuggerUnloaded(); 3899acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org} 3900acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org 3901acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org 3902c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org// Tests that breakpoint will be hit if it's set in script. 3903c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.orgTEST(PauseInScript) { 3904c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org DebugLocalContext env; 39052bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 3906c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org env.ExposeDebug(); 3907c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org 3908c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org // Register a debug event listener which counts. 3909662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(DebugEventCounter); 3910c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org 3911c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org // Create a script that returns a function. 3912c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org const char* src = "(function (evt) {})"; 3913c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org const char* script_name = "StepInHandlerTest"; 3914c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org 3915c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org // Set breakpoint in the script. 3916f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org SetScriptBreakPointByNameFromJS(env->GetIsolate(), script_name, 0, -1); 3917c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org break_point_hit_count = 0; 3918c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org 3919f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::ScriptOrigin origin( 3920f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::String::NewFromUtf8(env->GetIsolate(), script_name), 3921f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Integer::New(0)); 3922f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Handle<v8::Script> script = v8::Script::Compile( 3923f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::String::NewFromUtf8(env->GetIsolate(), src), &origin); 3924c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org v8::Local<v8::Value> r = script->Run(); 3925c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org 3926c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org CHECK(r->IsFunction()); 3927c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org CHECK_EQ(1, break_point_hit_count); 3928c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org 3929c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org // Get rid of the debug event listener. 3930662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(NULL); 3931c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org CheckDebuggerUnloaded(); 3932c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org} 3933c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org 3934c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org 39359a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Test break on exceptions. For each exception break combination the number 39369a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// of debug event exception callbacks and message callbacks are collected. The 39378bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org// number of debug event exception callbacks are used to check that the 39389a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// debugger is called correctly and the number of message callbacks is used to 39399a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// check that uncaught exceptions are still returned even if there is a break 39409a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// for them. 39419a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(BreakOnException) { 39429a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com DebugLocalContext env; 39432bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 39449a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com env.ExposeDebug(); 39459a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 39469a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Create functions for testing break on exception. 3947659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org CompileFunction(&env, "function throws(){throw 1;}", "throws"); 39489a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::Local<v8::Function> caught = 39499a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CompileFunction(&env, 39509a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "function caught(){try {throws();} catch(e) {};}", 39519a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "caught"); 39529a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::Local<v8::Function> notCaught = 39539a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CompileFunction(&env, "function notCaught(){throws();}", "notCaught"); 39549a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 39559a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::V8::AddMessageListener(MessageCallbackCount); 3956662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(DebugEventCounter); 39579a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 3958d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org // Initial state should be no break on exceptions. 39599a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com DebugEventCounterClear(); 39609a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com MessageCallbackCountClear(); 39619a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com caught->Call(env->Global(), 0, NULL); 39629a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(0, exception_hit_count); 39639a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(0, uncaught_exception_hit_count); 39649a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(0, message_callback_count); 39659a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com notCaught->Call(env->Global(), 0, NULL); 3966d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org CHECK_EQ(0, exception_hit_count); 3967d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org CHECK_EQ(0, uncaught_exception_hit_count); 39689a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(1, message_callback_count); 39699a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 39709a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // No break on exception 39719a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com DebugEventCounterClear(); 39729a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com MessageCallbackCountClear(); 39739a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com ChangeBreakOnException(false, false); 39749a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com caught->Call(env->Global(), 0, NULL); 39759a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(0, exception_hit_count); 39769a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(0, uncaught_exception_hit_count); 39779a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(0, message_callback_count); 39789a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com notCaught->Call(env->Global(), 0, NULL); 39799a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(0, exception_hit_count); 39809a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(0, uncaught_exception_hit_count); 39819a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(1, message_callback_count); 39829a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 39839a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Break on uncaught exception 39849a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com DebugEventCounterClear(); 39859a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com MessageCallbackCountClear(); 39869a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com ChangeBreakOnException(false, true); 39879a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com caught->Call(env->Global(), 0, NULL); 39889a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(0, exception_hit_count); 39899a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(0, uncaught_exception_hit_count); 39909a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(0, message_callback_count); 39919a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com notCaught->Call(env->Global(), 0, NULL); 39929a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(1, exception_hit_count); 39939a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(1, uncaught_exception_hit_count); 39949a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(1, message_callback_count); 39959a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 39969a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Break on exception and uncaught exception 39979a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com DebugEventCounterClear(); 39989a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com MessageCallbackCountClear(); 39999a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com ChangeBreakOnException(true, true); 40009a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com caught->Call(env->Global(), 0, NULL); 40019a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(1, exception_hit_count); 40029a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(0, uncaught_exception_hit_count); 40039a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(0, message_callback_count); 40049a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com notCaught->Call(env->Global(), 0, NULL); 40059a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(2, exception_hit_count); 40069a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(1, uncaught_exception_hit_count); 40079a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(1, message_callback_count); 40089a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 40099a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Break on exception 40109a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com DebugEventCounterClear(); 40119a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com MessageCallbackCountClear(); 40129a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com ChangeBreakOnException(true, false); 40139a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com caught->Call(env->Global(), 0, NULL); 40149a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(1, exception_hit_count); 40159a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(0, uncaught_exception_hit_count); 40169a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(0, message_callback_count); 40179a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com notCaught->Call(env->Global(), 0, NULL); 40189a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(2, exception_hit_count); 40199a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(1, uncaught_exception_hit_count); 40209a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(1, message_callback_count); 40219a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 40229a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // No break on exception using JavaScript 40239a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com DebugEventCounterClear(); 40249a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com MessageCallbackCountClear(); 4025f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org ChangeBreakOnExceptionFromJS(env->GetIsolate(), false, false); 40269a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com caught->Call(env->Global(), 0, NULL); 40279a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(0, exception_hit_count); 40289a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(0, uncaught_exception_hit_count); 40299a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(0, message_callback_count); 40309a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com notCaught->Call(env->Global(), 0, NULL); 40319a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(0, exception_hit_count); 40329a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(0, uncaught_exception_hit_count); 40339a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(1, message_callback_count); 40349a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 40359a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Break on uncaught exception using JavaScript 40369a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com DebugEventCounterClear(); 40379a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com MessageCallbackCountClear(); 4038f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org ChangeBreakOnExceptionFromJS(env->GetIsolate(), false, true); 40399a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com caught->Call(env->Global(), 0, NULL); 40409a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(0, exception_hit_count); 40419a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(0, uncaught_exception_hit_count); 40429a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(0, message_callback_count); 40439a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com notCaught->Call(env->Global(), 0, NULL); 40449a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(1, exception_hit_count); 40459a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(1, uncaught_exception_hit_count); 40469a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(1, message_callback_count); 40479a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 40489a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Break on exception and uncaught exception using JavaScript 40499a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com DebugEventCounterClear(); 40509a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com MessageCallbackCountClear(); 4051f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org ChangeBreakOnExceptionFromJS(env->GetIsolate(), true, true); 40529a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com caught->Call(env->Global(), 0, NULL); 40539a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(1, exception_hit_count); 40549a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(0, message_callback_count); 40559a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(0, uncaught_exception_hit_count); 40569a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com notCaught->Call(env->Global(), 0, NULL); 40579a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(2, exception_hit_count); 40589a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(1, uncaught_exception_hit_count); 40599a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(1, message_callback_count); 40609a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 40619a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Break on exception using JavaScript 40629a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com DebugEventCounterClear(); 40639a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com MessageCallbackCountClear(); 4064f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org ChangeBreakOnExceptionFromJS(env->GetIsolate(), true, false); 40659a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com caught->Call(env->Global(), 0, NULL); 40669a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(1, exception_hit_count); 40679a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(0, uncaught_exception_hit_count); 40689a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(0, message_callback_count); 40699a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com notCaught->Call(env->Global(), 0, NULL); 40709a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(2, exception_hit_count); 40719a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(1, uncaught_exception_hit_count); 40729a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(1, message_callback_count); 40739a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 4074662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(NULL); 4075381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org CheckDebuggerUnloaded(); 40769a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::V8::RemoveMessageListeners(MessageCallbackCount); 40779a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 40789a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 40799a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 40808bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org// Test break on exception from compiler errors. When compiling using 40818bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org// v8::Script::Compile there is no JavaScript stack whereas when compiling using 40828bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org// eval there are JavaScript frames. 40838bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.orgTEST(BreakOnCompileException) { 40848bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org DebugLocalContext env; 40852bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 40868bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org 4087d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org // For this test, we want to break on uncaught exceptions: 4088d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org ChangeBreakOnException(false, true); 4089d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org 40908bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org // Create a function for checking the function when hitting a break point. 40918bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org frame_count = CompileFunction(&env, frame_count_source, "frame_count"); 40928bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org 40938bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org v8::V8::AddMessageListener(MessageCallbackCount); 4094662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(DebugEventCounter); 40958bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org 40968bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org DebugEventCounterClear(); 40978bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org MessageCallbackCountClear(); 40988bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org 40998bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org // Check initial state. 41008bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org CHECK_EQ(0, exception_hit_count); 41018bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org CHECK_EQ(0, uncaught_exception_hit_count); 41028bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org CHECK_EQ(0, message_callback_count); 41038bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org CHECK_EQ(-1, last_js_stack_height); 41048bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org 41058bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org // Throws SyntaxError: Unexpected end of input 4106f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Script::Compile(v8::String::NewFromUtf8(env->GetIsolate(), "+++")); 41078bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org CHECK_EQ(1, exception_hit_count); 41088bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org CHECK_EQ(1, uncaught_exception_hit_count); 41098bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org CHECK_EQ(1, message_callback_count); 41108bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org CHECK_EQ(0, last_js_stack_height); // No JavaScript stack. 41118bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org 41128bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org // Throws SyntaxError: Unexpected identifier 4113f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Script::Compile(v8::String::NewFromUtf8(env->GetIsolate(), "x x")); 41148bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org CHECK_EQ(2, exception_hit_count); 41158bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org CHECK_EQ(2, uncaught_exception_hit_count); 41168bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org CHECK_EQ(2, message_callback_count); 41178bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org CHECK_EQ(0, last_js_stack_height); // No JavaScript stack. 41188bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org 41198bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org // Throws SyntaxError: Unexpected end of input 4120f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Script::Compile(v8::String::NewFromUtf8(env->GetIsolate(), "eval('+++')")) 4121f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org ->Run(); 41228bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org CHECK_EQ(3, exception_hit_count); 41238bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org CHECK_EQ(3, uncaught_exception_hit_count); 41248bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org CHECK_EQ(3, message_callback_count); 41258bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org CHECK_EQ(1, last_js_stack_height); 41268bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org 41278bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org // Throws SyntaxError: Unexpected identifier 4128f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Script::Compile(v8::String::NewFromUtf8(env->GetIsolate(), "eval('x x')")) 4129f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org ->Run(); 41308bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org CHECK_EQ(4, exception_hit_count); 41318bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org CHECK_EQ(4, uncaught_exception_hit_count); 41328bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org CHECK_EQ(4, message_callback_count); 41338bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org CHECK_EQ(1, last_js_stack_height); 41348bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org} 41358bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org 41368bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org 41379a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(StepWithException) { 41389a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com DebugLocalContext env; 41392bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 41409a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 4141d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org // For this test, we want to break on uncaught exceptions: 4142d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org ChangeBreakOnException(false, true); 4143d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org 41449a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Create a function for checking the function when hitting a break point. 41459a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com frame_function_name = CompileFunction(&env, 41469a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com frame_function_name_source, 41479a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "frame_function_name"); 41489a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 41499a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Register a debug event listener which steps and counts. 4150662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(DebugEventStepSequence); 41519a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 41529a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Create functions for testing stepping. 41539a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com const char* src = "function a() { n(); }; " 41549a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "function b() { c(); }; " 41559a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "function c() { n(); }; " 41569a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "function d() { x = 1; try { e(); } catch(x) { x = 2; } }; " 41579a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "function e() { n(); }; " 41589a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "function f() { x = 1; try { g(); } catch(x) { x = 2; } }; " 41599a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "function g() { h(); }; " 41609a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "function h() { x = 1; throw 1; }; "; 41619a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 41629a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Step through invocation of a. 41639a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::Local<v8::Function> a = CompileFunction(&env, src, "a"); 41649a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com SetBreakPoint(a, 0); 41659a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com step_action = StepIn; 41669a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_hit_count = 0; 41679a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com expected_step_sequence = "aa"; 41689a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com a->Call(env->Global(), 0, NULL); 4169c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org CHECK_EQ(StrLength(expected_step_sequence), 4170c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org break_point_hit_count); 41719a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 41729a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Step through invocation of b + c. 41739a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::Local<v8::Function> b = CompileFunction(&env, src, "b"); 41749a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com SetBreakPoint(b, 0); 41759a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com step_action = StepIn; 41769a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_hit_count = 0; 41779a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com expected_step_sequence = "bcc"; 41789a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com b->Call(env->Global(), 0, NULL); 4179c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org CHECK_EQ(StrLength(expected_step_sequence), 4180c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org break_point_hit_count); 41819a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Step through invocation of d + e. 41829a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::Local<v8::Function> d = CompileFunction(&env, src, "d"); 41839a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com SetBreakPoint(d, 0); 41849a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com ChangeBreakOnException(false, true); 41859a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com step_action = StepIn; 41869a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_hit_count = 0; 41872356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org expected_step_sequence = "ddedd"; 41889a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com d->Call(env->Global(), 0, NULL); 4189c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org CHECK_EQ(StrLength(expected_step_sequence), 4190c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org break_point_hit_count); 41919a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 41929a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Step through invocation of d + e now with break on caught exceptions. 41939a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com ChangeBreakOnException(true, true); 41949a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com step_action = StepIn; 41959a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_hit_count = 0; 41962356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org expected_step_sequence = "ddeedd"; 41979a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com d->Call(env->Global(), 0, NULL); 4198c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org CHECK_EQ(StrLength(expected_step_sequence), 4199c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org break_point_hit_count); 42009a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 42019a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Step through invocation of f + g + h. 42029a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::Local<v8::Function> f = CompileFunction(&env, src, "f"); 42039a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com SetBreakPoint(f, 0); 42049a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com ChangeBreakOnException(false, true); 42059a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com step_action = StepIn; 42069a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_hit_count = 0; 42072356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org expected_step_sequence = "ffghhff"; 42089a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com f->Call(env->Global(), 0, NULL); 4209c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org CHECK_EQ(StrLength(expected_step_sequence), 4210c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org break_point_hit_count); 42119a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 42129a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Step through invocation of f + g + h now with break on caught exceptions. 42139a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com ChangeBreakOnException(true, true); 42149a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com step_action = StepIn; 42159a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_hit_count = 0; 42162356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org expected_step_sequence = "ffghhhff"; 42179a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com f->Call(env->Global(), 0, NULL); 4218c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org CHECK_EQ(StrLength(expected_step_sequence), 4219c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org break_point_hit_count); 42209a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 42219a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Get rid of the debug event listener. 4222662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(NULL); 4223381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org CheckDebuggerUnloaded(); 42249a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 42259a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 42269a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 42279a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(DebugBreak) { 42281510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org i::FLAG_stress_compaction = false; 4229c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org#ifdef VERIFY_HEAP 4230c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org i::FLAG_verify_heap = true; 4231c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org#endif 42329a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com DebugLocalContext env; 42332bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 42349a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 42359a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Register a debug event listener which sets the break flag and counts. 4236662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(DebugEventBreak); 42379a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 42389a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Create a function for testing stepping. 42399a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com const char* src = "function f0() {}" 42409a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "function f1(x1) {}" 42419a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "function f2(x1,x2) {}" 42429a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "function f3(x1,x2,x3) {}"; 42439a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::Local<v8::Function> f0 = CompileFunction(&env, src, "f0"); 42449a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::Local<v8::Function> f1 = CompileFunction(&env, src, "f1"); 42459a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::Local<v8::Function> f2 = CompileFunction(&env, src, "f2"); 42469a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::Local<v8::Function> f3 = CompileFunction(&env, src, "f3"); 42479a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 42489a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Call the function to make sure it is compiled. 42499a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::Handle<v8::Value> argv[] = { v8::Number::New(1), 42509a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::Number::New(1), 42519a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::Number::New(1), 42529a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::Number::New(1) }; 42539a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 42549a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Call all functions to make sure that they are compiled. 42559a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com f0->Call(env->Global(), 0, NULL); 42569a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com f1->Call(env->Global(), 0, NULL); 42579a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com f2->Call(env->Global(), 0, NULL); 42589a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com f3->Call(env->Global(), 0, NULL); 42599a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 42609a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Set the debug break flag. 4261528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Debug::DebugBreak(env->GetIsolate()); 42629a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 42639a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Call all functions with different argument count. 42649a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_hit_count = 0; 42659a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com for (unsigned int i = 0; i < ARRAY_SIZE(argv); i++) { 42669a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com f0->Call(env->Global(), i, argv); 42679a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com f1->Call(env->Global(), i, argv); 42689a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com f2->Call(env->Global(), i, argv); 42699a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com f3->Call(env->Global(), i, argv); 42709a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com } 42719a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 42729a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // One break for each function called. 42739a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(4 * ARRAY_SIZE(argv), break_point_hit_count); 42749a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 42759a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Get rid of the debug event listener. 4276662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(NULL); 4277381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org CheckDebuggerUnloaded(); 42789a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 42799a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 42809a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 42819a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Test to ensure that JavaScript code keeps running while the debug break 42829a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// through the stack limit flag is set but breaks are disabled. 42839a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(DisableBreak) { 42849a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com DebugLocalContext env; 42852bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 42869a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 42879a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Register a debug event listener which sets the break flag and counts. 4288662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(DebugEventCounter); 42899a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 42909a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Create a function for testing stepping. 42919a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com const char* src = "function f() {g()};function g(){i=0; while(i<10){i++}}"; 42929a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::Local<v8::Function> f = CompileFunction(&env, src, "f"); 42939a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 42949a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Set the debug break flag. 4295528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Debug::DebugBreak(env->GetIsolate()); 42969a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 42979a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Call all functions with different argument count. 42989a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com break_point_hit_count = 0; 42999a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com f->Call(env->Global(), 0, NULL); 43009a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(1, break_point_hit_count); 43019a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 43029a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com { 4303528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Debug::DebugBreak(env->GetIsolate()); 4304e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org i::Isolate* isolate = reinterpret_cast<i::Isolate*>(env->GetIsolate()); 4305e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org v8::internal::DisableBreak disable_break(isolate, true); 43069a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com f->Call(env->Global(), 0, NULL); 43079a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(1, break_point_hit_count); 43089a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com } 43099a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 43109a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com f->Call(env->Global(), 0, NULL); 43119a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(2, break_point_hit_count); 43129a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 43139a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Get rid of the debug event listener. 4314662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(NULL); 4315381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org CheckDebuggerUnloaded(); 43169a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 43179a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 431813bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.orgstatic const char* kSimpleExtensionSource = 431913bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org "(function Foo() {" 432013bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org " return 4;" 432113bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org "})() "; 432213bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org 432313bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org// http://crbug.com/28933 432413bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org// Test that debug break is disabled when bootstrapper is active. 432513bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.orgTEST(NoBreakWhenBootstrapping) { 4326528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Isolate* isolate = CcTest::isolate(); 432757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org v8::HandleScope scope(isolate); 432813bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org 432913bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org // Register a debug event listener which sets the break flag and counts. 4330662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(DebugEventCounter); 433113bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org 433213bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org // Set the debug break flag. 4333528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Debug::DebugBreak(isolate); 433413bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org break_point_hit_count = 0; 433513bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org { 433613bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org // Create a context with an extension to make sure that some JavaScript 433713bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org // code is executed during bootstrapping. 433813bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org v8::RegisterExtension(new v8::Extension("simpletest", 433913bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org kSimpleExtensionSource)); 434013bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org const char* extension_names[] = { "simpletest" }; 434113bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org v8::ExtensionConfiguration extensions(1, extension_names); 434257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org v8::HandleScope handle_scope(isolate); 434357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org v8::Context::New(isolate, &extensions); 434413bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org } 434513bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org // Check that no DebugBreak events occured during the context creation. 434613bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org CHECK_EQ(0, break_point_hit_count); 434713bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org 434813bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org // Get rid of the debug event listener. 4349662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(NULL); 435013bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org CheckDebuggerUnloaded(); 435113bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org} 43529a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 4353e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 43541510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgstatic void NamedEnum(const v8::PropertyCallbackInfo<v8::Array>& info) { 43559f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.org v8::Handle<v8::Array> result = v8::Array::New(info.GetIsolate(), 3); 4356f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org result->Set(v8::Integer::New(0), 4357f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::String::NewFromUtf8(info.GetIsolate(), "a")); 4358f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org result->Set(v8::Integer::New(1), 4359f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::String::NewFromUtf8(info.GetIsolate(), "b")); 4360f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org result->Set(v8::Integer::New(2), 4361f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::String::NewFromUtf8(info.GetIsolate(), "c")); 43621510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org info.GetReturnValue().Set(result); 43639a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 43649a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 43659a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 43661510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgstatic void IndexedEnum(const v8::PropertyCallbackInfo<v8::Array>& info) { 43679f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.org v8::Handle<v8::Array> result = v8::Array::New(info.GetIsolate(), 2); 43689a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com result->Set(v8::Integer::New(0), v8::Number::New(1)); 43699a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com result->Set(v8::Integer::New(1), v8::Number::New(10)); 43701510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org info.GetReturnValue().Set(result); 43719a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 43729a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 43739a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 43741510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgstatic void NamedGetter(v8::Local<v8::String> name, 43751510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org const v8::PropertyCallbackInfo<v8::Value>& info) { 4376906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org v8::String::Utf8Value n(name); 43779a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com if (strcmp(*n, "a") == 0) { 4378f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org info.GetReturnValue().Set(v8::String::NewFromUtf8(info.GetIsolate(), "AA")); 43791510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return; 43809a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com } else if (strcmp(*n, "b") == 0) { 4381f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org info.GetReturnValue().Set(v8::String::NewFromUtf8(info.GetIsolate(), "BB")); 43821510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return; 43839a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com } else if (strcmp(*n, "c") == 0) { 4384f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org info.GetReturnValue().Set(v8::String::NewFromUtf8(info.GetIsolate(), "CC")); 43851510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return; 43869a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com } else { 43871510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org info.GetReturnValue().SetUndefined(); 43881510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return; 43899a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com } 43901510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org info.GetReturnValue().Set(name); 43919a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 43929a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 43939a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 43941510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgstatic void IndexedGetter(uint32_t index, 43951510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org const v8::PropertyCallbackInfo<v8::Value>& info) { 43961510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org info.GetReturnValue().Set(static_cast<double>(index + 1)); 43979a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 43989a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 43999a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 44009a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(InterceptorPropertyMirror) { 44019a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Create a V8 environment with debug access. 44029a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com DebugLocalContext env; 44032bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 44049a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com env.ExposeDebug(); 44059a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 44069a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Create object with named interceptor. 44079a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::Handle<v8::ObjectTemplate> named = v8::ObjectTemplate::New(); 44089a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com named->SetNamedPropertyHandler(NamedGetter, NULL, NULL, NULL, NamedEnum); 4409f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org env->Global()->Set( 4410f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::String::NewFromUtf8(env->GetIsolate(), "intercepted_named"), 4411f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org named->NewInstance()); 44129a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 44139a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Create object with indexed interceptor. 44149a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::Handle<v8::ObjectTemplate> indexed = v8::ObjectTemplate::New(); 44159a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com indexed->SetIndexedPropertyHandler(IndexedGetter, 44169a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com NULL, 44179a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com NULL, 44189a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com NULL, 44199a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com IndexedEnum); 4420f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org env->Global()->Set( 4421f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::String::NewFromUtf8(env->GetIsolate(), "intercepted_indexed"), 4422f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org indexed->NewInstance()); 44239a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 44249a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Create object with both named and indexed interceptor. 44259a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8::Handle<v8::ObjectTemplate> both = v8::ObjectTemplate::New(); 44269a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com both->SetNamedPropertyHandler(NamedGetter, NULL, NULL, NULL, NamedEnum); 44279a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com both->SetIndexedPropertyHandler(IndexedGetter, NULL, NULL, NULL, IndexedEnum); 4428f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org env->Global()->Set( 4429f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::String::NewFromUtf8(env->GetIsolate(), "intercepted_both"), 4430f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org both->NewInstance()); 44319a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 44329a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Get mirrors for the three objects with interceptor. 44339a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CompileRun( 4434f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org "var named_mirror = debug.MakeMirror(intercepted_named);" 4435f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org "var indexed_mirror = debug.MakeMirror(intercepted_indexed);" 4436f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org "var both_mirror = debug.MakeMirror(intercepted_both)"); 44379a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK(CompileRun( 44389a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "named_mirror instanceof debug.ObjectMirror")->BooleanValue()); 44399a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK(CompileRun( 44409a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "indexed_mirror instanceof debug.ObjectMirror")->BooleanValue()); 44419a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK(CompileRun( 44429a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "both_mirror instanceof debug.ObjectMirror")->BooleanValue()); 44439a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 44449a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Get the property names from the interceptors 44459a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CompileRun( 44463291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org "named_names = named_mirror.propertyNames();" 44473291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org "indexed_names = indexed_mirror.propertyNames();" 44483291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org "both_names = both_mirror.propertyNames()"); 44499a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(3, CompileRun("named_names.length")->Int32Value()); 44509a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(2, CompileRun("indexed_names.length")->Int32Value()); 44519a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(5, CompileRun("both_names.length")->Int32Value()); 44529a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 44539a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Check the expected number of properties. 44549a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com const char* source; 44553291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org source = "named_mirror.properties().length"; 44569a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(3, CompileRun(source)->Int32Value()); 44579a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 44583291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org source = "indexed_mirror.properties().length"; 44599a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(2, CompileRun(source)->Int32Value()); 44609a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 44613291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org source = "both_mirror.properties().length"; 44629a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(5, CompileRun(source)->Int32Value()); 44639a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 44643291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org // 1 is PropertyKind.Named; 44653291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org source = "both_mirror.properties(1).length"; 44669a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(3, CompileRun(source)->Int32Value()); 44679a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 44683291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org // 2 is PropertyKind.Indexed; 44693291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org source = "both_mirror.properties(2).length"; 44709a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(2, CompileRun(source)->Int32Value()); 44719a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 44723291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org // 3 is PropertyKind.Named | PropertyKind.Indexed; 44733291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org source = "both_mirror.properties(3).length"; 44749a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(5, CompileRun(source)->Int32Value()); 44759a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 44763291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org // Get the interceptor properties for the object with only named interceptor. 4477f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org CompileRun("var named_values = named_mirror.properties()"); 44789a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 44793291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org // Check that the properties are interceptor properties. 44803291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org for (int i = 0; i < 3; i++) { 44813291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org EmbeddedVector<char, SMALL_STRING_BUFFER_SIZE> buffer; 44823291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org OS::SNPrintF(buffer, 44833291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org "named_values[%d] instanceof debug.PropertyMirror", i); 44843291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org CHECK(CompileRun(buffer.start())->BooleanValue()); 44859a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 44863291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org OS::SNPrintF(buffer, "named_values[%d].propertyType()", i); 448799aa490225c81012235659d9a183226b286178c8yangguo@chromium.org CHECK_EQ(v8::internal::INTERCEPTOR, 448899aa490225c81012235659d9a183226b286178c8yangguo@chromium.org CompileRun(buffer.start())->Int32Value()); 44899a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 44903291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org OS::SNPrintF(buffer, "named_values[%d].isNative()", i); 44913291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org CHECK(CompileRun(buffer.start())->BooleanValue()); 44923291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org } 44939a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 44943291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org // Get the interceptor properties for the object with only indexed 44953291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org // interceptor. 4496f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org CompileRun("var indexed_values = indexed_mirror.properties()"); 44979a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 44983291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org // Check that the properties are interceptor properties. 44993291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org for (int i = 0; i < 2; i++) { 45003291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org EmbeddedVector<char, SMALL_STRING_BUFFER_SIZE> buffer; 45013291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org OS::SNPrintF(buffer, 45023291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org "indexed_values[%d] instanceof debug.PropertyMirror", i); 45033291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org CHECK(CompileRun(buffer.start())->BooleanValue()); 45043291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org } 45059a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 45063291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org // Get the interceptor properties for the object with both types of 45073291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org // interceptors. 4508f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org CompileRun("var both_values = both_mirror.properties()"); 45099a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 45103291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org // Check that the properties are interceptor properties. 45113291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org for (int i = 0; i < 5; i++) { 45123291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org EmbeddedVector<char, SMALL_STRING_BUFFER_SIZE> buffer; 45133291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org OS::SNPrintF(buffer, "both_values[%d] instanceof debug.PropertyMirror", i); 45143291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org CHECK(CompileRun(buffer.start())->BooleanValue()); 45153291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org } 45169a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 45179a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Check the property names. 45189a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com source = "both_values[0].name() == 'a'"; 45199a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK(CompileRun(source)->BooleanValue()); 45209a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 45219a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com source = "both_values[1].name() == 'b'"; 45229a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK(CompileRun(source)->BooleanValue()); 45239a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 45249a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com source = "both_values[2].name() == 'c'"; 45259a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK(CompileRun(source)->BooleanValue()); 45269a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 45279a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com source = "both_values[3].name() == 1"; 45289a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK(CompileRun(source)->BooleanValue()); 45299a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 45309a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com source = "both_values[4].name() == 10"; 45319a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK(CompileRun(source)->BooleanValue()); 45329a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 45339a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 45349a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 4535ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgTEST(HiddenPrototypePropertyMirror) { 4536ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org // Create a V8 environment with debug access. 4537ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org DebugLocalContext env; 45382bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 4539ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org env.ExposeDebug(); 4540ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org 4541ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org v8::Handle<v8::FunctionTemplate> t0 = v8::FunctionTemplate::New(); 4542f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org t0->InstanceTemplate()->Set(v8::String::NewFromUtf8(env->GetIsolate(), "x"), 4543f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Number::New(0)); 4544ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org v8::Handle<v8::FunctionTemplate> t1 = v8::FunctionTemplate::New(); 4545ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org t1->SetHiddenPrototype(true); 4546f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org t1->InstanceTemplate()->Set(v8::String::NewFromUtf8(env->GetIsolate(), "y"), 4547f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Number::New(1)); 4548ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org v8::Handle<v8::FunctionTemplate> t2 = v8::FunctionTemplate::New(); 4549ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org t2->SetHiddenPrototype(true); 4550f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org t2->InstanceTemplate()->Set(v8::String::NewFromUtf8(env->GetIsolate(), "z"), 4551f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Number::New(2)); 4552ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org v8::Handle<v8::FunctionTemplate> t3 = v8::FunctionTemplate::New(); 4553f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org t3->InstanceTemplate()->Set(v8::String::NewFromUtf8(env->GetIsolate(), "u"), 4554f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Number::New(3)); 4555ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org 4556ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org // Create object and set them on the global object. 4557ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org v8::Handle<v8::Object> o0 = t0->GetFunction()->NewInstance(); 4558f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org env->Global()->Set(v8::String::NewFromUtf8(env->GetIsolate(), "o0"), o0); 4559ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org v8::Handle<v8::Object> o1 = t1->GetFunction()->NewInstance(); 4560f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org env->Global()->Set(v8::String::NewFromUtf8(env->GetIsolate(), "o1"), o1); 4561ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org v8::Handle<v8::Object> o2 = t2->GetFunction()->NewInstance(); 4562f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org env->Global()->Set(v8::String::NewFromUtf8(env->GetIsolate(), "o2"), o2); 4563ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org v8::Handle<v8::Object> o3 = t3->GetFunction()->NewInstance(); 4564f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org env->Global()->Set(v8::String::NewFromUtf8(env->GetIsolate(), "o3"), o3); 4565ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org 4566ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org // Get mirrors for the four objects. 4567ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org CompileRun( 4568f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org "var o0_mirror = debug.MakeMirror(o0);" 4569f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org "var o1_mirror = debug.MakeMirror(o1);" 4570f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org "var o2_mirror = debug.MakeMirror(o2);" 4571f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org "var o3_mirror = debug.MakeMirror(o3)"); 4572ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org CHECK(CompileRun("o0_mirror instanceof debug.ObjectMirror")->BooleanValue()); 4573ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org CHECK(CompileRun("o1_mirror instanceof debug.ObjectMirror")->BooleanValue()); 4574ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org CHECK(CompileRun("o2_mirror instanceof debug.ObjectMirror")->BooleanValue()); 4575ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org CHECK(CompileRun("o3_mirror instanceof debug.ObjectMirror")->BooleanValue()); 4576ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org 4577ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org // Check that each object has one property. 4578ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org CHECK_EQ(1, CompileRun( 4579ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org "o0_mirror.propertyNames().length")->Int32Value()); 4580ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org CHECK_EQ(1, CompileRun( 4581ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org "o1_mirror.propertyNames().length")->Int32Value()); 4582ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org CHECK_EQ(1, CompileRun( 4583ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org "o2_mirror.propertyNames().length")->Int32Value()); 4584ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org CHECK_EQ(1, CompileRun( 4585ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org "o3_mirror.propertyNames().length")->Int32Value()); 4586ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org 4587ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org // Set o1 as prototype for o0. o1 has the hidden prototype flag so all 4588ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org // properties on o1 should be seen on o0. 4589f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org o0->Set(v8::String::NewFromUtf8(env->GetIsolate(), "__proto__"), o1); 4590ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org CHECK_EQ(2, CompileRun( 4591ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org "o0_mirror.propertyNames().length")->Int32Value()); 4592ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org CHECK_EQ(0, CompileRun( 4593ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org "o0_mirror.property('x').value().value()")->Int32Value()); 4594ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org CHECK_EQ(1, CompileRun( 4595ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org "o0_mirror.property('y').value().value()")->Int32Value()); 4596ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org 4597ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org // Set o2 as prototype for o0 (it will end up after o1 as o1 has the hidden 4598ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org // prototype flag. o2 also has the hidden prototype flag so all properties 4599ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org // on o2 should be seen on o0 as well as properties on o1. 4600f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org o0->Set(v8::String::NewFromUtf8(env->GetIsolate(), "__proto__"), o2); 4601ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org CHECK_EQ(3, CompileRun( 4602ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org "o0_mirror.propertyNames().length")->Int32Value()); 4603ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org CHECK_EQ(0, CompileRun( 4604ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org "o0_mirror.property('x').value().value()")->Int32Value()); 4605ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org CHECK_EQ(1, CompileRun( 4606ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org "o0_mirror.property('y').value().value()")->Int32Value()); 4607ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org CHECK_EQ(2, CompileRun( 4608ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org "o0_mirror.property('z').value().value()")->Int32Value()); 4609ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org 4610ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org // Set o3 as prototype for o0 (it will end up after o1 and o2 as both o1 and 4611ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org // o2 has the hidden prototype flag. o3 does not have the hidden prototype 4612ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org // flag so properties on o3 should not be seen on o0 whereas the properties 4613ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org // from o1 and o2 should still be seen on o0. 4614ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org // Final prototype chain: o0 -> o1 -> o2 -> o3 4615ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org // Hidden prototypes: ^^ ^^ 4616f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org o0->Set(v8::String::NewFromUtf8(env->GetIsolate(), "__proto__"), o3); 4617ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org CHECK_EQ(3, CompileRun( 4618ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org "o0_mirror.propertyNames().length")->Int32Value()); 4619ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org CHECK_EQ(1, CompileRun( 4620ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org "o3_mirror.propertyNames().length")->Int32Value()); 4621ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org CHECK_EQ(0, CompileRun( 4622ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org "o0_mirror.property('x').value().value()")->Int32Value()); 4623ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org CHECK_EQ(1, CompileRun( 4624ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org "o0_mirror.property('y').value().value()")->Int32Value()); 4625ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org CHECK_EQ(2, CompileRun( 4626ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org "o0_mirror.property('z').value().value()")->Int32Value()); 4627ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org CHECK(CompileRun("o0_mirror.property('u').isUndefined()")->BooleanValue()); 4628ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org 4629ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org // The prototype (__proto__) for o0 should be o3 as o1 and o2 are hidden. 4630ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org CHECK(CompileRun("o0_mirror.protoObject() == o3_mirror")->BooleanValue()); 4631ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org} 4632ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org 4633ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org 46341510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgstatic void ProtperyXNativeGetter( 46351510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org v8::Local<v8::String> property, 46361510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org const v8::PropertyCallbackInfo<v8::Value>& info) { 46371510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org info.GetReturnValue().Set(10); 463871affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org} 463971affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 464071affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 464171affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgTEST(NativeGetterPropertyMirror) { 464271affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org // Create a V8 environment with debug access. 464371affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org DebugLocalContext env; 46442bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 464571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org env.ExposeDebug(); 464671affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 4647f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Handle<v8::String> name = v8::String::NewFromUtf8(env->GetIsolate(), "x"); 464871affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org // Create object with named accessor. 464971affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org v8::Handle<v8::ObjectTemplate> named = v8::ObjectTemplate::New(); 465071affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org named->SetAccessor(name, &ProtperyXNativeGetter, NULL, 465171affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org v8::Handle<v8::Value>(), v8::DEFAULT, v8::None); 465271affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 465371affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org // Create object with named property getter. 4654f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org env->Global()->Set(v8::String::NewFromUtf8(env->GetIsolate(), "instance"), 4655f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org named->NewInstance()); 465671affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org CHECK_EQ(10, CompileRun("instance.x")->Int32Value()); 465771affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 465871affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org // Get mirror for the object with property getter. 4659f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org CompileRun("var instance_mirror = debug.MakeMirror(instance);"); 466071affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org CHECK(CompileRun( 466171affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org "instance_mirror instanceof debug.ObjectMirror")->BooleanValue()); 466271affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 4663f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org CompileRun("var named_names = instance_mirror.propertyNames();"); 466471affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org CHECK_EQ(1, CompileRun("named_names.length")->Int32Value()); 466571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org CHECK(CompileRun("named_names[0] == 'x'")->BooleanValue()); 466671affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org CHECK(CompileRun( 466771affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org "instance_mirror.property('x').value().isNumber()")->BooleanValue()); 466871affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org CHECK(CompileRun( 466971affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org "instance_mirror.property('x').value().value() == 10")->BooleanValue()); 467071affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org} 467171affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 467271affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 46731510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgstatic void ProtperyXNativeGetterThrowingError( 46741510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org v8::Local<v8::String> property, 46751510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org const v8::PropertyCallbackInfo<v8::Value>& info) { 46761510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org CompileRun("throw new Error('Error message');"); 467771affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org} 467871affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 467971affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 468071affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgTEST(NativeGetterThrowingErrorPropertyMirror) { 468171affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org // Create a V8 environment with debug access. 468271affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org DebugLocalContext env; 46832bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 468471affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org env.ExposeDebug(); 468571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 4686f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Handle<v8::String> name = v8::String::NewFromUtf8(env->GetIsolate(), "x"); 468771affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org // Create object with named accessor. 468871affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org v8::Handle<v8::ObjectTemplate> named = v8::ObjectTemplate::New(); 468971affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org named->SetAccessor(name, &ProtperyXNativeGetterThrowingError, NULL, 469071affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org v8::Handle<v8::Value>(), v8::DEFAULT, v8::None); 469171affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 469271affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org // Create object with named property getter. 4693f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org env->Global()->Set(v8::String::NewFromUtf8(env->GetIsolate(), "instance"), 4694f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org named->NewInstance()); 469571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 469671affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org // Get mirror for the object with property getter. 4697f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org CompileRun("var instance_mirror = debug.MakeMirror(instance);"); 469871affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org CHECK(CompileRun( 469971affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org "instance_mirror instanceof debug.ObjectMirror")->BooleanValue()); 470071affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org CompileRun("named_names = instance_mirror.propertyNames();"); 470171affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org CHECK_EQ(1, CompileRun("named_names.length")->Int32Value()); 470271affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org CHECK(CompileRun("named_names[0] == 'x'")->BooleanValue()); 470371affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org CHECK(CompileRun( 470471affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org "instance_mirror.property('x').value().isError()")->BooleanValue()); 470571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 470671affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org // Check that the message is that passed to the Error constructor. 470771affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org CHECK(CompileRun( 470871affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org "instance_mirror.property('x').value().message() == 'Error message'")-> 470971affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org BooleanValue()); 471071affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org} 471171affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 471271affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 4713c730f77e0eabe9b3a203fc82d8e5327f2b95746dager@chromium.org// Test that hidden properties object is not returned as an unnamed property 4714c730f77e0eabe9b3a203fc82d8e5327f2b95746dager@chromium.org// among regular properties. 4715c730f77e0eabe9b3a203fc82d8e5327f2b95746dager@chromium.org// See http://crbug.com/26491 4716c730f77e0eabe9b3a203fc82d8e5327f2b95746dager@chromium.orgTEST(NoHiddenProperties) { 4717c730f77e0eabe9b3a203fc82d8e5327f2b95746dager@chromium.org // Create a V8 environment with debug access. 4718c730f77e0eabe9b3a203fc82d8e5327f2b95746dager@chromium.org DebugLocalContext env; 47192bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 4720c730f77e0eabe9b3a203fc82d8e5327f2b95746dager@chromium.org env.ExposeDebug(); 4721c730f77e0eabe9b3a203fc82d8e5327f2b95746dager@chromium.org 4722c730f77e0eabe9b3a203fc82d8e5327f2b95746dager@chromium.org // Create an object in the global scope. 4723c730f77e0eabe9b3a203fc82d8e5327f2b95746dager@chromium.org const char* source = "var obj = {a: 1};"; 4724f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Script::Compile(v8::String::NewFromUtf8(env->GetIsolate(), source)) 4725f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org ->Run(); 4726c730f77e0eabe9b3a203fc82d8e5327f2b95746dager@chromium.org v8::Local<v8::Object> obj = v8::Local<v8::Object>::Cast( 4727f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "obj"))); 4728c730f77e0eabe9b3a203fc82d8e5327f2b95746dager@chromium.org // Set a hidden property on the object. 4729f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org obj->SetHiddenValue( 4730f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::String::NewFromUtf8(env->GetIsolate(), "v8::test-debug::a"), 4731f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Int32::New(11)); 4732c730f77e0eabe9b3a203fc82d8e5327f2b95746dager@chromium.org 4733c730f77e0eabe9b3a203fc82d8e5327f2b95746dager@chromium.org // Get mirror for the object with property getter. 4734c730f77e0eabe9b3a203fc82d8e5327f2b95746dager@chromium.org CompileRun("var obj_mirror = debug.MakeMirror(obj);"); 4735c730f77e0eabe9b3a203fc82d8e5327f2b95746dager@chromium.org CHECK(CompileRun( 4736c730f77e0eabe9b3a203fc82d8e5327f2b95746dager@chromium.org "obj_mirror instanceof debug.ObjectMirror")->BooleanValue()); 4737c730f77e0eabe9b3a203fc82d8e5327f2b95746dager@chromium.org CompileRun("var named_names = obj_mirror.propertyNames();"); 4738c730f77e0eabe9b3a203fc82d8e5327f2b95746dager@chromium.org // There should be exactly one property. But there is also an unnamed 4739c730f77e0eabe9b3a203fc82d8e5327f2b95746dager@chromium.org // property whose value is hidden properties dictionary. The latter 4740c730f77e0eabe9b3a203fc82d8e5327f2b95746dager@chromium.org // property should not be in the list of reguar properties. 4741c730f77e0eabe9b3a203fc82d8e5327f2b95746dager@chromium.org CHECK_EQ(1, CompileRun("named_names.length")->Int32Value()); 4742c730f77e0eabe9b3a203fc82d8e5327f2b95746dager@chromium.org CHECK(CompileRun("named_names[0] == 'a'")->BooleanValue()); 4743c730f77e0eabe9b3a203fc82d8e5327f2b95746dager@chromium.org CHECK(CompileRun( 4744c730f77e0eabe9b3a203fc82d8e5327f2b95746dager@chromium.org "obj_mirror.property('a').value().value() == 1")->BooleanValue()); 4745c730f77e0eabe9b3a203fc82d8e5327f2b95746dager@chromium.org 4746c730f77e0eabe9b3a203fc82d8e5327f2b95746dager@chromium.org // Object created by t0 will become hidden prototype of object 'obj'. 4747c730f77e0eabe9b3a203fc82d8e5327f2b95746dager@chromium.org v8::Handle<v8::FunctionTemplate> t0 = v8::FunctionTemplate::New(); 4748f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org t0->InstanceTemplate()->Set(v8::String::NewFromUtf8(env->GetIsolate(), "b"), 4749f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Number::New(2)); 4750c730f77e0eabe9b3a203fc82d8e5327f2b95746dager@chromium.org t0->SetHiddenPrototype(true); 4751c730f77e0eabe9b3a203fc82d8e5327f2b95746dager@chromium.org v8::Handle<v8::FunctionTemplate> t1 = v8::FunctionTemplate::New(); 4752f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org t1->InstanceTemplate()->Set(v8::String::NewFromUtf8(env->GetIsolate(), "c"), 4753f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Number::New(3)); 4754c730f77e0eabe9b3a203fc82d8e5327f2b95746dager@chromium.org 4755c730f77e0eabe9b3a203fc82d8e5327f2b95746dager@chromium.org // Create proto objects, add hidden properties to them and set them on 4756c730f77e0eabe9b3a203fc82d8e5327f2b95746dager@chromium.org // the global object. 4757c730f77e0eabe9b3a203fc82d8e5327f2b95746dager@chromium.org v8::Handle<v8::Object> protoObj = t0->GetFunction()->NewInstance(); 4758f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org protoObj->SetHiddenValue( 4759f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::String::NewFromUtf8(env->GetIsolate(), "v8::test-debug::b"), 4760f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Int32::New(12)); 4761f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org env->Global()->Set(v8::String::NewFromUtf8(env->GetIsolate(), "protoObj"), 4762f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org protoObj); 4763c730f77e0eabe9b3a203fc82d8e5327f2b95746dager@chromium.org v8::Handle<v8::Object> grandProtoObj = t1->GetFunction()->NewInstance(); 4764f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org grandProtoObj->SetHiddenValue( 4765f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::String::NewFromUtf8(env->GetIsolate(), "v8::test-debug::c"), 4766f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Int32::New(13)); 4767f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org env->Global()->Set( 4768f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::String::NewFromUtf8(env->GetIsolate(), "grandProtoObj"), 4769f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org grandProtoObj); 4770c730f77e0eabe9b3a203fc82d8e5327f2b95746dager@chromium.org 4771c730f77e0eabe9b3a203fc82d8e5327f2b95746dager@chromium.org // Setting prototypes: obj->protoObj->grandProtoObj 4772f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org protoObj->Set(v8::String::NewFromUtf8(env->GetIsolate(), "__proto__"), 4773f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org grandProtoObj); 4774f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org obj->Set(v8::String::NewFromUtf8(env->GetIsolate(), "__proto__"), protoObj); 4775c730f77e0eabe9b3a203fc82d8e5327f2b95746dager@chromium.org 4776c730f77e0eabe9b3a203fc82d8e5327f2b95746dager@chromium.org // Get mirror for the object with property getter. 4777c730f77e0eabe9b3a203fc82d8e5327f2b95746dager@chromium.org CompileRun("var obj_mirror = debug.MakeMirror(obj);"); 4778c730f77e0eabe9b3a203fc82d8e5327f2b95746dager@chromium.org CHECK(CompileRun( 4779c730f77e0eabe9b3a203fc82d8e5327f2b95746dager@chromium.org "obj_mirror instanceof debug.ObjectMirror")->BooleanValue()); 4780c730f77e0eabe9b3a203fc82d8e5327f2b95746dager@chromium.org CompileRun("var named_names = obj_mirror.propertyNames();"); 4781c730f77e0eabe9b3a203fc82d8e5327f2b95746dager@chromium.org // There should be exactly two properties - one from the object itself and 4782c730f77e0eabe9b3a203fc82d8e5327f2b95746dager@chromium.org // another from its hidden prototype. 4783c730f77e0eabe9b3a203fc82d8e5327f2b95746dager@chromium.org CHECK_EQ(2, CompileRun("named_names.length")->Int32Value()); 4784c730f77e0eabe9b3a203fc82d8e5327f2b95746dager@chromium.org CHECK(CompileRun("named_names.sort(); named_names[0] == 'a' &&" 4785c730f77e0eabe9b3a203fc82d8e5327f2b95746dager@chromium.org "named_names[1] == 'b'")->BooleanValue()); 4786c730f77e0eabe9b3a203fc82d8e5327f2b95746dager@chromium.org CHECK(CompileRun( 4787c730f77e0eabe9b3a203fc82d8e5327f2b95746dager@chromium.org "obj_mirror.property('a').value().value() == 1")->BooleanValue()); 4788c730f77e0eabe9b3a203fc82d8e5327f2b95746dager@chromium.org CHECK(CompileRun( 4789c730f77e0eabe9b3a203fc82d8e5327f2b95746dager@chromium.org "obj_mirror.property('b').value().value() == 2")->BooleanValue()); 4790c730f77e0eabe9b3a203fc82d8e5327f2b95746dager@chromium.org} 4791c730f77e0eabe9b3a203fc82d8e5327f2b95746dager@chromium.org 479271affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 47939a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Multithreaded tests of JSON debugger protocol 47949a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 47959a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Support classes 47969a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 47973d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org// Provides synchronization between N threads, where N is a template parameter. 47983d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org// The Wait() call blocks a thread until it is called for the Nth time, then all 47993d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org// calls return. Each ThreadBarrier object can only be used once. 48003d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.orgtemplate <int N> 48013d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.orgclass ThreadBarrier V8_FINAL { 48029a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com public: 48033d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org ThreadBarrier() : num_blocked_(0) {} 48049a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 48053d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org ~ThreadBarrier() { 48063d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org LockGuard<Mutex> lock_guard(&mutex_); 48073d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org if (num_blocked_ != 0) { 48083d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org CHECK_EQ(N, num_blocked_); 48093d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org } 48103d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org } 48119a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 48123d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org void Wait() { 48133d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org LockGuard<Mutex> lock_guard(&mutex_); 48143d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org CHECK_LT(num_blocked_, N); 48153d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org num_blocked_++; 48163d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org if (N == num_blocked_) { 48173d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org // Signal and unblock all waiting threads. 48183d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org cv_.NotifyAll(); 48193d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org printf("BARRIER\n\n"); 48203d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org fflush(stdout); 48213d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org } else { // Wait for the semaphore. 48223d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org while (num_blocked_ < N) { 48233d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org cv_.Wait(&mutex_); 48243d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org } 48253d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org } 48263d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org CHECK_EQ(N, num_blocked_); 48273d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org } 4828e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 48293d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org private: 48303d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org ConditionVariable cv_; 48313d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org Mutex mutex_; 48323d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org int num_blocked_; 48339a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 48343d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org STATIC_CHECK(N > 0); 4835e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 48363d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org DISALLOW_COPY_AND_ASSIGN(ThreadBarrier); 48373d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org}; 48389a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 4839e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 48409a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// A set containing enough barriers and semaphores for any of the tests. 48419a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comclass Barriers { 48429a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com public: 48433d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org Barriers() : semaphore_1(0), semaphore_2(0) {} 48443d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org ThreadBarrier<2> barrier_1; 48453d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org ThreadBarrier<2> barrier_2; 48463d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org ThreadBarrier<2> barrier_3; 48473d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org ThreadBarrier<2> barrier_4; 48483d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org ThreadBarrier<2> barrier_5; 48493d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org v8::internal::Semaphore semaphore_1; 48503d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org v8::internal::Semaphore semaphore_2; 48519a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}; 48529a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 48539a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 48549258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org// We match parts of the message to decide if it is a break message. 48559a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.combool IsBreakEventMessage(char *message) { 48569258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org const char* type_event = "\"type\":\"event\""; 48579258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org const char* event_break = "\"event\":\"break\""; 48589258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org // Does the message contain both type:event and event:break? 48599258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org return strstr(message, type_event) != NULL && 48609258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org strstr(message, event_break) != NULL; 48619a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 48629a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 48639a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 48649d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com// We match parts of the message to decide if it is a exception message. 48659d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.combool IsExceptionEventMessage(char *message) { 48669d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com const char* type_event = "\"type\":\"event\""; 48679d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com const char* event_exception = "\"event\":\"exception\""; 48689d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com // Does the message contain both type:event and event:exception? 48699d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com return strstr(message, type_event) != NULL && 48709d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com strstr(message, event_exception) != NULL; 48719d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com} 48729d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com 48739d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com 48749d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com// We match the message wether it is an evaluate response message. 48759d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.combool IsEvaluateResponseMessage(char* message) { 48769d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com const char* type_response = "\"type\":\"response\""; 48779d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com const char* command_evaluate = "\"command\":\"evaluate\""; 48789d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com // Does the message contain both type:response and command:evaluate? 48799d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com return strstr(message, type_response) != NULL && 48809d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com strstr(message, command_evaluate) != NULL; 48819d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com} 48829d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com 48839d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com 48845c838251403b0be9a882540f1922577abba4c872ager@chromium.orgstatic int StringToInt(const char* s) { 48855c838251403b0be9a882540f1922577abba4c872ager@chromium.org return atoi(s); // NOLINT 48865c838251403b0be9a882540f1922577abba4c872ager@chromium.org} 48875c838251403b0be9a882540f1922577abba4c872ager@chromium.org 48885c838251403b0be9a882540f1922577abba4c872ager@chromium.org 48899d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com// We match parts of the message to get evaluate result int value. 48909d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.comint GetEvaluateIntResult(char *message) { 48919d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com const char* value = "\"value\":"; 48929d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com char* pos = strstr(message, value); 48939d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com if (pos == NULL) { 48949d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com return -1; 48959d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com } 48969d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com int res = -1; 48975c838251403b0be9a882540f1922577abba4c872ager@chromium.org res = StringToInt(pos + strlen(value)); 48989d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com return res; 48999d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com} 49009d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com 49019d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com 49029d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com// We match parts of the message to get hit breakpoint id. 49039d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.comint GetBreakpointIdFromBreakEventMessage(char *message) { 49049d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com const char* breakpoints = "\"breakpoints\":["; 49059d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com char* pos = strstr(message, breakpoints); 49069d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com if (pos == NULL) { 49079d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com return -1; 49089d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com } 49099d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com int res = -1; 49105c838251403b0be9a882540f1922577abba4c872ager@chromium.org res = StringToInt(pos + strlen(breakpoints)); 49119d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com return res; 49129d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com} 49139d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com 49149d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com 4915b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org// We match parts of the message to get total frames number. 4916b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgint GetTotalFramesInt(char *message) { 4917b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org const char* prefix = "\"totalFrames\":"; 4918b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org char* pos = strstr(message, prefix); 4919b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org if (pos == NULL) { 4920b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org return -1; 4921b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org } 4922b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org pos += strlen(prefix); 49235c838251403b0be9a882540f1922577abba4c872ager@chromium.org int res = StringToInt(pos); 4924b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org return res; 4925b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org} 4926b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 4927b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 49285b2fbee8f0b54371d42843c8fd90249a24093678ager@chromium.org// We match parts of the message to get source line. 49295b2fbee8f0b54371d42843c8fd90249a24093678ager@chromium.orgint GetSourceLineFromBreakEventMessage(char *message) { 49305b2fbee8f0b54371d42843c8fd90249a24093678ager@chromium.org const char* source_line = "\"sourceLine\":"; 49315b2fbee8f0b54371d42843c8fd90249a24093678ager@chromium.org char* pos = strstr(message, source_line); 49325b2fbee8f0b54371d42843c8fd90249a24093678ager@chromium.org if (pos == NULL) { 49335b2fbee8f0b54371d42843c8fd90249a24093678ager@chromium.org return -1; 49345b2fbee8f0b54371d42843c8fd90249a24093678ager@chromium.org } 49355b2fbee8f0b54371d42843c8fd90249a24093678ager@chromium.org int res = -1; 49365b2fbee8f0b54371d42843c8fd90249a24093678ager@chromium.org res = StringToInt(pos + strlen(source_line)); 49375b2fbee8f0b54371d42843c8fd90249a24093678ager@chromium.org return res; 49385b2fbee8f0b54371d42843c8fd90249a24093678ager@chromium.org} 49395b2fbee8f0b54371d42843c8fd90249a24093678ager@chromium.org 4940e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 49419a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com/* Test MessageQueues */ 49429a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com/* Tests the message queues that hold debugger commands and 49439a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com * response messages to the debugger. Fills queues and makes 49449a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com * them grow. 49459a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com */ 49469a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comBarriers message_queue_barriers; 49479a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 49489a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// This is the debugger thread, that executes no v8 calls except 49499a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// placing JSON debugger commands in the queue. 49509a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comclass MessageQueueDebuggerThread : public v8::internal::Thread { 49519a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com public: 49526d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org MessageQueueDebuggerThread() 49536d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org : Thread("MessageQueueDebuggerThread") { } 49549a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com void Run(); 49559a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}; 49569a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 4957662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org 4958662436e7b124b3535773535c671c53db322070b5verwaest@chromium.orgstatic void MessageHandler(const v8::Debug::Message& message) { 4959662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Handle<v8::String> json = message.GetJSON(); 4960f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::String::Utf8Value utf8(json); 4961f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org if (IsBreakEventMessage(*utf8)) { 49629a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Lets test script wait until break occurs to send commands. 49639a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Signals when a break is reported. 49643d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org message_queue_barriers.semaphore_2.Signal(); 49659a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com } 49665ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org 49679a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Allow message handler to block on a semaphore, to test queueing of 49689a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // messages while blocked. 49693d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org message_queue_barriers.semaphore_1.Wait(); 49709a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 49719a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 4972e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 49739a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comvoid MessageQueueDebuggerThread::Run() { 49749a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com const int kBufferSize = 1000; 49759a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com uint16_t buffer_1[kBufferSize]; 49769a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com uint16_t buffer_2[kBufferSize]; 49779a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com const char* command_1 = 49789a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "{\"seq\":117," 49799a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "\"type\":\"request\"," 49809a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "\"command\":\"evaluate\"," 49819a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "\"arguments\":{\"expression\":\"1+2\"}}"; 49829a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com const char* command_2 = 49839a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "{\"seq\":118," 49849a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "\"type\":\"request\"," 49859a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "\"command\":\"evaluate\"," 49869a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "\"arguments\":{\"expression\":\"1+a\"}}"; 49879a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com const char* command_3 = 49889a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "{\"seq\":119," 49899a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "\"type\":\"request\"," 49909a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "\"command\":\"evaluate\"," 49919a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "\"arguments\":{\"expression\":\"c.d * b\"}}"; 49929a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com const char* command_continue = 49939a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "{\"seq\":106," 49949a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "\"type\":\"request\"," 49959a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "\"command\":\"continue\"}"; 49969a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com const char* command_single_step = 49979a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "{\"seq\":107," 49989a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "\"type\":\"request\"," 49999a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "\"command\":\"continue\"," 50009a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "\"arguments\":{\"stepaction\":\"next\"}}"; 50019a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 50029a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com /* Interleaved sequence of actions by the two threads:*/ 50039a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Main thread compiles and runs source_1 50043d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org message_queue_barriers.semaphore_1.Signal(); 50059a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com message_queue_barriers.barrier_1.Wait(); 50069a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Post 6 commands, filling the command queue and making it expand. 50079a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // These calls return immediately, but the commands stay on the queue 50089a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // until the execution of source_2. 50099a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Note: AsciiToUtf16 executes before SendCommand, so command is copied 50109a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // to buffer before buffer is sent to SendCommand. 5011528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Isolate* isolate = CcTest::isolate(); 5012528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Debug::SendCommand(isolate, buffer_1, AsciiToUtf16(command_1, buffer_1)); 5013528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Debug::SendCommand(isolate, buffer_2, AsciiToUtf16(command_2, buffer_2)); 5014528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Debug::SendCommand(isolate, buffer_2, AsciiToUtf16(command_3, buffer_2)); 5015528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Debug::SendCommand(isolate, buffer_2, AsciiToUtf16(command_3, buffer_2)); 5016528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Debug::SendCommand(isolate, buffer_2, AsciiToUtf16(command_3, buffer_2)); 50179a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com message_queue_barriers.barrier_2.Wait(); 50189a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Main thread compiles and runs source_2. 50195ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org // Queued commands are executed at the start of compilation of source_2( 50205ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org // beforeCompile event). 50215ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org // Free the message handler to process all the messages from the queue. 7 50225ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org // messages are expected: 2 afterCompile events and 5 responses. 50235ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org // All the commands added so far will fail to execute as long as call stack 50245ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org // is empty on beforeCompile event. 50255ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org for (int i = 0; i < 6 ; ++i) { 50263d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org message_queue_barriers.semaphore_1.Signal(); 50279a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com } 50285ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org message_queue_barriers.barrier_3.Wait(); 50299a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Main thread compiles and runs source_3. 50305ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org // Don't stop in the afterCompile handler. 50313d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org message_queue_barriers.semaphore_1.Signal(); 50329a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // source_3 includes a debugger statement, which causes a break event. 50339a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Wait on break event from hitting "debugger" statement 50343d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org message_queue_barriers.semaphore_2.Wait(); 50359a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // These should execute after the "debugger" statement in source_2 5036528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Debug::SendCommand(isolate, buffer_1, AsciiToUtf16(command_1, buffer_1)); 5037528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Debug::SendCommand(isolate, buffer_2, AsciiToUtf16(command_2, buffer_2)); 5038528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Debug::SendCommand(isolate, buffer_2, AsciiToUtf16(command_3, buffer_2)); 5039528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Debug::SendCommand( 5040528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org isolate, buffer_2, AsciiToUtf16(command_single_step, buffer_2)); 50415ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org // Run after 2 break events, 4 responses. 50425ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org for (int i = 0; i < 6 ; ++i) { 50433d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org message_queue_barriers.semaphore_1.Signal(); 50445ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org } 50459a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Wait on break event after a single step executes. 50463d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org message_queue_barriers.semaphore_2.Wait(); 5047528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Debug::SendCommand(isolate, buffer_1, AsciiToUtf16(command_2, buffer_1)); 5048528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Debug::SendCommand( 5049528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org isolate, buffer_2, AsciiToUtf16(command_continue, buffer_2)); 50505ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org // Run after 2 responses. 50515ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org for (int i = 0; i < 2 ; ++i) { 50523d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org message_queue_barriers.semaphore_1.Signal(); 50535ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org } 50549a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Main thread continues running source_3 to end, waits for this thread. 50559a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 50569a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 50579a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 50589a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// This thread runs the v8 engine. 50599a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(MessageQueues) { 50606d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org MessageQueueDebuggerThread message_queue_debugger_thread; 5061ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 50629a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Create a V8 environment 50639a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com DebugLocalContext env; 50642bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 5065662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetMessageHandler2(MessageHandler); 50669a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com message_queue_debugger_thread.Start(); 50679a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 50689a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com const char* source_1 = "a = 3; b = 4; c = new Object(); c.d = 5;"; 50699a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com const char* source_2 = "e = 17;"; 50709a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com const char* source_3 = "a = 4; debugger; a = 5; a = 6; a = 7;"; 50719a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 50729a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // See MessageQueueDebuggerThread::Run for interleaved sequence of 50739a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // API calls and events in the two threads. 50749a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CompileRun(source_1); 50759a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com message_queue_barriers.barrier_1.Wait(); 50769a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com message_queue_barriers.barrier_2.Wait(); 50779a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CompileRun(source_2); 50789a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com message_queue_barriers.barrier_3.Wait(); 50799a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CompileRun(source_3); 50809a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com message_queue_debugger_thread.Join(); 50819a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com fflush(stdout); 50829a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 50839a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 508465dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 508565dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.orgclass TestClientData : public v8::Debug::ClientData { 508665dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org public: 508765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org TestClientData() { 508865dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org constructor_call_counter++; 508965dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org } 509065dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org virtual ~TestClientData() { 509165dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org destructor_call_counter++; 509265dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org } 509365dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 509465dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org static void ResetCounters() { 509565dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org constructor_call_counter = 0; 509665dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org destructor_call_counter = 0; 509765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org } 509865dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 509965dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org static int constructor_call_counter; 510065dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org static int destructor_call_counter; 510165dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org}; 510265dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 510365dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.orgint TestClientData::constructor_call_counter = 0; 510465dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.orgint TestClientData::destructor_call_counter = 0; 510565dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 510665dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 510765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org// Tests that MessageQueue doesn't destroy client data when expands and 510865dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org// does destroy when it dies. 510965dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.orgTEST(MessageQueueExpandAndDestroy) { 511065dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org TestClientData::ResetCounters(); 511165dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org { // Create a scope for the queue. 51123a37e9b96c768f6b5b6b09542e1cb1a1ece7a022ager@chromium.org CommandMessageQueue queue(1); 51133a37e9b96c768f6b5b6b09542e1cb1a1ece7a022ager@chromium.org queue.Put(CommandMessage::New(Vector<uint16_t>::empty(), 511465dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org new TestClientData())); 51153a37e9b96c768f6b5b6b09542e1cb1a1ece7a022ager@chromium.org queue.Put(CommandMessage::New(Vector<uint16_t>::empty(), 511665dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org new TestClientData())); 51173a37e9b96c768f6b5b6b09542e1cb1a1ece7a022ager@chromium.org queue.Put(CommandMessage::New(Vector<uint16_t>::empty(), 511865dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org new TestClientData())); 51193a37e9b96c768f6b5b6b09542e1cb1a1ece7a022ager@chromium.org CHECK_EQ(0, TestClientData::destructor_call_counter); 512065dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org queue.Get().Dispose(); 51213a37e9b96c768f6b5b6b09542e1cb1a1ece7a022ager@chromium.org CHECK_EQ(1, TestClientData::destructor_call_counter); 51223a37e9b96c768f6b5b6b09542e1cb1a1ece7a022ager@chromium.org queue.Put(CommandMessage::New(Vector<uint16_t>::empty(), 51233a37e9b96c768f6b5b6b09542e1cb1a1ece7a022ager@chromium.org new TestClientData())); 51243a37e9b96c768f6b5b6b09542e1cb1a1ece7a022ager@chromium.org queue.Put(CommandMessage::New(Vector<uint16_t>::empty(), 51253a37e9b96c768f6b5b6b09542e1cb1a1ece7a022ager@chromium.org new TestClientData())); 51263a37e9b96c768f6b5b6b09542e1cb1a1ece7a022ager@chromium.org queue.Put(CommandMessage::New(Vector<uint16_t>::empty(), 512765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org new TestClientData())); 51283a37e9b96c768f6b5b6b09542e1cb1a1ece7a022ager@chromium.org queue.Put(CommandMessage::New(Vector<uint16_t>::empty(), 512965dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org new TestClientData())); 51303a37e9b96c768f6b5b6b09542e1cb1a1ece7a022ager@chromium.org queue.Put(CommandMessage::New(Vector<uint16_t>::empty(), 513165dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org new TestClientData())); 51323a37e9b96c768f6b5b6b09542e1cb1a1ece7a022ager@chromium.org CHECK_EQ(1, TestClientData::destructor_call_counter); 513365dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org queue.Get().Dispose(); 51343a37e9b96c768f6b5b6b09542e1cb1a1ece7a022ager@chromium.org CHECK_EQ(2, TestClientData::destructor_call_counter); 513565dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org } 513665dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org // All the client data should be destroyed when the queue is destroyed. 51373a37e9b96c768f6b5b6b09542e1cb1a1ece7a022ager@chromium.org CHECK_EQ(TestClientData::destructor_call_counter, 51383a37e9b96c768f6b5b6b09542e1cb1a1ece7a022ager@chromium.org TestClientData::destructor_call_counter); 513965dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org} 514065dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 514165dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 514265dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.orgstatic int handled_client_data_instances_count = 0; 514365dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.orgstatic void MessageHandlerCountingClientData( 51445ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org const v8::Debug::Message& message) { 51455ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org if (message.GetClientData() != NULL) { 514665dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org handled_client_data_instances_count++; 514765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org } 514865dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org} 514965dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 515065dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 515165dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org// Tests that all client data passed to the debugger are sent to the handler. 515265dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.orgTEST(SendClientDataToHandler) { 515365dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org // Create a V8 environment 515465dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org DebugLocalContext env; 5155528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Isolate* isolate = env->GetIsolate(); 5156528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::HandleScope scope(isolate); 515765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org TestClientData::ResetCounters(); 515865dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org handled_client_data_instances_count = 0; 51595ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org v8::Debug::SetMessageHandler2(MessageHandlerCountingClientData); 51605ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org const char* source_1 = "a = 3; b = 4; c = new Object(); c.d = 5;"; 516165dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org const int kBufferSize = 1000; 516265dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org uint16_t buffer[kBufferSize]; 516365dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org const char* command_1 = 516465dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org "{\"seq\":117," 516565dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org "\"type\":\"request\"," 516665dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org "\"command\":\"evaluate\"," 516765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org "\"arguments\":{\"expression\":\"1+2\"}}"; 516865dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org const char* command_2 = 516965dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org "{\"seq\":118," 517065dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org "\"type\":\"request\"," 517165dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org "\"command\":\"evaluate\"," 517265dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org "\"arguments\":{\"expression\":\"1+a\"}}"; 517365dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org const char* command_continue = 517465dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org "{\"seq\":106," 517565dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org "\"type\":\"request\"," 517665dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org "\"command\":\"continue\"}"; 517765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 5178528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Debug::SendCommand(isolate, buffer, AsciiToUtf16(command_1, buffer), 517965dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org new TestClientData()); 5180528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Debug::SendCommand( 5181528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org isolate, buffer, AsciiToUtf16(command_2, buffer), NULL); 5182528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Debug::SendCommand(isolate, buffer, AsciiToUtf16(command_2, buffer), 518365dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org new TestClientData()); 5184528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Debug::SendCommand(isolate, buffer, AsciiToUtf16(command_2, buffer), 518565dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org new TestClientData()); 51865ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org // All the messages will be processed on beforeCompile event. 518765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org CompileRun(source_1); 5188528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Debug::SendCommand( 5189528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org isolate, buffer, AsciiToUtf16(command_continue, buffer)); 51903a37e9b96c768f6b5b6b09542e1cb1a1ece7a022ager@chromium.org CHECK_EQ(3, TestClientData::constructor_call_counter); 51913a37e9b96c768f6b5b6b09542e1cb1a1ece7a022ager@chromium.org CHECK_EQ(TestClientData::constructor_call_counter, 51923a37e9b96c768f6b5b6b09542e1cb1a1ece7a022ager@chromium.org handled_client_data_instances_count); 51933a37e9b96c768f6b5b6b09542e1cb1a1ece7a022ager@chromium.org CHECK_EQ(TestClientData::constructor_call_counter, 51943a37e9b96c768f6b5b6b09542e1cb1a1ece7a022ager@chromium.org TestClientData::destructor_call_counter); 519565dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org} 519665dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 519765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 51989a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com/* Test ThreadedDebugging */ 51999a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com/* This test interrupts a running infinite loop that is 52009a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com * occupying the v8 thread by a break command from the 52019a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com * debugger thread. It then changes the value of a 52029a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com * global object, to make the loop terminate. 52039a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com */ 52049a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 52059a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comBarriers threaded_debugging_barriers; 52069a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 52079a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comclass V8Thread : public v8::internal::Thread { 52089a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com public: 52096d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org V8Thread() : Thread("V8Thread") { } 52109a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com void Run(); 52119a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}; 52129a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 52139a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comclass DebuggerThread : public v8::internal::Thread { 52149a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com public: 52156d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org DebuggerThread() : Thread("DebuggerThread") { } 52169a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com void Run(); 52179a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}; 52189a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 52199a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 52201510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgstatic void ThreadedAtBarrier1( 52211510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org const v8::FunctionCallbackInfo<v8::Value>& args) { 5222acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org threaded_debugging_barriers.barrier_1.Wait(); 5223acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org} 5224acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org 5225acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org 52265ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.orgstatic void ThreadedMessageHandler(const v8::Debug::Message& message) { 52279a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com static char print_buffer[1000]; 52285ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org v8::String::Value json(message.GetJSON()); 52295ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org Utf16ToAscii(*json, json.length(), print_buffer); 52309a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com if (IsBreakEventMessage(print_buffer)) { 52315b2fbee8f0b54371d42843c8fd90249a24093678ager@chromium.org // Check that we are inside the while loop. 52325b2fbee8f0b54371d42843c8fd90249a24093678ager@chromium.org int source_line = GetSourceLineFromBreakEventMessage(print_buffer); 523388d326b0935b802e71e3a75e02f31fae8c2af96cmstarzinger@chromium.org // TODO(2047): This should really be 8 <= source_line <= 13; but we 523488d326b0935b802e71e3a75e02f31fae8c2af96cmstarzinger@chromium.org // currently have an off-by-one error when calculating the source 523588d326b0935b802e71e3a75e02f31fae8c2af96cmstarzinger@chromium.org // position corresponding to the program counter at the debug break. 523688d326b0935b802e71e3a75e02f31fae8c2af96cmstarzinger@chromium.org CHECK(7 <= source_line && source_line <= 13); 52379a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com threaded_debugging_barriers.barrier_2.Wait(); 52389a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com } 52399a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 52409a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 52419a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 52429a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comvoid V8Thread::Run() { 5243acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org const char* source = 52449a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "flag = true;\n" 52459a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "function bar( new_value ) {\n" 52469a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com " flag = new_value;\n" 52479a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com " return \"Return from bar(\" + new_value + \")\";\n" 52489a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "}\n" 52499a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "\n" 52509a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "function foo() {\n" 52519a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com " var x = 1;\n" 52529a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com " while ( flag == true ) {\n" 5253acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org " if ( x == 1 ) {\n" 5254acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org " ThreadedAtBarrier1();\n" 5255acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org " }\n" 52569a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com " x = x + 1;\n" 52579a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com " }\n" 52589a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "}\n" 5259acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org "\n" 5260acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org "foo();\n"; 52619a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 5262528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Isolate::Scope isolate_scope(CcTest::isolate()); 52639a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com DebugLocalContext env; 52642bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 52655ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org v8::Debug::SetMessageHandler2(&ThreadedMessageHandler); 5266acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org v8::Handle<v8::ObjectTemplate> global_template = v8::ObjectTemplate::New(); 5267f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org global_template->Set( 5268f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::String::NewFromUtf8(env->GetIsolate(), "ThreadedAtBarrier1"), 5269f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::FunctionTemplate::New(ThreadedAtBarrier1)); 5270528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Handle<v8::Context> context = v8::Context::New(CcTest::isolate(), 527157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org NULL, 527257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org global_template); 5273acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org v8::Context::Scope context_scope(context); 52749a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 5275acae37894ae73146c7a4788ca8af931d446bd2cakasperl@chromium.org CompileRun(source); 52769a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 52779a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 5278e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 52799a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comvoid DebuggerThread::Run() { 52809a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com const int kBufSize = 1000; 52819a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com uint16_t buffer[kBufSize]; 52829a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 52839a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com const char* command_1 = "{\"seq\":102," 52849a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "\"type\":\"request\"," 52859a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "\"command\":\"evaluate\"," 52869a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "\"arguments\":{\"expression\":\"bar(false)\"}}"; 52879a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com const char* command_2 = "{\"seq\":103," 52889a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "\"type\":\"request\"," 52899a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "\"command\":\"continue\"}"; 52909a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 5291528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Isolate* isolate = CcTest::isolate(); 52929a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com threaded_debugging_barriers.barrier_1.Wait(); 5293528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Debug::DebugBreak(isolate); 52949a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com threaded_debugging_barriers.barrier_2.Wait(); 5295528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Debug::SendCommand(isolate, buffer, AsciiToUtf16(command_1, buffer)); 5296528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Debug::SendCommand(isolate, buffer, AsciiToUtf16(command_2, buffer)); 52979a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 52989a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 52999a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 53009a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(ThreadedDebugging) { 53016d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org DebuggerThread debugger_thread; 53026d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org V8Thread v8_thread; 5303ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 53049a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Create a V8 environment 53059a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8_thread.Start(); 53069a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com debugger_thread.Start(); 53079a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 53089a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com v8_thread.Join(); 53099a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com debugger_thread.Join(); 53109a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 53119a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 5312e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 53139a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com/* Test RecursiveBreakpoints */ 53149a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com/* In this test, the debugger evaluates a function with a breakpoint, after 53159a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com * hitting a breakpoint in another function. We do this with both values 53169a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com * of the flag enabling recursive breakpoints, and verify that the second 53179a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com * breakpoint is hit when enabled, and missed when disabled. 53189a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com */ 53199a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 53209a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comclass BreakpointsV8Thread : public v8::internal::Thread { 53219a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com public: 53226d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org BreakpointsV8Thread() : Thread("BreakpointsV8Thread") { } 53239a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com void Run(); 53249a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}; 53259a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 53269a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comclass BreakpointsDebuggerThread : public v8::internal::Thread { 53279a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com public: 53286d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org explicit BreakpointsDebuggerThread(bool global_evaluate) 53296d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org : Thread("BreakpointsDebuggerThread"), 5330ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org global_evaluate_(global_evaluate) {} 53319a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com void Run(); 5332b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 5333b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org private: 5334b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org bool global_evaluate_; 53359a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}; 53369a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 53379a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 53389a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comBarriers* breakpoints_barriers; 53399d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.comint break_event_breakpoint_id; 53409d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.comint evaluate_int_result; 53419a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 53425ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.orgstatic void BreakpointsMessageHandler(const v8::Debug::Message& message) { 53439a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com static char print_buffer[1000]; 53445ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org v8::String::Value json(message.GetJSON()); 53455ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org Utf16ToAscii(*json, json.length(), print_buffer); 53469a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 53479258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org if (IsBreakEventMessage(print_buffer)) { 53489d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com break_event_breakpoint_id = 53499d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com GetBreakpointIdFromBreakEventMessage(print_buffer); 53503d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org breakpoints_barriers->semaphore_1.Signal(); 53519d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com } else if (IsEvaluateResponseMessage(print_buffer)) { 53529d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com evaluate_int_result = GetEvaluateIntResult(print_buffer); 53533d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org breakpoints_barriers->semaphore_1.Signal(); 53549a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com } 53559a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 53569a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 53579a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 53589a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comvoid BreakpointsV8Thread::Run() { 53599a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com const char* source_1 = "var y_global = 3;\n" 53609a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "function cat( new_value ) {\n" 53619a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com " var x = new_value;\n" 53629d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com " y_global = y_global + 4;\n" 53639a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com " x = 3 * x + 1;\n" 53649d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com " y_global = y_global + 5;\n" 53659a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com " return x;\n" 53669a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "}\n" 53679a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "\n" 53689a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "function dog() {\n" 53699a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com " var x = 1;\n" 53709a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com " x = y_global;" 53719a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com " var z = 3;" 53729a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com " x += 100;\n" 53739a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com " return x;\n" 53749a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "}\n" 53759a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "\n"; 53769a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com const char* source_2 = "cat(17);\n" 53779a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "cat(19);\n"; 53789a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 5379528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Isolate* isolate = CcTest::isolate(); 5380528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Isolate::Scope isolate_scope(isolate); 53819a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com DebugLocalContext env; 5382528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::HandleScope scope(isolate); 53835ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org v8::Debug::SetMessageHandler2(&BreakpointsMessageHandler); 53849a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 53859a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CompileRun(source_1); 53869a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com breakpoints_barriers->barrier_1.Wait(); 53879a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com breakpoints_barriers->barrier_2.Wait(); 53889a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CompileRun(source_2); 53899a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 53909a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 53919a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 53929a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comvoid BreakpointsDebuggerThread::Run() { 53939a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com const int kBufSize = 1000; 53949a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com uint16_t buffer[kBufSize]; 53959a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 53969a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com const char* command_1 = "{\"seq\":101," 53979a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "\"type\":\"request\"," 53989a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "\"command\":\"setbreakpoint\"," 53999a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "\"arguments\":{\"type\":\"function\",\"target\":\"cat\",\"line\":3}}"; 54009a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com const char* command_2 = "{\"seq\":102," 54019a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "\"type\":\"request\"," 54029a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "\"command\":\"setbreakpoint\"," 54039a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "\"arguments\":{\"type\":\"function\",\"target\":\"dog\",\"line\":3}}"; 5404b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org const char* command_3; 5405b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org if (this->global_evaluate_) { 5406b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org command_3 = "{\"seq\":103," 5407b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org "\"type\":\"request\"," 5408b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org "\"command\":\"evaluate\"," 5409b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org "\"arguments\":{\"expression\":\"dog()\",\"disable_break\":false," 5410b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org "\"global\":true}}"; 5411b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org } else { 5412b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org command_3 = "{\"seq\":103," 5413b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org "\"type\":\"request\"," 5414b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org "\"command\":\"evaluate\"," 5415b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org "\"arguments\":{\"expression\":\"dog()\",\"disable_break\":false}}"; 5416b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org } 5417b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org const char* command_4; 5418b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org if (this->global_evaluate_) { 5419b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org command_4 = "{\"seq\":104," 5420b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org "\"type\":\"request\"," 5421b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org "\"command\":\"evaluate\"," 5422b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org "\"arguments\":{\"expression\":\"100 + 8\",\"disable_break\":true," 5423b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org "\"global\":true}}"; 5424b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org } else { 5425b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org command_4 = "{\"seq\":104," 5426b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org "\"type\":\"request\"," 5427b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org "\"command\":\"evaluate\"," 5428b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org "\"arguments\":{\"expression\":\"x + 1\",\"disable_break\":true}}"; 5429b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org } 54309d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com const char* command_5 = "{\"seq\":105," 54319a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "\"type\":\"request\"," 54329a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "\"command\":\"continue\"}"; 54339d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com const char* command_6 = "{\"seq\":106," 54349a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "\"type\":\"request\"," 54359a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "\"command\":\"continue\"}"; 5436b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org const char* command_7; 5437b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org if (this->global_evaluate_) { 5438b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org command_7 = "{\"seq\":107," 5439b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org "\"type\":\"request\"," 5440b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org "\"command\":\"evaluate\"," 5441b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org "\"arguments\":{\"expression\":\"dog()\",\"disable_break\":true," 5442b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org "\"global\":true}}"; 5443b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org } else { 5444b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org command_7 = "{\"seq\":107," 5445b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org "\"type\":\"request\"," 5446b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org "\"command\":\"evaluate\"," 5447b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org "\"arguments\":{\"expression\":\"dog()\",\"disable_break\":true}}"; 5448b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org } 54499d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com const char* command_8 = "{\"seq\":108," 54509a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "\"type\":\"request\"," 54519a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com "\"command\":\"continue\"}"; 54529a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 54539a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 5454528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Isolate* isolate = CcTest::isolate(); 5455528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Isolate::Scope isolate_scope(isolate); 54569a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // v8 thread initializes, runs source_1 54579a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com breakpoints_barriers->barrier_1.Wait(); 54589d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com // 1:Set breakpoint in cat() (will get id 1). 5459528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Debug::SendCommand(isolate, buffer, AsciiToUtf16(command_1, buffer)); 54609d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com // 2:Set breakpoint in dog() (will get id 2). 5461528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Debug::SendCommand(isolate, buffer, AsciiToUtf16(command_2, buffer)); 54629a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com breakpoints_barriers->barrier_2.Wait(); 54639d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com // V8 thread starts compiling source_2. 54649a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Automatic break happens, to run queued commands 54653d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org // breakpoints_barriers->semaphore_1.Wait(); 54669a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Commands 1 through 3 run, thread continues. 54679a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // v8 thread runs source_2 to breakpoint in cat(). 54689a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // message callback receives break event. 54693d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org breakpoints_barriers->semaphore_1.Wait(); 54709d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com // Must have hit breakpoint #1. 54719d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com CHECK_EQ(1, break_event_breakpoint_id); 54729a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // 4:Evaluate dog() (which has a breakpoint). 5473528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Debug::SendCommand(isolate, buffer, AsciiToUtf16(command_3, buffer)); 54749d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com // V8 thread hits breakpoint in dog(). 54753d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org breakpoints_barriers->semaphore_1.Wait(); // wait for break event 54769d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com // Must have hit breakpoint #2. 54779d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com CHECK_EQ(2, break_event_breakpoint_id); 54789d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com // 5:Evaluate (x + 1). 5479528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Debug::SendCommand(isolate, buffer, AsciiToUtf16(command_4, buffer)); 54809d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com // Evaluate (x + 1) finishes. 54813d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org breakpoints_barriers->semaphore_1.Wait(); 54829d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com // Must have result 108. 54839d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com CHECK_EQ(108, evaluate_int_result); 54849d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com // 6:Continue evaluation of dog(). 5485528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Debug::SendCommand(isolate, buffer, AsciiToUtf16(command_5, buffer)); 54869d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com // Evaluate dog() finishes. 54873d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org breakpoints_barriers->semaphore_1.Wait(); 54889d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com // Must have result 107. 54899d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com CHECK_EQ(107, evaluate_int_result); 54909a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // 7:Continue evaluation of source_2, finish cat(17), hit breakpoint 54919a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // in cat(19). 5492528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Debug::SendCommand(isolate, buffer, AsciiToUtf16(command_6, buffer)); 54939d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com // Message callback gets break event. 54943d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org breakpoints_barriers->semaphore_1.Wait(); // wait for break event 54959d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com // Must have hit breakpoint #1. 54969d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com CHECK_EQ(1, break_event_breakpoint_id); 54979d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com // 8: Evaluate dog() with breaks disabled. 5498528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Debug::SendCommand(isolate, buffer, AsciiToUtf16(command_7, buffer)); 54999d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com // Evaluate dog() finishes. 55003d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org breakpoints_barriers->semaphore_1.Wait(); 55019d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com // Must have result 116. 55029d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com CHECK_EQ(116, evaluate_int_result); 55039a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // 9: Continue evaluation of source2, reach end. 5504528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Debug::SendCommand(isolate, buffer, AsciiToUtf16(command_8, buffer)); 55059a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 55069a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 5507e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 5508b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgvoid TestRecursiveBreakpointsGeneric(bool global_evaluate) { 5509bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org i::FLAG_debugger_auto_break = true; 5510bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org 55116d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org BreakpointsDebuggerThread breakpoints_debugger_thread(global_evaluate); 55126d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org BreakpointsV8Thread breakpoints_v8_thread; 5513b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 55149a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com // Create a V8 environment 55159a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com Barriers stack_allocated_breakpoints_barriers; 55169a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com breakpoints_barriers = &stack_allocated_breakpoints_barriers; 55179a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 55189a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com breakpoints_v8_thread.Start(); 55199a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com breakpoints_debugger_thread.Start(); 55209a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 55219a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com breakpoints_v8_thread.Join(); 55229a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com breakpoints_debugger_thread.Join(); 55239a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 55249bbf968a649030335309265ba2c98fcc36aeb762kasperl@chromium.org 5525e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 5526b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgTEST(RecursiveBreakpoints) { 5527b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org TestRecursiveBreakpointsGeneric(false); 5528b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org} 5529b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 5530e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 5531b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgTEST(RecursiveBreakpointsGlobal) { 5532b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org TestRecursiveBreakpointsGeneric(true); 5533b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org} 5534b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 55359bbf968a649030335309265ba2c98fcc36aeb762kasperl@chromium.org 5536662436e7b124b3535773535c671c53db322070b5verwaest@chromium.orgstatic void DummyDebugEventListener( 5537662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org const v8::Debug::EventDetails& event_details) { 55389bbf968a649030335309265ba2c98fcc36aeb762kasperl@chromium.org} 55399bbf968a649030335309265ba2c98fcc36aeb762kasperl@chromium.org 55409bbf968a649030335309265ba2c98fcc36aeb762kasperl@chromium.org 5541245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.orgTEST(SetDebugEventListenerOnUninitializedVM) { 5542662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(DummyDebugEventListener); 55439bbf968a649030335309265ba2c98fcc36aeb762kasperl@chromium.org} 55449bbf968a649030335309265ba2c98fcc36aeb762kasperl@chromium.org 55459bbf968a649030335309265ba2c98fcc36aeb762kasperl@chromium.org 55465ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.orgstatic void DummyMessageHandler(const v8::Debug::Message& message) { 55479bbf968a649030335309265ba2c98fcc36aeb762kasperl@chromium.org} 55489bbf968a649030335309265ba2c98fcc36aeb762kasperl@chromium.org 55499bbf968a649030335309265ba2c98fcc36aeb762kasperl@chromium.org 55509bbf968a649030335309265ba2c98fcc36aeb762kasperl@chromium.orgTEST(SetMessageHandlerOnUninitializedVM) { 55515ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org v8::Debug::SetMessageHandler2(DummyMessageHandler); 55529bbf968a649030335309265ba2c98fcc36aeb762kasperl@chromium.org} 55539bbf968a649030335309265ba2c98fcc36aeb762kasperl@chromium.org 55549bbf968a649030335309265ba2c98fcc36aeb762kasperl@chromium.org 5555a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// Source for a JavaScript function which returns the data parameter of a 5556a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// function called in the context of the debugger. If no data parameter is 5557a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// passed it throws an exception. 5558a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgstatic const char* debugger_call_with_data_source = 5559a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org "function debugger_call_with_data(exec_state, data) {" 5560a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org " if (data) return data;" 5561a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org " throw 'No data!'" 5562a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org "}"; 5563a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgv8::Handle<v8::Function> debugger_call_with_data; 5564a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 5565a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 5566a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// Source for a JavaScript function which returns the data parameter of a 5567a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// function called in the context of the debugger. If no data parameter is 5568a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// passed it throws an exception. 5569a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgstatic const char* debugger_call_with_closure_source = 5570a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org "var x = 3;" 5571c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org "(function (exec_state) {" 5572a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org " if (exec_state.y) return x - 1;" 5573a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org " exec_state.y = x;" 5574a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org " return exec_state.y" 5575c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org "})"; 5576a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgv8::Handle<v8::Function> debugger_call_with_closure; 5577a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 5578a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// Function to retrieve the number of JavaScript frames by calling a JavaScript 5579a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// in the debugger. 55801510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgstatic void CheckFrameCount(const v8::FunctionCallbackInfo<v8::Value>& args) { 5581a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org CHECK(v8::Debug::Call(frame_count)->IsNumber()); 5582a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org CHECK_EQ(args[0]->Int32Value(), 5583a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org v8::Debug::Call(frame_count)->Int32Value()); 5584a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 5585a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 5586a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 5587a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// Function to retrieve the source line of the top JavaScript frame by calling a 5588a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// JavaScript function in the debugger. 55891510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgstatic void CheckSourceLine(const v8::FunctionCallbackInfo<v8::Value>& args) { 5590a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org CHECK(v8::Debug::Call(frame_source_line)->IsNumber()); 5591a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org CHECK_EQ(args[0]->Int32Value(), 5592a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org v8::Debug::Call(frame_source_line)->Int32Value()); 5593a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 5594a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 5595a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 5596a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// Function to test passing an additional parameter to a JavaScript function 5597a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// called in the debugger. It also tests that functions called in the debugger 5598a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// can throw exceptions. 55991510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgstatic void CheckDataParameter( 56001510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org const v8::FunctionCallbackInfo<v8::Value>& args) { 5601f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Handle<v8::String> data = 5602f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::String::NewFromUtf8(args.GetIsolate(), "Test"); 5603a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org CHECK(v8::Debug::Call(debugger_call_with_data, data)->IsString()); 5604a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 5605a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org CHECK(v8::Debug::Call(debugger_call_with_data).IsEmpty()); 5606a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org CHECK(v8::Debug::Call(debugger_call_with_data).IsEmpty()); 5607a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 5608a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org v8::TryCatch catcher; 5609a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org v8::Debug::Call(debugger_call_with_data); 5610a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org CHECK(catcher.HasCaught()); 5611a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org CHECK(catcher.Exception()->IsString()); 5612a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 5613a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 5614a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 5615a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// Function to test using a JavaScript with closure in the debugger. 56161510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgstatic void CheckClosure(const v8::FunctionCallbackInfo<v8::Value>& args) { 5617a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org CHECK(v8::Debug::Call(debugger_call_with_closure)->IsNumber()); 5618a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org CHECK_EQ(3, v8::Debug::Call(debugger_call_with_closure)->Int32Value()); 5619a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 5620a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 5621a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 5622a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// Test functions called through the debugger. 5623a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgTEST(CallFunctionInDebugger) { 5624a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org // Create and enter a context with the functions CheckFrameCount, 5625a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org // CheckSourceLine and CheckDataParameter installed. 5626528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::HandleScope scope(CcTest::isolate()); 5627a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org v8::Handle<v8::ObjectTemplate> global_template = v8::ObjectTemplate::New(); 5628f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org global_template->Set( 5629f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::String::NewFromUtf8(CcTest::isolate(), "CheckFrameCount"), 5630f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::FunctionTemplate::New(CheckFrameCount)); 5631f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org global_template->Set( 5632f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::String::NewFromUtf8(CcTest::isolate(), "CheckSourceLine"), 5633f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::FunctionTemplate::New(CheckSourceLine)); 5634f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org global_template->Set( 5635f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::String::NewFromUtf8(CcTest::isolate(), "CheckDataParameter"), 5636f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::FunctionTemplate::New(CheckDataParameter)); 5637f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org global_template->Set( 5638f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::String::NewFromUtf8(CcTest::isolate(), "CheckClosure"), 5639f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::FunctionTemplate::New(CheckClosure)); 5640528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Handle<v8::Context> context = v8::Context::New(CcTest::isolate(), 564157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org NULL, 564257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org global_template); 5643a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org v8::Context::Scope context_scope(context); 5644a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 5645a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org // Compile a function for checking the number of JavaScript frames. 5646f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Script::Compile( 5647f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::String::NewFromUtf8(CcTest::isolate(), frame_count_source))->Run(); 5648f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org frame_count = v8::Local<v8::Function>::Cast(context->Global()->Get( 5649f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::String::NewFromUtf8(CcTest::isolate(), "frame_count"))); 5650a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 5651a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org // Compile a function for returning the source line for the top frame. 5652f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Script::Compile(v8::String::NewFromUtf8(CcTest::isolate(), 5653f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org frame_source_line_source))->Run(); 5654f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org frame_source_line = v8::Local<v8::Function>::Cast(context->Global()->Get( 5655f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::String::NewFromUtf8(CcTest::isolate(), "frame_source_line"))); 5656a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 5657a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org // Compile a function returning the data parameter. 5658f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Script::Compile(v8::String::NewFromUtf8(CcTest::isolate(), 5659f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org debugger_call_with_data_source)) 5660f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org ->Run(); 5661a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org debugger_call_with_data = v8::Local<v8::Function>::Cast( 5662f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org context->Global()->Get(v8::String::NewFromUtf8( 5663f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org CcTest::isolate(), "debugger_call_with_data"))); 5664a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 5665a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org // Compile a function capturing closure. 5666f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org debugger_call_with_closure = 5667f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Local<v8::Function>::Cast(v8::Script::Compile( 5668f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::String::NewFromUtf8(CcTest::isolate(), 5669f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org debugger_call_with_closure_source))->Run()); 5670a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 5671df7a284a293865a5fa9390be2e8f82ba3ac8598asgjesse@chromium.org // Calling a function through the debugger returns 0 frames if there are 5672df7a284a293865a5fa9390be2e8f82ba3ac8598asgjesse@chromium.org // no JavaScript frames. 5673df7a284a293865a5fa9390be2e8f82ba3ac8598asgjesse@chromium.org CHECK_EQ(v8::Integer::New(0), v8::Debug::Call(frame_count)); 5674a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 5675a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org // Test that the number of frames can be retrieved. 5676f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Script::Compile( 5677f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::String::NewFromUtf8(CcTest::isolate(), "CheckFrameCount(1)"))->Run(); 5678f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Script::Compile(v8::String::NewFromUtf8(CcTest::isolate(), 5679f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org "function f() {" 5680f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org " CheckFrameCount(2);" 5681f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org "}; f()"))->Run(); 5682a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 5683a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org // Test that the source line can be retrieved. 5684f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Script::Compile( 5685f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::String::NewFromUtf8(CcTest::isolate(), "CheckSourceLine(0)"))->Run(); 5686f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Script::Compile(v8::String::NewFromUtf8(CcTest::isolate(), 5687f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org "function f() {\n" 5688f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org " CheckSourceLine(1)\n" 5689f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org " CheckSourceLine(2)\n" 5690f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org " CheckSourceLine(3)\n" 5691f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org "}; f()"))->Run(); 5692a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 5693a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org // Test that a parameter can be passed to a function called in the debugger. 5694f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Script::Compile(v8::String::NewFromUtf8(CcTest::isolate(), 5695f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org "CheckDataParameter()"))->Run(); 5696a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 5697a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org // Test that a function with closure can be run in the debugger. 5698f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Script::Compile( 5699f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::String::NewFromUtf8(CcTest::isolate(), "CheckClosure()"))->Run(); 57003a6061e672323303da424aa33256d0ae621aa3bdager@chromium.org 57013a6061e672323303da424aa33256d0ae621aa3bdager@chromium.org // Test that the source line is correct when there is a line offset. 5702f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::ScriptOrigin origin(v8::String::NewFromUtf8(CcTest::isolate(), "test"), 57033a6061e672323303da424aa33256d0ae621aa3bdager@chromium.org v8::Integer::New(7)); 5704f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Script::Compile( 5705f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::String::NewFromUtf8(CcTest::isolate(), "CheckSourceLine(7)"), &origin) 5706f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org ->Run(); 5707f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Script::Compile(v8::String::NewFromUtf8(CcTest::isolate(), 5708f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org "function f() {\n" 5709f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org " CheckSourceLine(8)\n" 5710f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org " CheckSourceLine(9)\n" 5711f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org " CheckSourceLine(10)\n" 5712f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org "}; f()"), 5713f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org &origin)->Run(); 5714a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 5715381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org 5716381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org 5717a9eaf5cd1da2ded88cd992b0e2a7537c0fed0899sgjesse@chromium.org// Debugger message handler which counts the number of breaks. 5718a9eaf5cd1da2ded88cd992b0e2a7537c0fed0899sgjesse@chromium.orgstatic void SendContinueCommand(); 5719a9eaf5cd1da2ded88cd992b0e2a7537c0fed0899sgjesse@chromium.orgstatic void MessageHandlerBreakPointHitCount( 5720a9eaf5cd1da2ded88cd992b0e2a7537c0fed0899sgjesse@chromium.org const v8::Debug::Message& message) { 5721a9eaf5cd1da2ded88cd992b0e2a7537c0fed0899sgjesse@chromium.org if (message.IsEvent() && message.GetEvent() == v8::Break) { 5722a9eaf5cd1da2ded88cd992b0e2a7537c0fed0899sgjesse@chromium.org // Count the number of breaks. 5723a9eaf5cd1da2ded88cd992b0e2a7537c0fed0899sgjesse@chromium.org break_point_hit_count++; 5724a9eaf5cd1da2ded88cd992b0e2a7537c0fed0899sgjesse@chromium.org 5725a9eaf5cd1da2ded88cd992b0e2a7537c0fed0899sgjesse@chromium.org SendContinueCommand(); 5726a9eaf5cd1da2ded88cd992b0e2a7537c0fed0899sgjesse@chromium.org } 5727a9eaf5cd1da2ded88cd992b0e2a7537c0fed0899sgjesse@chromium.org} 5728a9eaf5cd1da2ded88cd992b0e2a7537c0fed0899sgjesse@chromium.org 5729a9eaf5cd1da2ded88cd992b0e2a7537c0fed0899sgjesse@chromium.org 5730381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org// Test that clearing the debug event listener actually clears all break points 5731381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org// and related information. 5732381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.orgTEST(DebuggerUnload) { 5733381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org DebugLocalContext env; 5734381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org 5735381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org // Check debugger is unloaded before it is used. 5736381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org CheckDebuggerUnloaded(); 5737381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org 5738a9eaf5cd1da2ded88cd992b0e2a7537c0fed0899sgjesse@chromium.org // Set a debug event listener. 5739a9eaf5cd1da2ded88cd992b0e2a7537c0fed0899sgjesse@chromium.org break_point_hit_count = 0; 5740662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(DebugEventBreakPointHitCount); 5741a9eaf5cd1da2ded88cd992b0e2a7537c0fed0899sgjesse@chromium.org { 57422bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 5743a9eaf5cd1da2ded88cd992b0e2a7537c0fed0899sgjesse@chromium.org // Create a couple of functions for the test. 5744a9eaf5cd1da2ded88cd992b0e2a7537c0fed0899sgjesse@chromium.org v8::Local<v8::Function> foo = 5745a9eaf5cd1da2ded88cd992b0e2a7537c0fed0899sgjesse@chromium.org CompileFunction(&env, "function foo(){x=1}", "foo"); 5746a9eaf5cd1da2ded88cd992b0e2a7537c0fed0899sgjesse@chromium.org v8::Local<v8::Function> bar = 5747a9eaf5cd1da2ded88cd992b0e2a7537c0fed0899sgjesse@chromium.org CompileFunction(&env, "function bar(){y=2}", "bar"); 5748a9eaf5cd1da2ded88cd992b0e2a7537c0fed0899sgjesse@chromium.org 5749a9eaf5cd1da2ded88cd992b0e2a7537c0fed0899sgjesse@chromium.org // Set some break points. 5750a9eaf5cd1da2ded88cd992b0e2a7537c0fed0899sgjesse@chromium.org SetBreakPoint(foo, 0); 5751a9eaf5cd1da2ded88cd992b0e2a7537c0fed0899sgjesse@chromium.org SetBreakPoint(foo, 4); 5752a9eaf5cd1da2ded88cd992b0e2a7537c0fed0899sgjesse@chromium.org SetBreakPoint(bar, 0); 5753a9eaf5cd1da2ded88cd992b0e2a7537c0fed0899sgjesse@chromium.org SetBreakPoint(bar, 4); 5754a9eaf5cd1da2ded88cd992b0e2a7537c0fed0899sgjesse@chromium.org 5755a9eaf5cd1da2ded88cd992b0e2a7537c0fed0899sgjesse@chromium.org // Make sure that the break points are there. 5756a9eaf5cd1da2ded88cd992b0e2a7537c0fed0899sgjesse@chromium.org break_point_hit_count = 0; 5757a9eaf5cd1da2ded88cd992b0e2a7537c0fed0899sgjesse@chromium.org foo->Call(env->Global(), 0, NULL); 5758a9eaf5cd1da2ded88cd992b0e2a7537c0fed0899sgjesse@chromium.org CHECK_EQ(2, break_point_hit_count); 5759a9eaf5cd1da2ded88cd992b0e2a7537c0fed0899sgjesse@chromium.org bar->Call(env->Global(), 0, NULL); 5760a9eaf5cd1da2ded88cd992b0e2a7537c0fed0899sgjesse@chromium.org CHECK_EQ(4, break_point_hit_count); 5761a9eaf5cd1da2ded88cd992b0e2a7537c0fed0899sgjesse@chromium.org } 5762f457d1fe7ccfa410786a72c54b4b2f9b05e5dce9sgjesse@chromium.org 5763a9eaf5cd1da2ded88cd992b0e2a7537c0fed0899sgjesse@chromium.org // Remove the debug event listener without clearing breakpoints. Do this 5764a9eaf5cd1da2ded88cd992b0e2a7537c0fed0899sgjesse@chromium.org // outside a handle scope. 5765662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(NULL); 5766381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org CheckDebuggerUnloaded(true); 5767381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org 5768a9eaf5cd1da2ded88cd992b0e2a7537c0fed0899sgjesse@chromium.org // Now set a debug message handler. 5769381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org break_point_hit_count = 0; 5770a9eaf5cd1da2ded88cd992b0e2a7537c0fed0899sgjesse@chromium.org v8::Debug::SetMessageHandler2(MessageHandlerBreakPointHitCount); 5771a9eaf5cd1da2ded88cd992b0e2a7537c0fed0899sgjesse@chromium.org { 57722bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 5773381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org 5774a9eaf5cd1da2ded88cd992b0e2a7537c0fed0899sgjesse@chromium.org // Get the test functions again. 5775c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org v8::Local<v8::Function> foo(v8::Local<v8::Function>::Cast( 5776f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "foo")))); 5777381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org 5778a9eaf5cd1da2ded88cd992b0e2a7537c0fed0899sgjesse@chromium.org foo->Call(env->Global(), 0, NULL); 5779a9eaf5cd1da2ded88cd992b0e2a7537c0fed0899sgjesse@chromium.org CHECK_EQ(0, break_point_hit_count); 5780a9eaf5cd1da2ded88cd992b0e2a7537c0fed0899sgjesse@chromium.org 5781a9eaf5cd1da2ded88cd992b0e2a7537c0fed0899sgjesse@chromium.org // Set break points and run again. 5782a9eaf5cd1da2ded88cd992b0e2a7537c0fed0899sgjesse@chromium.org SetBreakPoint(foo, 0); 5783a9eaf5cd1da2ded88cd992b0e2a7537c0fed0899sgjesse@chromium.org SetBreakPoint(foo, 4); 5784a9eaf5cd1da2ded88cd992b0e2a7537c0fed0899sgjesse@chromium.org foo->Call(env->Global(), 0, NULL); 5785a9eaf5cd1da2ded88cd992b0e2a7537c0fed0899sgjesse@chromium.org CHECK_EQ(2, break_point_hit_count); 5786a9eaf5cd1da2ded88cd992b0e2a7537c0fed0899sgjesse@chromium.org } 5787a9eaf5cd1da2ded88cd992b0e2a7537c0fed0899sgjesse@chromium.org 5788a9eaf5cd1da2ded88cd992b0e2a7537c0fed0899sgjesse@chromium.org // Remove the debug message handler without clearing breakpoints. Do this 5789a9eaf5cd1da2ded88cd992b0e2a7537c0fed0899sgjesse@chromium.org // outside a handle scope. 5790a9eaf5cd1da2ded88cd992b0e2a7537c0fed0899sgjesse@chromium.org v8::Debug::SetMessageHandler2(NULL); 5791381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org CheckDebuggerUnloaded(true); 5792381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org} 5793381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org 5794381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org 579571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org// Sends continue command to the debugger. 579671affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgstatic void SendContinueCommand() { 579771daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org const int kBufferSize = 1000; 579871daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org uint16_t buffer[kBufferSize]; 579971daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org const char* command_continue = 580071daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org "{\"seq\":0," 580171daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org "\"type\":\"request\"," 580271daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org "\"command\":\"continue\"}"; 580371daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org 5804528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Debug::SendCommand( 5805528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org CcTest::isolate(), buffer, AsciiToUtf16(command_continue, buffer)); 580671daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org} 580771daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org 580871daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org 580971affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org// Debugger message handler which counts the number of times it is called. 581071affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgstatic int message_handler_hit_count = 0; 581171affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgstatic void MessageHandlerHitCount(const v8::Debug::Message& message) { 581271affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org message_handler_hit_count++; 581371affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 58149d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com static char print_buffer[1000]; 58159d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com v8::String::Value json(message.GetJSON()); 58169d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com Utf16ToAscii(*json, json.length(), print_buffer); 58179d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com if (IsExceptionEventMessage(print_buffer)) { 58189d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com // Send a continue command for exception events. 58199d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com SendContinueCommand(); 58209d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com } 582171affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org} 582271affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 582371affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 582471daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org// Test clearing the debug message handler. 582571daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.orgTEST(DebuggerClearMessageHandler) { 582671daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org DebugLocalContext env; 58272bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 582871daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org 582971daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org // Check debugger is unloaded before it is used. 583071daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org CheckDebuggerUnloaded(); 583171daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org 583271daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org // Set a debug message handler. 58335ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org v8::Debug::SetMessageHandler2(MessageHandlerHitCount); 583471daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org 583571daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org // Run code to throw a unhandled exception. This should end up in the message 583671daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org // handler. 583771daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org CompileRun("throw 1"); 583871daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org 583971daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org // The message handler should be called. 584071daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org CHECK_GT(message_handler_hit_count, 0); 584171daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org 584271daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org // Clear debug message handler. 584371daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org message_handler_hit_count = 0; 5844662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetMessageHandler2(NULL); 584571daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org 584671daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org // Run code to throw a unhandled exception. This should end up in the message 584771daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org // handler. 584871daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org CompileRun("throw 1"); 584971daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org 585071daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org // The message handler should not be called more. 585171daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org CHECK_EQ(0, message_handler_hit_count); 585271daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org 585371daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org CheckDebuggerUnloaded(true); 585471daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org} 585571daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org 585671daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org 585771daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org// Debugger message handler which clears the message handler while active. 585865dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.orgstatic void MessageHandlerClearingMessageHandler( 58595ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org const v8::Debug::Message& message) { 586071daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org message_handler_hit_count++; 586171daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org 586271daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org // Clear debug message handler. 5863662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetMessageHandler2(NULL); 586471daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org} 586571daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org 586671daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org 586771daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org// Test clearing the debug message handler while processing a debug event. 586871daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.orgTEST(DebuggerClearMessageHandlerWhileActive) { 586971daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org DebugLocalContext env; 58702bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 587171daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org 587271daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org // Check debugger is unloaded before it is used. 587371daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org CheckDebuggerUnloaded(); 587471daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org 587571daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org // Set a debug message handler. 58765ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org v8::Debug::SetMessageHandler2(MessageHandlerClearingMessageHandler); 587771daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org 587871daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org // Run code to throw a unhandled exception. This should end up in the message 587971daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org // handler. 588071daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org CompileRun("throw 1"); 588171daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org 588271daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org // The message handler should be called. 588371daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org CHECK_EQ(1, message_handler_hit_count); 588471daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org 588571daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org CheckDebuggerUnloaded(true); 588671daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org} 588771daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org 588871daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org 588965dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org/* Test DebuggerHostDispatch */ 589065dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org/* In this test, the debugger waits for a command on a breakpoint 589165dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org * and is dispatching host commands while in the infinite loop. 589265dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org */ 589365dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 589465dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.orgclass HostDispatchV8Thread : public v8::internal::Thread { 589565dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org public: 58966d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org HostDispatchV8Thread() : Thread("HostDispatchV8Thread") { } 589765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org void Run(); 589865dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org}; 589965dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 590065dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.orgclass HostDispatchDebuggerThread : public v8::internal::Thread { 590165dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org public: 59026d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org HostDispatchDebuggerThread() : Thread("HostDispatchDebuggerThread") { } 590365dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org void Run(); 590465dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org}; 590565dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 590665dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.orgBarriers* host_dispatch_barriers; 590765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 59085ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.orgstatic void HostDispatchMessageHandler(const v8::Debug::Message& message) { 590965dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org static char print_buffer[1000]; 59105ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org v8::String::Value json(message.GetJSON()); 59115ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org Utf16ToAscii(*json, json.length(), print_buffer); 5912381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org} 5913381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org 5914381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org 591565dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.orgstatic void HostDispatchDispatchHandler() { 59163d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org host_dispatch_barriers->semaphore_1.Signal(); 591765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org} 591865dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 591965dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 592065dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.orgvoid HostDispatchV8Thread::Run() { 592165dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org const char* source_1 = "var y_global = 3;\n" 592265dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org "function cat( new_value ) {\n" 592365dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org " var x = new_value;\n" 592465dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org " y_global = 4;\n" 592565dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org " x = 3 * x + 1;\n" 592665dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org " y_global = 5;\n" 592765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org " return x;\n" 592865dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org "}\n" 592965dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org "\n"; 593065dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org const char* source_2 = "cat(17);\n"; 5931bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org 5932528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Isolate::Scope isolate_scope(CcTest::isolate()); 5933381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org DebugLocalContext env; 59342bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 5935381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org 5936f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com // Set up message and host dispatch handlers. 59375ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org v8::Debug::SetMessageHandler2(HostDispatchMessageHandler); 593865dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org v8::Debug::SetHostDispatchHandler(HostDispatchDispatchHandler, 10 /* ms */); 5939381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org 594065dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org CompileRun(source_1); 594165dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org host_dispatch_barriers->barrier_1.Wait(); 594265dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org host_dispatch_barriers->barrier_2.Wait(); 594365dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org CompileRun(source_2); 594465dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org} 59453afc15871025a4736634052bd1ff4b4bb2fc2e4fsgjesse@chromium.org 5946381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org 594765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.orgvoid HostDispatchDebuggerThread::Run() { 594865dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org const int kBufSize = 1000; 594965dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org uint16_t buffer[kBufSize]; 59503afc15871025a4736634052bd1ff4b4bb2fc2e4fsgjesse@chromium.org 595165dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org const char* command_1 = "{\"seq\":101," 595265dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org "\"type\":\"request\"," 595365dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org "\"command\":\"setbreakpoint\"," 595465dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org "\"arguments\":{\"type\":\"function\",\"target\":\"cat\",\"line\":3}}"; 595565dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org const char* command_2 = "{\"seq\":102," 595665dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org "\"type\":\"request\"," 595765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org "\"command\":\"continue\"}"; 5958381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org 5959528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Isolate* isolate = CcTest::isolate(); 596065dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org // v8 thread initializes, runs source_1 596165dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org host_dispatch_barriers->barrier_1.Wait(); 596265dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org // 1: Set breakpoint in cat(). 5963528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Debug::SendCommand(isolate, buffer, AsciiToUtf16(command_1, buffer)); 596465dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 596565dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org host_dispatch_barriers->barrier_2.Wait(); 596665dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org // v8 thread starts compiling source_2. 596765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org // Break happens, to run queued commands and host dispatches. 596865dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org // Wait for host dispatch to be processed. 59693d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org host_dispatch_barriers->semaphore_1.Wait(); 597065dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org // 2: Continue evaluation 5971528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Debug::SendCommand(isolate, buffer, AsciiToUtf16(command_2, buffer)); 597265dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org} 597365dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 597465dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 597565dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.orgTEST(DebuggerHostDispatch) { 59766d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org HostDispatchDebuggerThread host_dispatch_debugger_thread; 59776d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org HostDispatchV8Thread host_dispatch_v8_thread; 597865dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org i::FLAG_debugger_auto_break = true; 597965dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 598065dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org // Create a V8 environment 598165dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org Barriers stack_allocated_host_dispatch_barriers; 598265dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org host_dispatch_barriers = &stack_allocated_host_dispatch_barriers; 59833afc15871025a4736634052bd1ff4b4bb2fc2e4fsgjesse@chromium.org 598465dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org host_dispatch_v8_thread.Start(); 598565dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org host_dispatch_debugger_thread.Start(); 598665dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 598765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org host_dispatch_v8_thread.Join(); 598865dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org host_dispatch_debugger_thread.Join(); 5989381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org} 5990bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org 5991bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org 5992c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org/* Test DebugMessageDispatch */ 5993c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org/* In this test, the V8 thread waits for a message from the debug thread. 5994c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org * The DebugMessageDispatchHandler is executed from the debugger thread 5995c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org * which signals the V8 thread to wake up. 5996c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org */ 5997c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org 5998c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.orgclass DebugMessageDispatchV8Thread : public v8::internal::Thread { 5999c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org public: 60006d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org DebugMessageDispatchV8Thread() : Thread("DebugMessageDispatchV8Thread") { } 6001c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org void Run(); 6002c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org}; 6003c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org 6004c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.orgclass DebugMessageDispatchDebuggerThread : public v8::internal::Thread { 6005c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org public: 60066d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org DebugMessageDispatchDebuggerThread() 60076d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org : Thread("DebugMessageDispatchDebuggerThread") { } 6008c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org void Run(); 6009c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org}; 6010c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org 6011c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.orgBarriers* debug_message_dispatch_barriers; 6012c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org 6013c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org 6014c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.orgstatic void DebugMessageHandler() { 60153d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org debug_message_dispatch_barriers->semaphore_1.Signal(); 6016c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org} 6017c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org 6018c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org 6019c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.orgvoid DebugMessageDispatchV8Thread::Run() { 6020528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Isolate::Scope isolate_scope(CcTest::isolate()); 6021c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org DebugLocalContext env; 60222bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 6023c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org 6024f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com // Set up debug message dispatch handler. 6025c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org v8::Debug::SetDebugMessageDispatchHandler(DebugMessageHandler); 6026c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org 6027c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org CompileRun("var y = 1 + 2;\n"); 6028c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org debug_message_dispatch_barriers->barrier_1.Wait(); 60293d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org debug_message_dispatch_barriers->semaphore_1.Wait(); 6030c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org debug_message_dispatch_barriers->barrier_2.Wait(); 6031c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org} 6032c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org 6033c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org 6034c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.orgvoid DebugMessageDispatchDebuggerThread::Run() { 6035c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org debug_message_dispatch_barriers->barrier_1.Wait(); 6036c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org SendContinueCommand(); 6037c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org debug_message_dispatch_barriers->barrier_2.Wait(); 6038c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org} 6039c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org 6040c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org 6041c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.orgTEST(DebuggerDebugMessageDispatch) { 60426d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org DebugMessageDispatchDebuggerThread debug_message_dispatch_debugger_thread; 60436d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org DebugMessageDispatchV8Thread debug_message_dispatch_v8_thread; 6044ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 6045c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org i::FLAG_debugger_auto_break = true; 6046c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org 6047c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org // Create a V8 environment 6048c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org Barriers stack_allocated_debug_message_dispatch_barriers; 6049c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org debug_message_dispatch_barriers = 6050c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org &stack_allocated_debug_message_dispatch_barriers; 6051c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org 6052c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org debug_message_dispatch_v8_thread.Start(); 6053c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org debug_message_dispatch_debugger_thread.Start(); 6054c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org 6055c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org debug_message_dispatch_v8_thread.Join(); 6056c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org debug_message_dispatch_debugger_thread.Join(); 6057c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org} 6058c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org 6059c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org 6060bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.orgTEST(DebuggerAgent) { 60617c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org v8::V8::Initialize(); 6062528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org i::Debugger* debugger = CcTest::i_isolate()->debugger(); 6063a1645e29968e70a41226edda2c49788fcea48b74ager@chromium.org // Make sure these ports is not used by other tests to allow tests to run in 6064bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org // parallel. 606533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org const int kPort1 = 5858 + FlagDependentPortOffset(); 606633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org const int kPort2 = 5857 + FlagDependentPortOffset(); 606733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org const int kPort3 = 5856 + FlagDependentPortOffset(); 6068bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org 6069a1645e29968e70a41226edda2c49788fcea48b74ager@chromium.org // Make a string with the port2 number. 6070bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org const int kPortBufferLen = 6; 6071a1645e29968e70a41226edda2c49788fcea48b74ager@chromium.org char port2_str[kPortBufferLen]; 6072a1645e29968e70a41226edda2c49788fcea48b74ager@chromium.org OS::SNPrintF(i::Vector<char>(port2_str, kPortBufferLen), "%d", kPort2); 6073bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org 6074bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org bool ok; 6075bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org 6076bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org // Test starting and stopping the agent without any client connection. 6077ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org debugger->StartAgent("test", kPort1); 6078ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org debugger->StopAgent(); 6079bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org // Test starting the agent, connecting a client and shutting down the agent 6080bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org // with the client connected. 6081ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org ok = debugger->StartAgent("test", kPort2); 6082bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org CHECK(ok); 6083ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org debugger->WaitForAgent(); 60843d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org i::Socket* client = new i::Socket; 6085a1645e29968e70a41226edda2c49788fcea48b74ager@chromium.org ok = client->Connect("localhost", port2_str); 6086bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org CHECK(ok); 60876d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org // It is important to wait for a message from the agent. Otherwise, 60886d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org // we can close the server socket during "accept" syscall, making it failing 60896d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org // (at least on Linux), and the test will work incorrectly. 60906d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org char buf; 60916d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org ok = client->Receive(&buf, 1) == 1; 60926d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org CHECK(ok); 6093ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org debugger->StopAgent(); 6094bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org delete client; 6095bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org 6096bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org // Test starting and stopping the agent with the required port already 6097bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org // occoupied. 60983d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org i::Socket* server = new i::Socket; 60993d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org ok = server->Bind(kPort3); 61003d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org CHECK(ok); 6101bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org 6102ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org debugger->StartAgent("test", kPort3); 6103ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org debugger->StopAgent(); 6104bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org 6105bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org delete server; 6106bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org} 6107bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org 6108bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org 6109bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.orgclass DebuggerAgentProtocolServerThread : public i::Thread { 6110bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org public: 61116d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org explicit DebuggerAgentProtocolServerThread(int port) 61126d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org : Thread("DebuggerAgentProtocolServerThread"), 6113ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org port_(port), 6114ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org server_(NULL), 6115ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org client_(NULL), 6116e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org listening_(0) { 6117bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org } 6118bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org ~DebuggerAgentProtocolServerThread() { 6119bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org // Close both sockets. 6120bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org delete client_; 6121bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org delete server_; 6122bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org } 6123bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org 6124bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org void Run(); 6125e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org void WaitForListening() { listening_.Wait(); } 6126bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org char* body() { return *body_; } 6127bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org 6128bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org private: 6129bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org int port_; 613083e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org i::SmartArrayPointer<char> body_; 6131bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org i::Socket* server_; // Server socket used for bind/accept. 6132bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org i::Socket* client_; // Single client connection used by the test. 6133e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org i::Semaphore listening_; // Signalled when the server is in listen mode. 6134bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org}; 6135bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org 6136bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org 6137bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.orgvoid DebuggerAgentProtocolServerThread::Run() { 6138bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org bool ok; 6139bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org 6140bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org // Create the server socket and bind it to the requested port. 61413d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org server_ = new i::Socket; 6142bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org CHECK(server_ != NULL); 6143bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org ok = server_->Bind(port_); 6144bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org CHECK(ok); 6145bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org 6146bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org // Listen for new connections. 6147bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org ok = server_->Listen(1); 6148bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org CHECK(ok); 6149e900018c7a2a695fde788911564da37535c7e736mstarzinger@chromium.org listening_.Signal(); 6150bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org 6151bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org // Accept a connection. 6152bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org client_ = server_->Accept(); 6153bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org CHECK(client_ != NULL); 6154bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org 6155bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org // Receive a debugger agent protocol message. 6156bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org i::DebuggerAgentUtil::ReceiveMessage(client_); 6157bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org} 6158bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org 6159bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org 6160bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.orgTEST(DebuggerAgentProtocolOverflowHeader) { 6161bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org // Make sure this port is not used by other tests to allow tests to run in 6162bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org // parallel. 616333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org const int kPort = 5860 + FlagDependentPortOffset(); 6164bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org static const char* kLocalhost = "localhost"; 6165bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org 6166bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org // Make a string with the port number. 6167bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org const int kPortBufferLen = 6; 6168bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org char port_str[kPortBufferLen]; 6169bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org OS::SNPrintF(i::Vector<char>(port_str, kPortBufferLen), "%d", kPort); 6170bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org 6171bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org // Create a socket server to receive a debugger agent message. 6172bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org DebuggerAgentProtocolServerThread* server = 61736d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org new DebuggerAgentProtocolServerThread(kPort); 6174bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org server->Start(); 6175bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org server->WaitForListening(); 6176bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org 6177bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org // Connect. 61783d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org i::Socket* client = new i::Socket; 6179bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org CHECK(client != NULL); 6180bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org bool ok = client->Connect(kLocalhost, port_str); 6181bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org CHECK(ok); 6182bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org 6183bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org // Send headers which overflow the receive buffer. 6184bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org static const int kBufferSize = 1000; 6185bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org char buffer[kBufferSize]; 6186bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org 6187bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org // Long key and short value: XXXX....XXXX:0\r\n. 6188bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org for (int i = 0; i < kBufferSize - 4; i++) { 6189bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org buffer[i] = 'X'; 6190bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org } 6191bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org buffer[kBufferSize - 4] = ':'; 6192bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org buffer[kBufferSize - 3] = '0'; 6193bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org buffer[kBufferSize - 2] = '\r'; 6194bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org buffer[kBufferSize - 1] = '\n'; 61953d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org int result = client->Send(buffer, kBufferSize); 61963d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org CHECK_EQ(kBufferSize, result); 6197bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org 6198bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org // Short key and long value: X:XXXX....XXXX\r\n. 6199bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org buffer[0] = 'X'; 6200bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org buffer[1] = ':'; 6201bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org for (int i = 2; i < kBufferSize - 2; i++) { 6202bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org buffer[i] = 'X'; 6203bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org } 6204bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org buffer[kBufferSize - 2] = '\r'; 6205bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org buffer[kBufferSize - 1] = '\n'; 62063d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org result = client->Send(buffer, kBufferSize); 62073d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org CHECK_EQ(kBufferSize, result); 6208bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org 6209bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org // Add empty body to request. 6210bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org const char* content_length_zero_header = "Content-Length:0\r\n"; 62113d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org int length = StrLength(content_length_zero_header); 62123d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org result = client->Send(content_length_zero_header, length); 62133d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org CHECK_EQ(length, result); 62143d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org result = client->Send("\r\n", 2); 62153d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org CHECK_EQ(2, result); 6216bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org 6217bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org // Wait until data is received. 6218bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org server->Join(); 6219bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org 6220bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org // Check for empty body. 6221bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org CHECK(server->body() == NULL); 6222bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org 6223bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org // Close the client before the server to avoid TIME_WAIT issues. 6224bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org client->Shutdown(); 6225bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org delete client; 6226bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org delete server; 6227bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org} 622841826e77311db718135ef6517b846933dfd275f3ager@chromium.org 622941826e77311db718135ef6517b846933dfd275f3ager@chromium.org 623041826e77311db718135ef6517b846933dfd275f3ager@chromium.org// Test for issue http://code.google.com/p/v8/issues/detail?id=289. 623141826e77311db718135ef6517b846933dfd275f3ager@chromium.org// Make sure that DebugGetLoadedScripts doesn't return scripts 623241826e77311db718135ef6517b846933dfd275f3ager@chromium.org// with disposed external source. 623341826e77311db718135ef6517b846933dfd275f3ager@chromium.orgclass EmptyExternalStringResource : public v8::String::ExternalStringResource { 623441826e77311db718135ef6517b846933dfd275f3ager@chromium.org public: 623541826e77311db718135ef6517b846933dfd275f3ager@chromium.org EmptyExternalStringResource() { empty_[0] = 0; } 623641826e77311db718135ef6517b846933dfd275f3ager@chromium.org virtual ~EmptyExternalStringResource() {} 623741826e77311db718135ef6517b846933dfd275f3ager@chromium.org virtual size_t length() const { return empty_.length(); } 623841826e77311db718135ef6517b846933dfd275f3ager@chromium.org virtual const uint16_t* data() const { return empty_.start(); } 623941826e77311db718135ef6517b846933dfd275f3ager@chromium.org private: 624041826e77311db718135ef6517b846933dfd275f3ager@chromium.org ::v8::internal::EmbeddedVector<uint16_t, 1> empty_; 624141826e77311db718135ef6517b846933dfd275f3ager@chromium.org}; 624241826e77311db718135ef6517b846933dfd275f3ager@chromium.org 624341826e77311db718135ef6517b846933dfd275f3ager@chromium.org 624441826e77311db718135ef6517b846933dfd275f3ager@chromium.orgTEST(DebugGetLoadedScripts) { 624541826e77311db718135ef6517b846933dfd275f3ager@chromium.org DebugLocalContext env; 62462bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 624771affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org env.ExposeDebug(); 624871affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 624941826e77311db718135ef6517b846933dfd275f3ager@chromium.org EmptyExternalStringResource source_ext_str; 62509f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.org v8::Local<v8::String> source = 62519f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.org v8::String::NewExternal(env->GetIsolate(), &source_ext_str); 6252c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org v8::Handle<v8::Script> evil_script(v8::Script::Compile(source)); 6253659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org // "use" evil_script to make the compiler happy. 6254659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org (void) evil_script; 625541826e77311db718135ef6517b846933dfd275f3ager@chromium.org Handle<i::ExternalTwoByteString> i_source( 625641826e77311db718135ef6517b846933dfd275f3ager@chromium.org i::ExternalTwoByteString::cast(*v8::Utils::OpenHandle(*source))); 625741826e77311db718135ef6517b846933dfd275f3ager@chromium.org // This situation can happen if source was an external string disposed 625841826e77311db718135ef6517b846933dfd275f3ager@chromium.org // by its owner. 625941826e77311db718135ef6517b846933dfd275f3ager@chromium.org i_source->set_resource(0); 626041826e77311db718135ef6517b846933dfd275f3ager@chromium.org 626141826e77311db718135ef6517b846933dfd275f3ager@chromium.org bool allow_natives_syntax = i::FLAG_allow_natives_syntax; 626241826e77311db718135ef6517b846933dfd275f3ager@chromium.org i::FLAG_allow_natives_syntax = true; 626341826e77311db718135ef6517b846933dfd275f3ager@chromium.org CompileRun( 626441826e77311db718135ef6517b846933dfd275f3ager@chromium.org "var scripts = %DebugGetLoadedScripts();" 626571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org "var count = scripts.length;" 626671affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org "for (var i = 0; i < count; ++i) {" 626771affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org " scripts[i].line_ends;" 626841826e77311db718135ef6517b846933dfd275f3ager@chromium.org "}"); 626941826e77311db718135ef6517b846933dfd275f3ager@chromium.org // Must not crash while accessing line_ends. 627041826e77311db718135ef6517b846933dfd275f3ager@chromium.org i::FLAG_allow_natives_syntax = allow_natives_syntax; 627171affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 627271affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org // Some scripts are retrieved - at least the number of native scripts. 6273f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org CHECK_GT((*env) 6274f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org ->Global() 6275f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org ->Get(v8::String::NewFromUtf8(env->GetIsolate(), "count")) 6276f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org ->Int32Value(), 6277f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org 8); 627841826e77311db718135ef6517b846933dfd275f3ager@chromium.org} 627965dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 628065dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 628165dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org// Test script break points set on lines. 628265dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.orgTEST(ScriptNameAndData) { 628365dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org DebugLocalContext env; 62842bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 628565dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org env.ExposeDebug(); 628665dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 628765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org // Create functions for retrieving script name and data for the function on 628865dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org // the top frame when hitting a break point. 628965dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org frame_script_name = CompileFunction(&env, 629065dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org frame_script_name_source, 629165dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org "frame_script_name"); 629265dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org frame_script_data = CompileFunction(&env, 629365dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org frame_script_data_source, 629465dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org "frame_script_data"); 62955c838251403b0be9a882540f1922577abba4c872ager@chromium.org compiled_script_data = CompileFunction(&env, 62965c838251403b0be9a882540f1922577abba4c872ager@chromium.org compiled_script_data_source, 62975c838251403b0be9a882540f1922577abba4c872ager@chromium.org "compiled_script_data"); 629865dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 6299662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(DebugEventBreakPointHitCount); 630065dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 630165dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org // Test function source. 6302f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Local<v8::String> script = v8::String::NewFromUtf8(env->GetIsolate(), 6303f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org "function f() {\n" 6304f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org " debugger;\n" 6305f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org "}\n"); 630665dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 6307f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::ScriptOrigin origin1 = 6308f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::ScriptOrigin(v8::String::NewFromUtf8(env->GetIsolate(), "name")); 630965dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org v8::Handle<v8::Script> script1 = v8::Script::Compile(script, &origin1); 6310f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org script1->SetData(v8::String::NewFromUtf8(env->GetIsolate(), "data")); 631165dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org script1->Run(); 631265dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org v8::Local<v8::Function> f; 6313f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org f = v8::Local<v8::Function>::Cast( 6314f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "f"))); 631565dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 631665dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org f->Call(env->Global(), 0, NULL); 631765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org CHECK_EQ(1, break_point_hit_count); 631865dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org CHECK_EQ("name", last_script_name_hit); 631965dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org CHECK_EQ("data", last_script_data_hit); 632065dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org 632171affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org // Compile the same script again without setting data. As the compilation 632271affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org // cache is disabled when debugging expect the data to be missing. 632371affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org v8::Script::Compile(script, &origin1)->Run(); 6324f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org f = v8::Local<v8::Function>::Cast( 6325f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "f"))); 632671affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org f->Call(env->Global(), 0, NULL); 632771affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org CHECK_EQ(2, break_point_hit_count); 632871affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org CHECK_EQ("name", last_script_name_hit); 632971affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org CHECK_EQ("", last_script_data_hit); // Undefined results in empty string. 633071affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 6331f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Local<v8::String> data_obj_source = v8::String::NewFromUtf8( 6332f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org env->GetIsolate(), 6333f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org "({ a: 'abc',\n" 6334f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org " b: 123,\n" 6335f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org " toString: function() { return this.a + ' ' + this.b; }\n" 6336f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org "})\n"); 633765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org v8::Local<v8::Value> data_obj = v8::Script::Compile(data_obj_source)->Run(); 6338f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::ScriptOrigin origin2 = 6339f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::ScriptOrigin(v8::String::NewFromUtf8(env->GetIsolate(), "new name")); 634065dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org v8::Handle<v8::Script> script2 = v8::Script::Compile(script, &origin2); 634165dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org script2->Run(); 6342499aaa52a876ef8e8b81ac115cafb969eb585c96sgjesse@chromium.org script2->SetData(data_obj->ToString()); 6343f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org f = v8::Local<v8::Function>::Cast( 6344f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "f"))); 634565dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org f->Call(env->Global(), 0, NULL); 634671affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org CHECK_EQ(3, break_point_hit_count); 634765dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org CHECK_EQ("new name", last_script_name_hit); 634865dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org CHECK_EQ("abc 123", last_script_data_hit); 63495c838251403b0be9a882540f1922577abba4c872ager@chromium.org 6350f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Handle<v8::Script> script3 = v8::Script::Compile( 6351f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org script, &origin2, NULL, 6352f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::String::NewFromUtf8(env->GetIsolate(), "in compile")); 63535c838251403b0be9a882540f1922577abba4c872ager@chromium.org CHECK_EQ("in compile", last_script_data_hit); 63545c838251403b0be9a882540f1922577abba4c872ager@chromium.org script3->Run(); 6355f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org f = v8::Local<v8::Function>::Cast( 6356f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "f"))); 63575c838251403b0be9a882540f1922577abba4c872ager@chromium.org f->Call(env->Global(), 0, NULL); 63585c838251403b0be9a882540f1922577abba4c872ager@chromium.org CHECK_EQ(4, break_point_hit_count); 63595c838251403b0be9a882540f1922577abba4c872ager@chromium.org CHECK_EQ("in compile", last_script_data_hit); 636065dad4b091d2925543c6326db635d0f7cf9e1edcager@chromium.org} 63619085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org 63629085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org 636357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.orgstatic v8::Handle<v8::Context> expected_context; 63649085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.orgstatic v8::Handle<v8::Value> expected_context_data; 63659085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org 63669085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org 63679085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org// Check that the expected context is the one generating the debug event. 63689085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.orgstatic void ContextCheckMessageHandler(const v8::Debug::Message& message) { 63699085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org CHECK(message.GetEventContext() == expected_context); 637046a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org CHECK(message.GetEventContext()->GetEmbedderData(0)->StrictEquals( 63719085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org expected_context_data)); 63729085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org message_handler_hit_count++; 63739085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org 63749d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com static char print_buffer[1000]; 63759d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com v8::String::Value json(message.GetJSON()); 63769d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com Utf16ToAscii(*json, json.length(), print_buffer); 63779d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com 63789085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org // Send a continue command for break events. 63799d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com if (IsBreakEventMessage(print_buffer)) { 638071affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org SendContinueCommand(); 63819085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org } 63829085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org} 63839085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org 63849085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org 63859085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org// Test which creates two contexts and sets different embedder data on each. 63869085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org// Checks that this data is set correctly and that when the debug message 63879085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org// handler is called the expected context is the one active. 63889085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.orgTEST(ContextData) { 6389528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Isolate* isolate = CcTest::isolate(); 639057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org v8::HandleScope scope(isolate); 63919085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org 63929085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org // Create two contexts. 639357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org v8::Handle<v8::Context> context_1; 639457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org v8::Handle<v8::Context> context_2; 63959085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org v8::Handle<v8::ObjectTemplate> global_template = 63969085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org v8::Handle<v8::ObjectTemplate>(); 63979085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org v8::Handle<v8::Value> global_object = v8::Handle<v8::Value>(); 639857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org context_1 = v8::Context::New(isolate, NULL, global_template, global_object); 639957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org context_2 = v8::Context::New(isolate, NULL, global_template, global_object); 64009085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org 6401e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org v8::Debug::SetMessageHandler2(ContextCheckMessageHandler); 6402e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 64039085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org // Default data value is undefined. 640446a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org CHECK(context_1->GetEmbedderData(0)->IsUndefined()); 640546a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org CHECK(context_2->GetEmbedderData(0)->IsUndefined()); 64069085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org 64079085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org // Set and check different data values. 6408f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Handle<v8::String> data_1 = v8::String::NewFromUtf8(isolate, "1"); 6409f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Handle<v8::String> data_2 = v8::String::NewFromUtf8(isolate, "2"); 641046a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org context_1->SetEmbedderData(0, data_1); 641146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org context_2->SetEmbedderData(0, data_2); 641246a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org CHECK(context_1->GetEmbedderData(0)->StrictEquals(data_1)); 641346a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org CHECK(context_2->GetEmbedderData(0)->StrictEquals(data_2)); 64149085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org 64159085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org // Simple test function which causes a break. 64169085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org const char* source = "function f() { debugger; }"; 64179085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org 64189085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org // Enter and run function in the first context. 64199085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org { 64209085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org v8::Context::Scope context_scope(context_1); 64219085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org expected_context = context_1; 64229085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org expected_context_data = data_1; 6423f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Local<v8::Function> f = CompileFunction(isolate, source, "f"); 64249085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org f->Call(context_1->Global(), 0, NULL); 64259085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org } 64269085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org 64279085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org 64289085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org // Enter and run function in the second context. 64299085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org { 64309085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org v8::Context::Scope context_scope(context_2); 64319085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org expected_context = context_2; 64329085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org expected_context_data = data_2; 6433f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Local<v8::Function> f = CompileFunction(isolate, source, "f"); 64349085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org f->Call(context_2->Global(), 0, NULL); 64359085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org } 64369085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org 64379085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org // Two times compile event and two times break event. 64389085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org CHECK_GT(message_handler_hit_count, 4); 643971affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 644071affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org v8::Debug::SetMessageHandler2(NULL); 644171affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org CheckDebuggerUnloaded(); 644271affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org} 644371affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 644471affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 6445755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org// Debug message handler which issues a debug break when it hits a break event. 6446755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.orgstatic int message_handler_break_hit_count = 0; 6447755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.orgstatic void DebugBreakMessageHandler(const v8::Debug::Message& message) { 6448755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org // Schedule a debug break for break events. 6449755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org if (message.IsEvent() && message.GetEvent() == v8::Break) { 6450755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org message_handler_break_hit_count++; 6451755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org if (message_handler_break_hit_count == 1) { 6452528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Debug::DebugBreak(message.GetIsolate()); 6453755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org } 6454755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org } 6455755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 6456755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org // Issue a continue command if this event will not cause the VM to start 6457755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org // running. 6458755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org if (!message.WillStartRunning()) { 6459755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org SendContinueCommand(); 6460755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org } 6461755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org} 6462755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 6463755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 6464755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org// Test that a debug break can be scheduled while in a message handler. 6465755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.orgTEST(DebugBreakInMessageHandler) { 6466755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org DebugLocalContext env; 64672bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 6468755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 6469755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org v8::Debug::SetMessageHandler2(DebugBreakMessageHandler); 6470755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 6471755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org // Test functions. 6472e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org const char* script = "function f() { debugger; g(); } function g() { }"; 6473755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org CompileRun(script); 6474f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Local<v8::Function> f = v8::Local<v8::Function>::Cast( 6475f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "f"))); 6476f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Local<v8::Function> g = v8::Local<v8::Function>::Cast( 6477f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "g"))); 6478755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 6479755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org // Call f then g. The debugger statement in f will casue a break which will 6480755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org // cause another break. 6481755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org f->Call(env->Global(), 0, NULL); 6482755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org CHECK_EQ(2, message_handler_break_hit_count); 6483755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org // Calling g will not cause any additional breaks. 6484755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org g->Call(env->Global(), 0, NULL); 6485755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org CHECK_EQ(2, message_handler_break_hit_count); 6486755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org} 6487755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 6488755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 6489c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org#ifndef V8_INTERPRETED_REGEXP 6490755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org// Debug event handler which gets the function on the top frame and schedules a 6491755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org// break a number of times. 6492755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.orgstatic void DebugEventDebugBreak( 6493662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org const v8::Debug::EventDetails& event_details) { 6494662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::DebugEvent event = event_details.GetEvent(); 6495662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Handle<v8::Object> exec_state = event_details.GetExecutionState(); 6496755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 6497755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org if (event == v8::Break) { 6498755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org break_point_hit_count++; 6499755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 6500755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org // Get the name of the top frame function. 6501755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org if (!frame_function_name.IsEmpty()) { 6502755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org // Get the name of the function. 6503a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org const int argc = 2; 6504a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org v8::Handle<v8::Value> argv[argc] = { exec_state, v8::Integer::New(0) }; 6505755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org v8::Handle<v8::Value> result = frame_function_name->Call(exec_state, 6506755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org argc, argv); 6507755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org if (result->IsUndefined()) { 6508755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org last_function_hit[0] = '\0'; 6509755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org } else { 6510755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org CHECK(result->IsString()); 6511755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org v8::Handle<v8::String> function_name(result->ToString()); 651257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org function_name->WriteUtf8(last_function_hit); 6513755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org } 6514755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org } 6515755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 6516755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org // Keep forcing breaks. 6517755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org if (break_point_hit_count < 20) { 6518528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Debug::DebugBreak(CcTest::isolate()); 6519755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org } 6520755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org } 6521755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org} 6522755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 6523755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 6524755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.orgTEST(RegExpDebugBreak) { 652568ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org // This test only applies to native regexps. 6526755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org DebugLocalContext env; 65272bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 6528755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 6529755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org // Create a function for checking the function when hitting a break point. 6530755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org frame_function_name = CompileFunction(&env, 6531755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org frame_function_name_source, 6532755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org "frame_function_name"); 6533755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 6534755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org // Test RegExp which matches white spaces and comments at the begining of a 6535755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org // source line. 6536755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org const char* script = 6537755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org "var sourceLineBeginningSkip = /^(?:[ \\v\\h]*(?:\\/\\*.*?\\*\\/)*)*/;\n" 6538755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org "function f(s) { return s.match(sourceLineBeginningSkip)[0].length; }"; 6539755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 6540f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Local<v8::Function> f = CompileFunction(env->GetIsolate(), script, "f"); 6541755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org const int argc = 1; 6542f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Handle<v8::Value> argv[argc] = { 6543f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::String::NewFromUtf8(env->GetIsolate(), " /* xxx */ a=0;")}; 6544755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org v8::Local<v8::Value> result = f->Call(env->Global(), argc, argv); 6545755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org CHECK_EQ(12, result->Int32Value()); 6546755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 6547662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(DebugEventDebugBreak); 6548528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Debug::DebugBreak(env->GetIsolate()); 6549755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org result = f->Call(env->Global(), argc, argv); 6550755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 6551e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org // Check that there was only one break event. Matching RegExp should not 6552e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org // cause Break events. 6553e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org CHECK_EQ(1, break_point_hit_count); 6554e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org CHECK_EQ("f", last_function_hit); 6555755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org} 6556c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org#endif // V8_INTERPRETED_REGEXP 6557755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 6558755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 655971affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org// Common part of EvalContextData and NestedBreakEventContextData tests. 6560e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.orgstatic void ExecuteScriptForContextCheck( 6561e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org v8::Debug::MessageHandler2 message_handler) { 656271affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org // Create a context. 656357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org v8::Handle<v8::Context> context_1; 656471affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org v8::Handle<v8::ObjectTemplate> global_template = 656571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org v8::Handle<v8::ObjectTemplate>(); 656657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org context_1 = 6567528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Context::New(CcTest::isolate(), NULL, global_template); 656871affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 6569e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org v8::Debug::SetMessageHandler2(message_handler); 6570e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 657171affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org // Default data value is undefined. 657246a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org CHECK(context_1->GetEmbedderData(0)->IsUndefined()); 657371affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 657471affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org // Set and check a data value. 6575f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Handle<v8::String> data_1 = 6576f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::String::NewFromUtf8(CcTest::isolate(), "1"); 657746a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org context_1->SetEmbedderData(0, data_1); 657846a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org CHECK(context_1->GetEmbedderData(0)->StrictEquals(data_1)); 657971affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 658071affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org // Simple test function with eval that causes a break. 658171affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org const char* source = "function f() { eval('debugger;'); }"; 658271affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 658371affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org // Enter and run function in the context. 658471affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org { 658571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org v8::Context::Scope context_scope(context_1); 6586f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org expected_context = context_1; 658771affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org expected_context_data = data_1; 6588f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Local<v8::Function> f = CompileFunction(CcTest::isolate(), source, "f"); 658971affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org f->Call(context_1->Global(), 0, NULL); 659071affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org } 6591e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 6592e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org v8::Debug::SetMessageHandler2(NULL); 659371affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org} 659471affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 659571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 659671affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org// Test which creates a context and sets embedder data on it. Checks that this 659771affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org// data is set correctly and that when the debug message handler is called for 659871affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org// break event in an eval statement the expected context is the one returned by 659971affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org// Message.GetEventContext. 660071affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgTEST(EvalContextData) { 6601528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::HandleScope scope(CcTest::isolate()); 660271affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 6603e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org ExecuteScriptForContextCheck(ContextCheckMessageHandler); 660471affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 660571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org // One time compile event and one time break event. 660671affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org CHECK_GT(message_handler_hit_count, 2); 660771affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org CheckDebuggerUnloaded(); 660871affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org} 660971affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 661071affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 661171affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgstatic bool sent_eval = false; 661271affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgstatic int break_count = 0; 661371affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgstatic int continue_command_send_count = 0; 661471affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org// Check that the expected context is the one generating the debug event 661571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org// including the case of nested break event. 661671affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgstatic void DebugEvalContextCheckMessageHandler( 661771affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org const v8::Debug::Message& message) { 661871affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org CHECK(message.GetEventContext() == expected_context); 661946a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org CHECK(message.GetEventContext()->GetEmbedderData(0)->StrictEquals( 662071affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org expected_context_data)); 662171affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org message_handler_hit_count++; 662271affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 66239d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com static char print_buffer[1000]; 66249d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com v8::String::Value json(message.GetJSON()); 66259d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com Utf16ToAscii(*json, json.length(), print_buffer); 66269d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com 6627528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Isolate* isolate = message.GetIsolate(); 66289d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com if (IsBreakEventMessage(print_buffer)) { 662971affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org break_count++; 663071affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org if (!sent_eval) { 663171affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org sent_eval = true; 663271affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 663371affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org const int kBufferSize = 1000; 663471affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org uint16_t buffer[kBufferSize]; 663571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org const char* eval_command = 6636fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org "{\"seq\":0," 6637fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org "\"type\":\"request\"," 6638fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org "\"command\":\"evaluate\"," 6639fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org "\"arguments\":{\"expression\":\"debugger;\"," 6640fb144a0716afe7ab8bf245f2391a9e53b3db3c89fschneider@chromium.org "\"global\":true,\"disable_break\":false}}"; 664171affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 664271affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org // Send evaluate command. 6643528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Debug::SendCommand( 6644528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org isolate, buffer, AsciiToUtf16(eval_command, buffer)); 664571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org return; 664671affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org } else { 664771affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org // It's a break event caused by the evaluation request above. 664871affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org SendContinueCommand(); 664971affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org continue_command_send_count++; 665071affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org } 66519d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com } else if (IsEvaluateResponseMessage(print_buffer) && 66529d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com continue_command_send_count < 2) { 665371affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org // Response to the evaluation request. We're still on the breakpoint so 665471affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org // send continue. 665571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org SendContinueCommand(); 665671affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org continue_command_send_count++; 665771affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org } 665871affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org} 665971affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 666071affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 666171affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org// Tests that context returned for break event is correct when the event occurs 666271affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org// in 'evaluate' debugger request. 666371affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgTEST(NestedBreakEventContextData) { 6664528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::HandleScope scope(CcTest::isolate()); 666571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org break_count = 0; 666671affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org message_handler_hit_count = 0; 666771affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 6668e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org ExecuteScriptForContextCheck(DebugEvalContextCheckMessageHandler); 666971affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 667071affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org // One time compile event and two times break event. 667171affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org CHECK_GT(message_handler_hit_count, 3); 667271affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 667371affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org // One break from the source and another from the evaluate request. 667471affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org CHECK_EQ(break_count, 2); 667571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org CheckDebuggerUnloaded(); 667671affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org} 667771affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 667871affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 667971affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org// Debug event listener which counts the script collected events. 668071affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgint script_collected_count = 0; 6681662436e7b124b3535773535c671c53db322070b5verwaest@chromium.orgstatic void DebugEventScriptCollectedEvent( 6682662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org const v8::Debug::EventDetails& event_details) { 6683662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::DebugEvent event = event_details.GetEvent(); 668471affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org // Count the number of breaks. 668571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org if (event == v8::ScriptCollected) { 668671affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org script_collected_count++; 668771affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org } 668871affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org} 668971affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 669071affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 669171affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org// Test that scripts collected are reported through the debug event listener. 669271affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgTEST(ScriptCollectedEvent) { 6693528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::internal::Debug* debug = CcTest::i_isolate()->debug(); 669471affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org break_point_hit_count = 0; 669571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org script_collected_count = 0; 669671affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org DebugLocalContext env; 66972bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 669871affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 669971affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org // Request the loaded scripts to initialize the debugger script cache. 6700ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org debug->GetLoadedScripts(); 670171affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 670271affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org // Do garbage collection to ensure that only the script in this test will be 670371affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org // collected afterwards. 6704528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org CcTest::heap()->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask); 670571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 670671affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org script_collected_count = 0; 6707662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(DebugEventScriptCollectedEvent); 670871affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org { 6709f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Script::Compile( 6710f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::String::NewFromUtf8(env->GetIsolate(), "eval('a=1')"))->Run(); 6711f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Script::Compile( 6712f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::String::NewFromUtf8(env->GetIsolate(), "eval('a=2')"))->Run(); 671371affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org } 671471affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 671571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org // Do garbage collection to collect the script above which is no longer 671671affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org // referenced. 6717528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org CcTest::heap()->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask); 671871affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 671971affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org CHECK_EQ(2, script_collected_count); 672071affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 6721662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(NULL); 672271affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org CheckDebuggerUnloaded(); 672371affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org} 672471affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 672571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 672671affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org// Debug event listener which counts the script collected events. 672771affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgint script_collected_message_count = 0; 672871affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgstatic void ScriptCollectedMessageHandler(const v8::Debug::Message& message) { 672971affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org // Count the number of scripts collected. 673071affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org if (message.IsEvent() && message.GetEvent() == v8::ScriptCollected) { 673171affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org script_collected_message_count++; 673271affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org v8::Handle<v8::Context> context = message.GetEventContext(); 673371affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org CHECK(context.IsEmpty()); 673471affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org } 673571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org} 673671affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 673771affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 673871affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org// Test that GetEventContext doesn't fail and return empty handle for 673971affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org// ScriptCollected events. 674071affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgTEST(ScriptCollectedEventContext) { 67411510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org i::FLAG_stress_compaction = false; 6742528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Isolate* isolate = CcTest::isolate(); 67432bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::internal::Debug* debug = 67442bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org reinterpret_cast<v8::internal::Isolate*>(isolate)->debug(); 674571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org script_collected_message_count = 0; 67462bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(isolate); 674771affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 674857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org v8::Persistent<v8::Context> context; 674957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org { 675057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org v8::HandleScope scope(isolate); 675157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org context.Reset(isolate, v8::Context::New(isolate)); 675257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org } 6753c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 6754c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org // Enter context. We can't have a handle to the context in the outer 6755c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org // scope, so we have to do it the hard way. 6756c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org { 6757c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org v8::HandleScope scope(isolate); 6758c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org v8::Local<v8::Context> local_context = 6759c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org v8::Local<v8::Context>::New(isolate, context); 6760c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org local_context->Enter(); 6761c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org } 676271affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 676357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org // Request the loaded scripts to initialize the debugger script cache. 676457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org debug->GetLoadedScripts(); 676571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 676657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org // Do garbage collection to ensure that only the script in this test will be 676757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org // collected afterwards. 6768528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org CcTest::heap()->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask); 676971affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 677057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org v8::Debug::SetMessageHandler2(ScriptCollectedMessageHandler); 6771f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Script::Compile(v8::String::NewFromUtf8(isolate, "eval('a=1')"))->Run(); 6772f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Script::Compile(v8::String::NewFromUtf8(isolate, "eval('a=2')"))->Run(); 677357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org 6774c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org // Leave context 6775c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org { 6776c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org v8::HandleScope scope(isolate); 6777c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org v8::Local<v8::Context> local_context = 6778c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org v8::Local<v8::Context>::New(isolate, context); 6779c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org local_context->Exit(); 6780c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org } 6781f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org context.Reset(); 678271affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 678371affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org // Do garbage collection to collect the script above which is no longer 678471affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org // referenced. 6785528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org CcTest::heap()->CollectAllGarbage(Heap::kAbortIncrementalMarkingMask); 678671affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 678771affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org CHECK_EQ(2, script_collected_message_count); 678871affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 678971affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org v8::Debug::SetMessageHandler2(NULL); 679071affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org} 679171affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 679271affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 679371affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org// Debug event listener which counts the after compile events. 679471affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgint after_compile_message_count = 0; 679571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgstatic void AfterCompileMessageHandler(const v8::Debug::Message& message) { 679671affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org // Count the number of scripts collected. 679771affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org if (message.IsEvent()) { 679871affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org if (message.GetEvent() == v8::AfterCompile) { 679971affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org after_compile_message_count++; 680071affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org } else if (message.GetEvent() == v8::Break) { 680171affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org SendContinueCommand(); 680271affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org } 680371affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org } 680471affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org} 680571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 680671affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 680771affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org// Tests that after compile event is sent as many times as there are scripts 680871affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org// compiled. 680971affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgTEST(AfterCompileMessageWhenMessageHandlerIsReset) { 681071affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org DebugLocalContext env; 68112bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 681271affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org after_compile_message_count = 0; 681371affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org const char* script = "var a=1"; 681471affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 681571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org v8::Debug::SetMessageHandler2(AfterCompileMessageHandler); 6816f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Script::Compile(v8::String::NewFromUtf8(env->GetIsolate(), script)) 6817f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org ->Run(); 681871affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org v8::Debug::SetMessageHandler2(NULL); 681971affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 682071affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org v8::Debug::SetMessageHandler2(AfterCompileMessageHandler); 6821528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Debug::DebugBreak(env->GetIsolate()); 6822f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Script::Compile(v8::String::NewFromUtf8(env->GetIsolate(), script)) 6823f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org ->Run(); 682471affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 682571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org // Setting listener to NULL should cause debugger unload. 682671affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org v8::Debug::SetMessageHandler2(NULL); 682771affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org CheckDebuggerUnloaded(); 682871affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 682971affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org // Compilation cache should be disabled when debugger is active. 683071affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org CHECK_EQ(2, after_compile_message_count); 683171affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org} 683271affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 683371affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 683471affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org// Tests that break event is sent when message handler is reset. 683571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgTEST(BreakMessageWhenMessageHandlerIsReset) { 683671affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org DebugLocalContext env; 68372bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 683871affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org after_compile_message_count = 0; 683971affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org const char* script = "function f() {};"; 684071affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 684171affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org v8::Debug::SetMessageHandler2(AfterCompileMessageHandler); 6842f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Script::Compile(v8::String::NewFromUtf8(env->GetIsolate(), script)) 6843f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org ->Run(); 684471affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org v8::Debug::SetMessageHandler2(NULL); 684571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 684671affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org v8::Debug::SetMessageHandler2(AfterCompileMessageHandler); 6847528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Debug::DebugBreak(env->GetIsolate()); 6848f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Local<v8::Function> f = v8::Local<v8::Function>::Cast( 6849f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "f"))); 685071affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org f->Call(env->Global(), 0, NULL); 685171affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 685271affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org // Setting message handler to NULL should cause debugger unload. 685371affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org v8::Debug::SetMessageHandler2(NULL); 685471affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org CheckDebuggerUnloaded(); 685571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 685671affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org // Compilation cache should be disabled when debugger is active. 685771affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org CHECK_EQ(1, after_compile_message_count); 685871affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org} 685971affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 686071affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 686171affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgstatic int exception_event_count = 0; 686271affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgstatic void ExceptionMessageHandler(const v8::Debug::Message& message) { 686371affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org if (message.IsEvent() && message.GetEvent() == v8::Exception) { 686471affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org exception_event_count++; 686571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org SendContinueCommand(); 686671affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org } 686771affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org} 686871affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 686971affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 687071affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org// Tests that exception event is sent when message handler is reset. 687171affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgTEST(ExceptionMessageWhenMessageHandlerIsReset) { 687271affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org DebugLocalContext env; 68732bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 6874d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org 6875d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org // For this test, we want to break on uncaught exceptions: 6876d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org ChangeBreakOnException(false, true); 6877d2c22f0121ebc55ee26a9e742f0fd7c0b8397730kmillikin@chromium.org 687871affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org exception_event_count = 0; 687971affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org const char* script = "function f() {throw new Error()};"; 688071affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 688171affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org v8::Debug::SetMessageHandler2(AfterCompileMessageHandler); 6882f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Script::Compile(v8::String::NewFromUtf8(env->GetIsolate(), script)) 6883f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org ->Run(); 688471affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org v8::Debug::SetMessageHandler2(NULL); 688571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 688671affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org v8::Debug::SetMessageHandler2(ExceptionMessageHandler); 6887f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Local<v8::Function> f = v8::Local<v8::Function>::Cast( 6888f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org env->Global()->Get(v8::String::NewFromUtf8(env->GetIsolate(), "f"))); 688971affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org f->Call(env->Global(), 0, NULL); 689071affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 689171affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org // Setting message handler to NULL should cause debugger unload. 689271affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org v8::Debug::SetMessageHandler2(NULL); 689371affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org CheckDebuggerUnloaded(); 689471affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 689571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org CHECK_EQ(1, exception_event_count); 68969085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org} 68975aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 68985aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 68995aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org// Tests after compile event is sent when there are some provisional 69005aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org// breakpoints out of the scripts lines range. 69015aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgTEST(ProvisionalBreakpointOnLineOutOfRange) { 69025aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org DebugLocalContext env; 69032bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 69045aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org env.ExposeDebug(); 69055aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org const char* script = "function f() {};"; 69065aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org const char* resource_name = "test_resource"; 69075aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 69085aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org // Set a couple of provisional breakpoint on lines out of the script lines 69095aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org // range. 6910f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org int sbp1 = SetScriptBreakPointByNameFromJS(env->GetIsolate(), resource_name, 6911f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org 3, -1 /* no column */); 6912f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org int sbp2 = 6913f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org SetScriptBreakPointByNameFromJS(env->GetIsolate(), resource_name, 5, 5); 69145aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 69155aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org after_compile_message_count = 0; 69165aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org v8::Debug::SetMessageHandler2(AfterCompileMessageHandler); 69175aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 69185aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org v8::ScriptOrigin origin( 6919f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::String::NewFromUtf8(env->GetIsolate(), resource_name), 69205aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org v8::Integer::New(10), 69215aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org v8::Integer::New(1)); 69225aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org // Compile a script whose first line number is greater than the breakpoints' 69235aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org // lines. 6924f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Script::Compile(v8::String::NewFromUtf8(env->GetIsolate(), script), 6925f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org &origin)->Run(); 69265aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 69275aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org // If the script is compiled successfully there is exactly one after compile 69285aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org // event. In case of an exception in debugger code after compile event is not 69295aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org // sent. 69305aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org CHECK_EQ(1, after_compile_message_count); 69315aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org 6932f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org ClearBreakPointFromJS(env->GetIsolate(), sbp1); 6933f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org ClearBreakPointFromJS(env->GetIsolate(), sbp2); 69345aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org v8::Debug::SetMessageHandler2(NULL); 69355aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org} 6936e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org 6937e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org 6938e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.orgstatic void BreakMessageHandler(const v8::Debug::Message& message) { 6939528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org i::Isolate* isolate = CcTest::i_isolate(); 6940e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org if (message.IsEvent() && message.GetEvent() == v8::Break) { 6941e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org // Count the number of breaks. 6942e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org break_point_hit_count++; 6943e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org 69442bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org i::HandleScope scope(isolate); 6945659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org message.GetJSON(); 6946e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org 6947e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org SendContinueCommand(); 6948e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org } else if (message.IsEvent() && message.GetEvent() == v8::AfterCompile) { 69492bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org i::HandleScope scope(isolate); 6950e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org 6951ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org bool is_debug_break = isolate->stack_guard()->IsDebugBreak(); 6952e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org // Force DebugBreak flag while serializer is working. 6953ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org isolate->stack_guard()->DebugBreak(); 6954e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org 6955e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org // Force serialization to trigger some internal JS execution. 6956659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org message.GetJSON(); 6957e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org 6958e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org // Restore previous state. 6959e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org if (is_debug_break) { 6960ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org isolate->stack_guard()->DebugBreak(); 6961e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org } else { 6962ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org isolate->stack_guard()->Continue(i::DEBUGBREAK); 6963e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org } 6964e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org } 6965e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org} 6966e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org 6967e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org 6968e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org// Test that if DebugBreak is forced it is ignored when code from 6969e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org// debug-delay.js is executed. 6970e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.orgTEST(NoDebugBreakInAfterCompileMessageHandler) { 6971e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org DebugLocalContext env; 69722bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 6973e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org 6974e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org // Register a debug event listener which sets the break flag and counts. 6975e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org v8::Debug::SetMessageHandler2(BreakMessageHandler); 6976e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org 6977e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org // Set the debug break flag. 6978528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Debug::DebugBreak(env->GetIsolate()); 6979e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org 6980e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org // Create a function for testing stepping. 6981e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org const char* src = "function f() { eval('var x = 10;'); } "; 6982e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org v8::Local<v8::Function> f = CompileFunction(&env, src, "f"); 6983e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org 6984e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org // There should be only one break event. 6985e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org CHECK_EQ(1, break_point_hit_count); 6986e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org 6987e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org // Set the debug break flag again. 6988528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Debug::DebugBreak(env->GetIsolate()); 6989e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org f->Call(env->Global(), 0, NULL); 6990e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org // There should be one more break event when the script is evaluated in 'f'. 6991e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org CHECK_EQ(2, break_point_hit_count); 6992e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org 6993e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org // Get rid of the debug message handler. 6994e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org v8::Debug::SetMessageHandler2(NULL); 6995e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org CheckDebuggerUnloaded(); 6996e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org} 6997911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 6998911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 6999b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgstatic int counting_message_handler_counter; 7000b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 7001b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgstatic void CountingMessageHandler(const v8::Debug::Message& message) { 7002b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org counting_message_handler_counter++; 7003b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org} 7004b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 7005e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 7006b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org// Test that debug messages get processed when ProcessDebugMessages is called. 7007b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgTEST(ProcessDebugMessages) { 7008b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org DebugLocalContext env; 7009528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Isolate* isolate = env->GetIsolate(); 7010528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::HandleScope scope(isolate); 7011b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 7012b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org counting_message_handler_counter = 0; 7013b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 7014b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org v8::Debug::SetMessageHandler2(CountingMessageHandler); 7015b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 7016b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org const int kBufferSize = 1000; 7017b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org uint16_t buffer[kBufferSize]; 7018b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org const char* scripts_command = 7019b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org "{\"seq\":0," 7020b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org "\"type\":\"request\"," 7021b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org "\"command\":\"scripts\"}"; 7022b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 7023b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org // Send scripts command. 7024528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Debug::SendCommand( 7025528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org isolate, buffer, AsciiToUtf16(scripts_command, buffer)); 7026b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 7027b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org CHECK_EQ(0, counting_message_handler_counter); 7028b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org v8::Debug::ProcessDebugMessages(); 7029b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org // At least one message should come 7030b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org CHECK_GE(counting_message_handler_counter, 1); 7031b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 7032b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org counting_message_handler_counter = 0; 7033b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 7034528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Debug::SendCommand( 7035528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org isolate, buffer, AsciiToUtf16(scripts_command, buffer)); 7036528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Debug::SendCommand( 7037528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org isolate, buffer, AsciiToUtf16(scripts_command, buffer)); 7038b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org CHECK_EQ(0, counting_message_handler_counter); 7039b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org v8::Debug::ProcessDebugMessages(); 7040b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org // At least two messages should come 7041b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org CHECK_GE(counting_message_handler_counter, 2); 7042b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 7043b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org // Get rid of the debug message handler. 7044b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org v8::Debug::SetMessageHandler2(NULL); 7045b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org CheckDebuggerUnloaded(); 7046b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org} 7047b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 7048b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 7049ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgstruct BacktraceData { 7050b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org static int frame_counter; 7051b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org static void MessageHandler(const v8::Debug::Message& message) { 7052b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org char print_buffer[1000]; 7053b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org v8::String::Value json(message.GetJSON()); 7054b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org Utf16ToAscii(*json, json.length(), print_buffer, 1000); 7055b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 7056b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org if (strstr(print_buffer, "backtrace") == NULL) { 7057b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org return; 7058b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org } 7059b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org frame_counter = GetTotalFramesInt(print_buffer); 7060b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org } 7061b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org}; 7062b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 7063ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.orgint BacktraceData::frame_counter; 7064b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 7065b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 7066b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org// Test that debug messages get processed when ProcessDebugMessages is called. 7067b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgTEST(Backtrace) { 7068b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org DebugLocalContext env; 7069528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Isolate* isolate = env->GetIsolate(); 7070528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::HandleScope scope(isolate); 7071b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 7072ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org v8::Debug::SetMessageHandler2(BacktraceData::MessageHandler); 7073b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 7074b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org const int kBufferSize = 1000; 7075b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org uint16_t buffer[kBufferSize]; 7076b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org const char* scripts_command = 7077b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org "{\"seq\":0," 7078b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org "\"type\":\"request\"," 7079b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org "\"command\":\"backtrace\"}"; 7080b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 7081b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org // Check backtrace from ProcessDebugMessages. 7082ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org BacktraceData::frame_counter = -10; 7083528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Debug::SendCommand( 7084528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org isolate, 7085528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org buffer, 7086528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org AsciiToUtf16(scripts_command, buffer), 7087528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org NULL); 7088b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org v8::Debug::ProcessDebugMessages(); 7089ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org CHECK_EQ(BacktraceData::frame_counter, 0); 7090b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 7091f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Handle<v8::String> void0 = 7092f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::String::NewFromUtf8(env->GetIsolate(), "void(0)"); 7093b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org v8::Handle<v8::Script> script = v8::Script::Compile(void0, void0); 7094b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 7095b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org // Check backtrace from "void(0)" script. 7096ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org BacktraceData::frame_counter = -10; 7097528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Debug::SendCommand( 7098528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org isolate, 7099528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org buffer, 7100528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org AsciiToUtf16(scripts_command, buffer), 7101528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org NULL); 7102b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org script->Run(); 7103ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org CHECK_EQ(BacktraceData::frame_counter, 1); 7104b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 7105b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org // Get rid of the debug message handler. 7106b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org v8::Debug::SetMessageHandler2(NULL); 7107b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org CheckDebuggerUnloaded(); 7108b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org} 7109b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 7110b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 7111911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.orgTEST(GetMirror) { 7112911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org DebugLocalContext env; 71132bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 7114f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Handle<v8::Value> obj = 7115f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Debug::GetMirror(v8::String::NewFromUtf8(env->GetIsolate(), "hodja")); 7116f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Handle<v8::Function> run_test = 7117f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Handle<v8::Function>::Cast(v8::Script::New( 7118f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::String::NewFromUtf8( 7119f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org env->GetIsolate(), 7120911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org "function runTest(mirror) {" 7121911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org " return mirror.isString() && (mirror.length() == 5);" 7122911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org "}" 7123911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org "" 7124911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org "runTest;"))->Run()); 7125911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org v8::Handle<v8::Value> result = run_test->Call(env->Global(), 1, &obj); 7126911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org CHECK(result->IsTrue()); 7127911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org} 7128c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org 7129c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org 7130c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org// Test that the debug break flag works with function.apply. 7131c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.orgTEST(DebugBreakFunctionApply) { 7132c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org DebugLocalContext env; 71332bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 7134c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org 7135c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org // Create a function for testing breaking in apply. 7136c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org v8::Local<v8::Function> foo = CompileFunction( 7137c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org &env, 7138c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org "function baz(x) { }" 7139c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org "function bar(x) { baz(); }" 7140c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org "function foo(){ bar.apply(this, [1]); }", 7141c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org "foo"); 7142c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org 7143c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org // Register a debug event listener which steps and counts. 7144662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(DebugEventBreakMax); 7145c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org 7146c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org // Set the debug break flag before calling the code using function.apply. 7147528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Debug::DebugBreak(env->GetIsolate()); 7148c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org 7149c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org // Limit the number of debug breaks. This is a regression test for issue 493 7150c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org // where this test would enter an infinite loop. 7151c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org break_point_hit_count = 0; 7152c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org max_break_point_hit_count = 10000; // 10000 => infinite loop. 7153c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org foo->Call(env->Global(), 0, NULL); 7154c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org 7155c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org // When keeping the debug break several break will happen. 715664e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org CHECK_GT(break_point_hit_count, 1); 7157c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org 7158662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(NULL); 7159c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org CheckDebuggerUnloaded(); 7160c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org} 7161c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org 7162c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org 7163c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.orgv8::Handle<v8::Context> debugee_context; 7164c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.orgv8::Handle<v8::Context> debugger_context; 7165c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org 7166c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org 7167c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org// Property getter that checks that current and calling contexts 7168c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org// are both the debugee contexts. 71691510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgstatic void NamedGetterWithCallingContextCheck( 7170c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org v8::Local<v8::String> name, 71711510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org const v8::PropertyCallbackInfo<v8::Value>& info) { 7172906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org CHECK_EQ(0, strcmp(*v8::String::Utf8Value(name), "a")); 7173528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Handle<v8::Context> current = info.GetIsolate()->GetCurrentContext(); 7174c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org CHECK(current == debugee_context); 7175c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org CHECK(current != debugger_context); 7176528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Handle<v8::Context> calling = info.GetIsolate()->GetCallingContext(); 7177c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org CHECK(calling == debugee_context); 7178c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org CHECK(calling != debugger_context); 71791510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org info.GetReturnValue().Set(1); 7180c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org} 7181c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org 7182c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org 7183c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org// Debug event listener that checks if the first argument of a function is 7184c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org// an object with property 'a' == 1. If the property has custom accessor 7185c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org// this handler will eventually invoke it. 7186c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.orgstatic void DebugEventGetAtgumentPropertyValue( 7187662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org const v8::Debug::EventDetails& event_details) { 7188662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::DebugEvent event = event_details.GetEvent(); 7189662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Handle<v8::Object> exec_state = event_details.GetExecutionState(); 7190c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org if (event == v8::Break) { 7191c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org break_point_hit_count++; 7192528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org CHECK(debugger_context == CcTest::isolate()->GetCurrentContext()); 7193f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org v8::Handle<v8::Function> func = v8::Handle<v8::Function>::Cast(CompileRun( 7194c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org "(function(exec_state) {\n" 7195c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org " return (exec_state.frame(0).argumentValue(0).property('a').\n" 7196c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org " value().value() == 1);\n" 7197f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org "})")); 7198c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org const int argc = 1; 7199c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org v8::Handle<v8::Value> argv[argc] = { exec_state }; 7200c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org v8::Handle<v8::Value> result = func->Call(exec_state, argc, argv); 7201c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org CHECK(result->IsTrue()); 7202c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org } 7203c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org} 7204c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org 7205c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org 7206c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.orgTEST(CallingContextIsNotDebugContext) { 7207528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::internal::Debug* debug = CcTest::i_isolate()->debug(); 7208c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org // Create and enter a debugee context. 7209c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org DebugLocalContext env; 72102bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 7211c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org env.ExposeDebug(); 7212c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org 7213c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org // Save handles to the debugger and debugee contexts to be used in 7214c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org // NamedGetterWithCallingContextCheck. 7215f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org debugee_context = env.context(); 7216ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org debugger_context = v8::Utils::ToLocal(debug->debug_context()); 7217c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org 7218c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org // Create object with 'a' property accessor. 7219c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org v8::Handle<v8::ObjectTemplate> named = v8::ObjectTemplate::New(); 7220f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org named->SetAccessor(v8::String::NewFromUtf8(env->GetIsolate(), "a"), 7221c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org NamedGetterWithCallingContextCheck); 7222f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org env->Global()->Set(v8::String::NewFromUtf8(env->GetIsolate(), "obj"), 7223c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org named->NewInstance()); 7224c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org 7225c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org // Register the debug event listener 7226662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(DebugEventGetAtgumentPropertyValue); 7227c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org 7228c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org // Create a function that invokes debugger. 7229c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org v8::Local<v8::Function> foo = CompileFunction( 7230c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org &env, 7231c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org "function bar(x) { debugger; }" 7232c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org "function foo(){ bar(obj); }", 7233c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org "foo"); 7234c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org 7235c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org break_point_hit_count = 0; 7236c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org foo->Call(env->Global(), 0, NULL); 7237c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org CHECK_EQ(1, break_point_hit_count); 7238c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org 7239662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(NULL); 7240c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org debugee_context = v8::Handle<v8::Context>(); 7241c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org debugger_context = v8::Handle<v8::Context>(); 7242c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org CheckDebuggerUnloaded(); 7243c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org} 7244c34f5802a37a9fa2ce8f3929d1d5159ddcf04ff3lrn@chromium.org 7245c34f5802a37a9fa2ce8f3929d1d5159ddcf04ff3lrn@chromium.org 72464111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.orgTEST(DebugContextIsPreservedBetweenAccesses) { 7247528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::HandleScope scope(CcTest::isolate()); 72484111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org v8::Local<v8::Context> context1 = v8::Debug::GetDebugContext(); 72494111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org v8::Local<v8::Context> context2 = v8::Debug::GetDebugContext(); 72504111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org CHECK_EQ(*context1, *context2); 72519dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com} 72529dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com 72539dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com 72549dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.comstatic v8::Handle<v8::Value> expected_callback_data; 72559dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.comstatic void DebugEventContextChecker(const v8::Debug::EventDetails& details) { 72569dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com CHECK(details.GetEventContext() == expected_context); 72579dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com CHECK_EQ(expected_callback_data, details.GetCallbackData()); 72589dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com} 72599dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com 7260e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 72619dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com// Check that event details contain context where debug event occured. 72629dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.comTEST(DebugEventContext) { 7263528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Isolate* isolate = CcTest::isolate(); 726457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org v8::HandleScope scope(isolate); 72659dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com expected_callback_data = v8::Int32::New(2010); 7266e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org expected_context = v8::Context::New(isolate); 72679dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com v8::Debug::SetDebugEventListener2(DebugEventContextChecker, 72689dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com expected_callback_data); 72699dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com v8::Context::Scope context_scope(expected_context); 7270f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Script::Compile( 7271f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::String::NewFromUtf8(isolate, "(function(){debugger;})();"))->Run(); 72729dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com expected_context.Clear(); 7273662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(NULL); 72749dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com expected_context_data = v8::Handle<v8::Value>(); 72754111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org CheckDebuggerUnloaded(); 72764111b80e5083e1ec54273d3275875ccc24cdbbafkmillikin@chromium.org} 72779dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com 727822762870ddc5995ca60f432799b94a6abd7680cemikhail.naganov@gmail.com 727922762870ddc5995ca60f432799b94a6abd7680cemikhail.naganov@gmail.comstatic void* expected_break_data; 728022762870ddc5995ca60f432799b94a6abd7680cemikhail.naganov@gmail.comstatic bool was_debug_break_called; 728122762870ddc5995ca60f432799b94a6abd7680cemikhail.naganov@gmail.comstatic bool was_debug_event_called; 728222762870ddc5995ca60f432799b94a6abd7680cemikhail.naganov@gmail.comstatic void DebugEventBreakDataChecker(const v8::Debug::EventDetails& details) { 728322762870ddc5995ca60f432799b94a6abd7680cemikhail.naganov@gmail.com if (details.GetEvent() == v8::BreakForCommand) { 728422762870ddc5995ca60f432799b94a6abd7680cemikhail.naganov@gmail.com CHECK_EQ(expected_break_data, details.GetClientData()); 728522762870ddc5995ca60f432799b94a6abd7680cemikhail.naganov@gmail.com was_debug_event_called = true; 728622762870ddc5995ca60f432799b94a6abd7680cemikhail.naganov@gmail.com } else if (details.GetEvent() == v8::Break) { 728722762870ddc5995ca60f432799b94a6abd7680cemikhail.naganov@gmail.com was_debug_break_called = true; 728822762870ddc5995ca60f432799b94a6abd7680cemikhail.naganov@gmail.com } 728922762870ddc5995ca60f432799b94a6abd7680cemikhail.naganov@gmail.com} 729022762870ddc5995ca60f432799b94a6abd7680cemikhail.naganov@gmail.com 7291a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 729222762870ddc5995ca60f432799b94a6abd7680cemikhail.naganov@gmail.com// Check that event details contain context where debug event occured. 729322762870ddc5995ca60f432799b94a6abd7680cemikhail.naganov@gmail.comTEST(DebugEventBreakData) { 729422762870ddc5995ca60f432799b94a6abd7680cemikhail.naganov@gmail.com DebugLocalContext env; 7295528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Isolate* isolate = env->GetIsolate(); 7296528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::HandleScope scope(isolate); 729722762870ddc5995ca60f432799b94a6abd7680cemikhail.naganov@gmail.com v8::Debug::SetDebugEventListener2(DebugEventBreakDataChecker); 729822762870ddc5995ca60f432799b94a6abd7680cemikhail.naganov@gmail.com 729922762870ddc5995ca60f432799b94a6abd7680cemikhail.naganov@gmail.com TestClientData::constructor_call_counter = 0; 730022762870ddc5995ca60f432799b94a6abd7680cemikhail.naganov@gmail.com TestClientData::destructor_call_counter = 0; 730122762870ddc5995ca60f432799b94a6abd7680cemikhail.naganov@gmail.com 730222762870ddc5995ca60f432799b94a6abd7680cemikhail.naganov@gmail.com expected_break_data = NULL; 730322762870ddc5995ca60f432799b94a6abd7680cemikhail.naganov@gmail.com was_debug_event_called = false; 730422762870ddc5995ca60f432799b94a6abd7680cemikhail.naganov@gmail.com was_debug_break_called = false; 7305528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Debug::DebugBreakForCommand(NULL, isolate); 7306f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Script::Compile(v8::String::NewFromUtf8(env->GetIsolate(), 7307f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org "(function(x){return x;})(1);")) 7308f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org ->Run(); 730922762870ddc5995ca60f432799b94a6abd7680cemikhail.naganov@gmail.com CHECK(was_debug_event_called); 731022762870ddc5995ca60f432799b94a6abd7680cemikhail.naganov@gmail.com CHECK(!was_debug_break_called); 731122762870ddc5995ca60f432799b94a6abd7680cemikhail.naganov@gmail.com 731222762870ddc5995ca60f432799b94a6abd7680cemikhail.naganov@gmail.com TestClientData* data1 = new TestClientData(); 731322762870ddc5995ca60f432799b94a6abd7680cemikhail.naganov@gmail.com expected_break_data = data1; 731422762870ddc5995ca60f432799b94a6abd7680cemikhail.naganov@gmail.com was_debug_event_called = false; 731522762870ddc5995ca60f432799b94a6abd7680cemikhail.naganov@gmail.com was_debug_break_called = false; 7316528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Debug::DebugBreakForCommand(data1, isolate); 7317f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Script::Compile(v8::String::NewFromUtf8(env->GetIsolate(), 7318f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org "(function(x){return x+1;})(1);")) 7319f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org ->Run(); 732022762870ddc5995ca60f432799b94a6abd7680cemikhail.naganov@gmail.com CHECK(was_debug_event_called); 732122762870ddc5995ca60f432799b94a6abd7680cemikhail.naganov@gmail.com CHECK(!was_debug_break_called); 732222762870ddc5995ca60f432799b94a6abd7680cemikhail.naganov@gmail.com 732322762870ddc5995ca60f432799b94a6abd7680cemikhail.naganov@gmail.com expected_break_data = NULL; 732422762870ddc5995ca60f432799b94a6abd7680cemikhail.naganov@gmail.com was_debug_event_called = false; 732522762870ddc5995ca60f432799b94a6abd7680cemikhail.naganov@gmail.com was_debug_break_called = false; 7326528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Debug::DebugBreak(isolate); 7327f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Script::Compile(v8::String::NewFromUtf8(env->GetIsolate(), 7328f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org "(function(x){return x+2;})(1);")) 7329f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org ->Run(); 733022762870ddc5995ca60f432799b94a6abd7680cemikhail.naganov@gmail.com CHECK(!was_debug_event_called); 733122762870ddc5995ca60f432799b94a6abd7680cemikhail.naganov@gmail.com CHECK(was_debug_break_called); 733222762870ddc5995ca60f432799b94a6abd7680cemikhail.naganov@gmail.com 733322762870ddc5995ca60f432799b94a6abd7680cemikhail.naganov@gmail.com TestClientData* data2 = new TestClientData(); 733422762870ddc5995ca60f432799b94a6abd7680cemikhail.naganov@gmail.com expected_break_data = data2; 733522762870ddc5995ca60f432799b94a6abd7680cemikhail.naganov@gmail.com was_debug_event_called = false; 733622762870ddc5995ca60f432799b94a6abd7680cemikhail.naganov@gmail.com was_debug_break_called = false; 7337528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Debug::DebugBreak(isolate); 7338528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Debug::DebugBreakForCommand(data2, isolate); 7339f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Script::Compile(v8::String::NewFromUtf8(env->GetIsolate(), 7340f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org "(function(x){return x+3;})(1);")) 7341f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org ->Run(); 734222762870ddc5995ca60f432799b94a6abd7680cemikhail.naganov@gmail.com CHECK(was_debug_event_called); 734322762870ddc5995ca60f432799b94a6abd7680cemikhail.naganov@gmail.com CHECK(was_debug_break_called); 734422762870ddc5995ca60f432799b94a6abd7680cemikhail.naganov@gmail.com 734522762870ddc5995ca60f432799b94a6abd7680cemikhail.naganov@gmail.com CHECK_EQ(2, TestClientData::constructor_call_counter); 734622762870ddc5995ca60f432799b94a6abd7680cemikhail.naganov@gmail.com CHECK_EQ(TestClientData::constructor_call_counter, 734722762870ddc5995ca60f432799b94a6abd7680cemikhail.naganov@gmail.com TestClientData::destructor_call_counter); 734822762870ddc5995ca60f432799b94a6abd7680cemikhail.naganov@gmail.com 7349662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(NULL); 735022762870ddc5995ca60f432799b94a6abd7680cemikhail.naganov@gmail.com CheckDebuggerUnloaded(); 735122762870ddc5995ca60f432799b94a6abd7680cemikhail.naganov@gmail.com} 735222762870ddc5995ca60f432799b94a6abd7680cemikhail.naganov@gmail.com 7353a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgstatic bool debug_event_break_deoptimize_done = false; 7354a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 7355662436e7b124b3535773535c671c53db322070b5verwaest@chromium.orgstatic void DebugEventBreakDeoptimize( 7356662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org const v8::Debug::EventDetails& event_details) { 7357662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::DebugEvent event = event_details.GetEvent(); 7358662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Handle<v8::Object> exec_state = event_details.GetExecutionState(); 7359a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org if (event == v8::Break) { 7360a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org if (!frame_function_name.IsEmpty()) { 7361a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Get the name of the function. 7362a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org const int argc = 2; 7363a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org v8::Handle<v8::Value> argv[argc] = { exec_state, v8::Integer::New(0) }; 7364a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org v8::Handle<v8::Value> result = 7365a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org frame_function_name->Call(exec_state, argc, argv); 7366a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org if (!result->IsUndefined()) { 7367a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org char fn[80]; 7368a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org CHECK(result->IsString()); 7369a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org v8::Handle<v8::String> function_name(result->ToString()); 737057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org function_name->WriteUtf8(fn); 7371a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org if (strcmp(fn, "bar") == 0) { 7372528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org i::Deoptimizer::DeoptimizeAll(CcTest::i_isolate()); 7373a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org debug_event_break_deoptimize_done = true; 7374a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 7375a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 7376a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 7377a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 7378528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Debug::DebugBreak(CcTest::isolate()); 7379a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 7380a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 7381a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 7382a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 7383a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// Test deoptimization when execution is broken using the debug break stack 7384a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// check interrupt. 7385a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgTEST(DeoptimizeDuringDebugBreak) { 7386a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org DebugLocalContext env; 73872bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 7388a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org env.ExposeDebug(); 7389a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 7390a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Create a function for checking the function when hitting a break point. 7391a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org frame_function_name = CompileFunction(&env, 7392a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org frame_function_name_source, 7393a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org "frame_function_name"); 7394a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 7395a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 7396a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Set a debug event listener which will keep interrupting execution until 7397a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // debug break. When inside function bar it will deoptimize all functions. 7398a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // This tests lazy deoptimization bailout for the stack check, as the first 7399a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // time in function bar when using debug break and no break points will be at 7400a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // the initial stack check. 7401662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(DebugEventBreakDeoptimize); 7402a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 7403a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Compile and run function bar which will optimize it for some flag settings. 7404f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Script::Compile(v8::String::NewFromUtf8( 7405f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org env->GetIsolate(), "function bar(){}; bar()"))->Run(); 7406a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 7407a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Set debug break and call bar again. 7408528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Debug::DebugBreak(env->GetIsolate()); 7409f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Script::Compile(v8::String::NewFromUtf8(env->GetIsolate(), "bar()")) 7410f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org ->Run(); 7411a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 7412a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org CHECK(debug_event_break_deoptimize_done); 7413a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 7414662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(NULL); 7415a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 7416a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 7417a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 7418662436e7b124b3535773535c671c53db322070b5verwaest@chromium.orgstatic void DebugEventBreakWithOptimizedStack( 7419662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org const v8::Debug::EventDetails& event_details) { 7420f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Isolate* isolate = event_details.GetEventContext()->GetIsolate(); 7421662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::DebugEvent event = event_details.GetEvent(); 7422662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Handle<v8::Object> exec_state = event_details.GetExecutionState(); 7423a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org if (event == v8::Break) { 7424a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org if (!frame_function_name.IsEmpty()) { 7425a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org for (int i = 0; i < 2; i++) { 7426a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org const int argc = 2; 7427a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org v8::Handle<v8::Value> argv[argc] = { exec_state, v8::Integer::New(i) }; 7428a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Get the name of the function in frame i. 7429a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org v8::Handle<v8::Value> result = 7430a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org frame_function_name->Call(exec_state, argc, argv); 7431a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org CHECK(result->IsString()); 7432a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org v8::Handle<v8::String> function_name(result->ToString()); 7433f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org CHECK(function_name->Equals(v8::String::NewFromUtf8(isolate, "loop"))); 7434a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Get the name of the first argument in frame i. 7435a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org result = frame_argument_name->Call(exec_state, argc, argv); 7436a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org CHECK(result->IsString()); 7437a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org v8::Handle<v8::String> argument_name(result->ToString()); 7438f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org CHECK(argument_name->Equals(v8::String::NewFromUtf8(isolate, "count"))); 7439a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Get the value of the first argument in frame i. If the 7440a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // funtion is optimized the value will be undefined, otherwise 7441a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // the value will be '1 - i'. 7442a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // 7443a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // TODO(3141533): We should be able to get the real value for 7444a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // optimized frames. 7445a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org result = frame_argument_value->Call(exec_state, argc, argv); 7446a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org CHECK(result->IsUndefined() || (result->Int32Value() == 1 - i)); 7447a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Get the name of the first local variable. 7448a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org result = frame_local_name->Call(exec_state, argc, argv); 7449a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org CHECK(result->IsString()); 7450a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org v8::Handle<v8::String> local_name(result->ToString()); 7451f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org CHECK(local_name->Equals(v8::String::NewFromUtf8(isolate, "local"))); 7452a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Get the value of the first local variable. If the function 7453a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // is optimized the value will be undefined, otherwise it will 7454a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // be 42. 7455a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // 7456a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // TODO(3141533): We should be able to get the real value for 7457a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // optimized frames. 7458a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org result = frame_local_value->Call(exec_state, argc, argv); 7459a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org CHECK(result->IsUndefined() || (result->Int32Value() == 42)); 7460a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 7461a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 7462a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 7463a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 7464a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 7465a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 74661510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgstatic void ScheduleBreak(const v8::FunctionCallbackInfo<v8::Value>& args) { 7467662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(DebugEventBreakWithOptimizedStack); 7468528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Debug::DebugBreak(args.GetIsolate()); 7469a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 7470a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 7471a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 7472a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgTEST(DebugBreakStackInspection) { 7473a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org DebugLocalContext env; 74742bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 7475a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 7476a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org frame_function_name = 7477a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org CompileFunction(&env, frame_function_name_source, "frame_function_name"); 7478a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org frame_argument_name = 7479a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org CompileFunction(&env, frame_argument_name_source, "frame_argument_name"); 7480a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org frame_argument_value = CompileFunction(&env, 7481a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org frame_argument_value_source, 7482a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org "frame_argument_value"); 7483a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org frame_local_name = 7484a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org CompileFunction(&env, frame_local_name_source, "frame_local_name"); 7485a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org frame_local_value = 7486a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org CompileFunction(&env, frame_local_value_source, "frame_local_value"); 7487a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 7488a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org v8::Handle<v8::FunctionTemplate> schedule_break_template = 7489a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org v8::FunctionTemplate::New(ScheduleBreak); 7490a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org v8::Handle<v8::Function> schedule_break = 7491a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org schedule_break_template->GetFunction(); 7492a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org env->Global()->Set(v8_str("scheduleBreak"), schedule_break); 7493a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 7494a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org const char* src = 7495a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org "function loop(count) {" 7496a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org " var local = 42;" 7497a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org " if (count < 1) { scheduleBreak(); loop(count + 1); }" 7498a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org "}" 7499a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org "loop(0);"; 7500f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Script::Compile(v8::String::NewFromUtf8(env->GetIsolate(), src))->Run(); 7501a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 7502a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 7503f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org 7504f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org// Test that setting the terminate execution flag during debug break processing. 750521b5e95db1c650dfc2ba8e11d010bb01293f85c5vegorov@chromium.orgstatic void TestDebugBreakInLoop(const char* loop_head, 750621b5e95db1c650dfc2ba8e11d010bb01293f85c5vegorov@chromium.org const char** loop_bodies, 750721b5e95db1c650dfc2ba8e11d010bb01293f85c5vegorov@chromium.org const char* loop_tail) { 750821b5e95db1c650dfc2ba8e11d010bb01293f85c5vegorov@chromium.org // Receive 100 breaks for each test and then terminate JavaScript execution. 7509ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org static const int kBreaksPerTest = 100; 7510ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org 7511bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com for (int i = 0; loop_bodies[i] != NULL; i++) { 7512ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org // Perform a lazy deoptimization after various numbers of breaks 7513ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org // have been hit. 751437be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org for (int j = 0; j < 7; j++) { 7515ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org break_point_hit_count_deoptimize = j; 751637be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org if (j == 6) { 7517ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org break_point_hit_count_deoptimize = kBreaksPerTest; 7518ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org } 751921b5e95db1c650dfc2ba8e11d010bb01293f85c5vegorov@chromium.org 7520ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org break_point_hit_count = 0; 7521ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org max_break_point_hit_count = kBreaksPerTest; 7522ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org terminate_after_max_break_point_hit = true; 752321b5e95db1c650dfc2ba8e11d010bb01293f85c5vegorov@chromium.org 7524ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org EmbeddedVector<char, 1024> buffer; 7525ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org OS::SNPrintF(buffer, 7526ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org "function f() {%s%s%s}", 7527ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org loop_head, loop_bodies[i], loop_tail); 752821b5e95db1c650dfc2ba8e11d010bb01293f85c5vegorov@chromium.org 7529ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org // Function with infinite loop. 7530ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org CompileRun(buffer.start()); 753121b5e95db1c650dfc2ba8e11d010bb01293f85c5vegorov@chromium.org 7532ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org // Set the debug break to enter the debugger as soon as possible. 7533528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Debug::DebugBreak(CcTest::isolate()); 753421b5e95db1c650dfc2ba8e11d010bb01293f85c5vegorov@chromium.org 7535ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org // Call function with infinite loop. 7536ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org CompileRun("f();"); 7537ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org CHECK_EQ(kBreaksPerTest, break_point_hit_count); 753821b5e95db1c650dfc2ba8e11d010bb01293f85c5vegorov@chromium.org 7539ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org CHECK(!v8::V8::IsExecutionTerminating()); 7540ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org } 754121b5e95db1c650dfc2ba8e11d010bb01293f85c5vegorov@chromium.org } 754221b5e95db1c650dfc2ba8e11d010bb01293f85c5vegorov@chromium.org} 754321b5e95db1c650dfc2ba8e11d010bb01293f85c5vegorov@chromium.org 754421b5e95db1c650dfc2ba8e11d010bb01293f85c5vegorov@chromium.org 7545f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.orgTEST(DebugBreakLoop) { 7546f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org DebugLocalContext env; 75472bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 7548f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org 7549f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org // Register a debug event listener which sets the break flag and counts. 7550662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(DebugEventBreakMax); 7551f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org 7552ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org // Create a function for getting the frame count when hitting the break. 7553ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org frame_count = CompileFunction(&env, frame_count_source, "frame_count"); 7554ddda9e81d3175130f2029c0e1205d265a00c32edjkummerow@chromium.org 755521b5e95db1c650dfc2ba8e11d010bb01293f85c5vegorov@chromium.org CompileRun("var a = 1;"); 755621b5e95db1c650dfc2ba8e11d010bb01293f85c5vegorov@chromium.org CompileRun("function g() { }"); 755721b5e95db1c650dfc2ba8e11d010bb01293f85c5vegorov@chromium.org CompileRun("function h() { }"); 755821b5e95db1c650dfc2ba8e11d010bb01293f85c5vegorov@chromium.org 755921b5e95db1c650dfc2ba8e11d010bb01293f85c5vegorov@chromium.org const char* loop_bodies[] = { 756021b5e95db1c650dfc2ba8e11d010bb01293f85c5vegorov@chromium.org "", 756121b5e95db1c650dfc2ba8e11d010bb01293f85c5vegorov@chromium.org "g()", 756221b5e95db1c650dfc2ba8e11d010bb01293f85c5vegorov@chromium.org "if (a == 0) { g() }", 756321b5e95db1c650dfc2ba8e11d010bb01293f85c5vegorov@chromium.org "if (a == 1) { g() }", 756421b5e95db1c650dfc2ba8e11d010bb01293f85c5vegorov@chromium.org "if (a == 0) { g() } else { h() }", 756521b5e95db1c650dfc2ba8e11d010bb01293f85c5vegorov@chromium.org "if (a == 0) { continue }", 756621b5e95db1c650dfc2ba8e11d010bb01293f85c5vegorov@chromium.org "if (a == 1) { continue }", 756721b5e95db1c650dfc2ba8e11d010bb01293f85c5vegorov@chromium.org "switch (a) { case 1: g(); }", 756821b5e95db1c650dfc2ba8e11d010bb01293f85c5vegorov@chromium.org "switch (a) { case 1: continue; }", 756921b5e95db1c650dfc2ba8e11d010bb01293f85c5vegorov@chromium.org "switch (a) { case 1: g(); break; default: h() }", 757021b5e95db1c650dfc2ba8e11d010bb01293f85c5vegorov@chromium.org "switch (a) { case 1: continue; break; default: h() }", 757121b5e95db1c650dfc2ba8e11d010bb01293f85c5vegorov@chromium.org NULL 757221b5e95db1c650dfc2ba8e11d010bb01293f85c5vegorov@chromium.org }; 757321b5e95db1c650dfc2ba8e11d010bb01293f85c5vegorov@chromium.org 757421b5e95db1c650dfc2ba8e11d010bb01293f85c5vegorov@chromium.org TestDebugBreakInLoop("while (true) {", loop_bodies, "}"); 757521b5e95db1c650dfc2ba8e11d010bb01293f85c5vegorov@chromium.org TestDebugBreakInLoop("while (a == 1) {", loop_bodies, "}"); 7576f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org 757721b5e95db1c650dfc2ba8e11d010bb01293f85c5vegorov@chromium.org TestDebugBreakInLoop("do {", loop_bodies, "} while (true)"); 757821b5e95db1c650dfc2ba8e11d010bb01293f85c5vegorov@chromium.org TestDebugBreakInLoop("do {", loop_bodies, "} while (a == 1)"); 7579f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org 758021b5e95db1c650dfc2ba8e11d010bb01293f85c5vegorov@chromium.org TestDebugBreakInLoop("for (;;) {", loop_bodies, "}"); 758121b5e95db1c650dfc2ba8e11d010bb01293f85c5vegorov@chromium.org TestDebugBreakInLoop("for (;a == 1;) {", loop_bodies, "}"); 7582f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org 7583f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org // Get rid of the debug event listener. 7584662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(NULL); 7585f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org CheckDebuggerUnloaded(); 7586f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org} 7587f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org 7588f0ac72dfa39ec827de605aafc57d4834237aa7f3whesse@chromium.org 7589fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.orgv8::Local<v8::Script> inline_script; 7590fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org 7591662436e7b124b3535773535c671c53db322070b5verwaest@chromium.orgstatic void DebugBreakInlineListener( 7592662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org const v8::Debug::EventDetails& event_details) { 7593662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::DebugEvent event = event_details.GetEvent(); 7594fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org if (event != v8::Break) return; 7595fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org 7596fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org int expected_frame_count = 4; 7597fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org int expected_line_number[] = {1, 4, 7, 12}; 7598fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org 7599fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org i::Handle<i::Object> compiled_script = v8::Utils::OpenHandle(*inline_script); 7600fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org i::Handle<i::Script> source_script = i::Handle<i::Script>(i::Script::cast( 7601fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org i::JSFunction::cast(*compiled_script)->shared()->script())); 7602fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org 7603528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org int break_id = CcTest::i_isolate()->debug()->break_id(); 7604fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org char script[128]; 7605fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org i::Vector<char> script_vector(script, sizeof(script)); 7606fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org OS::SNPrintF(script_vector, "%%GetFrameCount(%d)", break_id); 7607fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org v8::Local<v8::Value> result = CompileRun(script); 7608fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org 7609fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org int frame_count = result->Int32Value(); 7610fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org CHECK_EQ(expected_frame_count, frame_count); 7611fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org 7612fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org for (int i = 0; i < frame_count; i++) { 7613fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org // The 5. element in the returned array of GetFrameDetails contains the 7614fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org // source position of that frame. 7615fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org OS::SNPrintF(script_vector, "%%GetFrameDetails(%d, %d)[5]", break_id, i); 7616fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org v8::Local<v8::Value> result = CompileRun(script); 7617fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org CHECK_EQ(expected_line_number[i], 7618fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org i::GetScriptLineNumber(source_script, result->Int32Value())); 7619fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org } 7620662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(NULL); 7621528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::V8::TerminateExecution(CcTest::isolate()); 7622fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org} 7623fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org 7624fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org 7625fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.orgTEST(DebugBreakInline) { 7626fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org i::FLAG_allow_natives_syntax = true; 7627fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org DebugLocalContext env; 76282bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 7629fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org const char* source = 7630fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org "function debug(b) { \n" 7631fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org " if (b) debugger; \n" 7632fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org "} \n" 7633fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org "function f(b) { \n" 7634fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org " debug(b) \n" 7635fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org "}; \n" 7636fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org "function g(b) { \n" 7637fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org " f(b); \n" 7638fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org "}; \n" 7639fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org "g(false); \n" 7640fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org "g(false); \n" 7641fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org "%OptimizeFunctionOnNextCall(g); \n" 7642fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org "g(true);"; 7643662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(DebugBreakInlineListener); 7644f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org inline_script = 7645f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Script::Compile(v8::String::NewFromUtf8(env->GetIsolate(), source)); 7646fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org inline_script->Run(); 7647fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org} 7648fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org 7649fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org 7650662436e7b124b3535773535c671c53db322070b5verwaest@chromium.orgstatic void DebugEventStepNext( 7651662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org const v8::Debug::EventDetails& event_details) { 7652662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::DebugEvent event = event_details.GetEvent(); 765381cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org if (event == v8::Break) { 765481cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org PrepareStep(StepNext); 765581cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org } 765681cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org} 765781cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org 765881cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org 765981cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.orgstatic void RunScriptInANewCFrame(const char* source) { 766081cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org v8::TryCatch try_catch; 766181cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org CompileRun(source); 766281cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org CHECK(try_catch.HasCaught()); 766381cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org} 766481cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org 766581cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org 766681cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.orgTEST(Regress131642) { 766781cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org // Bug description: 766881cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org // When doing StepNext through the first script, the debugger is not reset 766981cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org // after exiting through exception. A flawed implementation enabling the 767081cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org // debugger to step into Array.prototype.forEach breaks inside the callback 767181cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org // for forEach in the second script under the assumption that we are in a 767281cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org // recursive call. In an attempt to step out, we crawl the stack using the 767381cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org // recorded frame pointer from the first script and fail when not finding it 767481cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org // on the stack. 767581cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org DebugLocalContext env; 76762bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 7677662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(DebugEventStepNext); 767881cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org 767981cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org // We step through the first script. It exits through an exception. We run 768081cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org // this inside a new frame to record a different FP than the second script 768181cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org // would expect. 768281cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org const char* script_1 = "debugger; throw new Error();"; 768381cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org RunScriptInANewCFrame(script_1); 768481cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org 768581cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org // The second script uses forEach. 768681cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org const char* script_2 = "[0].forEach(function() { });"; 768781cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org CompileRun(script_2); 768881cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org 7689662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(NULL); 769081cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org} 769181cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org 769228583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org 769328583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org// Import from test-heap.cc 769446839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.orgint CountNativeContexts(); 769528583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org 769628583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org 7697662436e7b124b3535773535c671c53db322070b5verwaest@chromium.orgstatic void NopListener(const v8::Debug::EventDetails& event_details) { 769828583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org} 769928583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org 770028583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org 770128583c92ca8f528df625800519088ac88996d504jkummerow@chromium.orgTEST(DebuggerCreatesContextIffActive) { 770228583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org DebugLocalContext env; 77032bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 770446839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org CHECK_EQ(1, CountNativeContexts()); 770528583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org 7706662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(NULL); 770728583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org CompileRun("debugger;"); 770846839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org CHECK_EQ(1, CountNativeContexts()); 770928583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org 7710662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(NopListener); 771128583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org CompileRun("debugger;"); 771246839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org CHECK_EQ(2, CountNativeContexts()); 771328583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org 7714662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org v8::Debug::SetDebugEventListener2(NULL); 771528583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org} 771628583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org 7717de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org 7718de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.orgTEST(LiveEditEnabled) { 7719de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org v8::internal::FLAG_allow_natives_syntax = true; 77202bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org LocalContext env; 77212bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 7722528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Debug::SetLiveEditEnabled(true, env->GetIsolate()); 7723de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org CompileRun("%LiveEditCompareStrings('', '')"); 7724de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org} 7725de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org 7726de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org 7727de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.orgTEST(LiveEditDisabled) { 7728de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org v8::internal::FLAG_allow_natives_syntax = true; 77292bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org LocalContext env; 77302bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org v8::HandleScope scope(env->GetIsolate()); 7731ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org v8::Debug::SetLiveEditEnabled(false, env->GetIsolate()); 7732de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org CompileRun("%LiveEditCompareStrings('', '')"); 7733de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org} 7734de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org 7735de88679a78f9dae12fdf7955610969ac4c79b0bemstarzinger@chromium.org 77365ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org#endif // ENABLE_DEBUGGER_SUPPORT 7737