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