13ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Copyright 2012 the V8 project authors. All rights reserved.
2a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Redistribution and use in source and binary forms, with or without
3a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// modification, are permitted provided that the following conditions are
4a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// met:
5a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//
6a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//     * Redistributions of source code must retain the above copyright
7a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       notice, this list of conditions and the following disclaimer.
8a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//     * Redistributions in binary form must reproduce the above
9a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       copyright notice, this list of conditions and the following
10a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       disclaimer in the documentation and/or other materials provided
11a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       with the distribution.
12a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//     * Neither the name of Google Inc. nor the names of its
13a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       contributors may be used to endorse or promote products derived
14a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       from this software without specific prior written permission.
15a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//
16a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
28a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifndef V8_CHECKS_H_
29a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define V8_CHECKS_H_
30a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
31a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include <string.h>
32a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
33b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#include "../include/v8stdint.h"
34a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockextern "C" void V8_Fatal(const char* file, int line, const char* format, ...);
35a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
36a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// The FATAL, UNREACHABLE and UNIMPLEMENTED macros are useful during
37a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// development, but they should not be relied on in the final product.
38a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifdef DEBUG
39a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define FATAL(msg)                              \
40a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  V8_Fatal(__FILE__, __LINE__, "%s", (msg))
41a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define UNIMPLEMENTED()                         \
42a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  V8_Fatal(__FILE__, __LINE__, "unimplemented code")
43a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define UNREACHABLE()                           \
44a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  V8_Fatal(__FILE__, __LINE__, "unreachable code")
45a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#else
46a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define FATAL(msg)                              \
47a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  V8_Fatal("", 0, "%s", (msg))
48a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define UNIMPLEMENTED()                         \
49a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  V8_Fatal("", 0, "unimplemented code")
50a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define UNREACHABLE() ((void) 0)
51a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif
52a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
53a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
54a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// The CHECK macro checks that the given condition is true; if not, it
55a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// prints a message to stderr and aborts.
563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#define CHECK(condition) do {                                       \
573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (!(condition)) {                                             \
583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      V8_Fatal(__FILE__, __LINE__, "CHECK(%s) failed", #condition); \
593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }                                                               \
603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  } while (0)
61a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
62a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
63a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Helper function used by the CHECK_EQ function when given int
64a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// arguments.  Should not be called directly.
653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochinline void CheckEqualsHelper(const char* file, int line,
663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                              const char* expected_source, int expected,
673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                              const char* value_source, int value) {
68a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (expected != value) {
69a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    V8_Fatal(file, line,
70a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block             "CHECK_EQ(%s, %s) failed\n#   Expected: %i\n#   Found: %i",
71a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block             expected_source, value_source, expected, value);
72a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
73a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
74a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
756ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
763ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block// Helper function used by the CHECK_EQ function when given int64_t
773ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block// arguments.  Should not be called directly.
783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochinline void CheckEqualsHelper(const char* file, int line,
793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                              const char* expected_source,
803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                              int64_t expected,
813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                              const char* value_source,
823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                              int64_t value) {
833ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  if (expected != value) {
843ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    // Print int64_t values in hex, as two int32s,
853ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    // to avoid platform-dependencies.
863ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block    V8_Fatal(file, line,
873ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block             "CHECK_EQ(%s, %s) failed\n#"
883ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block             "   Expected: 0x%08x%08x\n#   Found: 0x%08x%08x",
893ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block             expected_source, value_source,
903ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block             static_cast<uint32_t>(expected >> 32),
913ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block             static_cast<uint32_t>(expected),
923ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block             static_cast<uint32_t>(value >> 32),
933ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block             static_cast<uint32_t>(value));
943ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  }
953ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
963ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
97a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
98a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Helper function used by the CHECK_NE function when given int
99a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// arguments.  Should not be called directly.
1003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochinline void CheckNonEqualsHelper(const char* file,
1013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                 int line,
1023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                 const char* unexpected_source,
1033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                 int unexpected,
1043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                 const char* value_source,
1053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                 int value) {
106a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (unexpected == value) {
107a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    V8_Fatal(file, line, "CHECK_NE(%s, %s) failed\n#   Value: %i",
108a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block             unexpected_source, value_source, value);
109a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
110a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
111a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
112a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
113a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Helper function used by the CHECK function when given string
114a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// arguments.  Should not be called directly.
1153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochinline void CheckEqualsHelper(const char* file,
1163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                              int line,
1173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                              const char* expected_source,
1183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                              const char* expected,
1193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                              const char* value_source,
1203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                              const char* value) {
121402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu  if ((expected == NULL && value != NULL) ||
122402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu      (expected != NULL && value == NULL) ||
123402d937239b0e2fd11bf2f4fe972ad78aa9fd481Andrei Popescu      (expected != NULL && value != NULL && strcmp(expected, value) != 0)) {
124a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    V8_Fatal(file, line,
125a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block             "CHECK_EQ(%s, %s) failed\n#   Expected: %s\n#   Found: %s",
126a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block             expected_source, value_source, expected, value);
127a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
128a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
129a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
130a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochinline void CheckNonEqualsHelper(const char* file,
1323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                 int line,
1333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                 const char* expected_source,
1343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                 const char* expected,
1353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                 const char* value_source,
1363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                 const char* value) {
137a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (expected == value ||
138a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      (expected != NULL && value != NULL && strcmp(expected, value) == 0)) {
139a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    V8_Fatal(file, line, "CHECK_NE(%s, %s) failed\n#   Value: %s",
140a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block             expected_source, value_source, value);
141a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
142a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
143a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
144a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
145a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Helper function used by the CHECK function when given pointer
146a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// arguments.  Should not be called directly.
1473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochinline void CheckEqualsHelper(const char* file,
1483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                              int line,
1493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                              const char* expected_source,
1503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                              const void* expected,
1513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                              const char* value_source,
1523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                              const void* value) {
153a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (expected != value) {
154a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    V8_Fatal(file, line,
155a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block             "CHECK_EQ(%s, %s) failed\n#   Expected: %p\n#   Found: %p",
156a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block             expected_source, value_source,
157a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block             expected, value);
158a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
159a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
160a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
161a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochinline void CheckNonEqualsHelper(const char* file,
1633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                 int line,
1643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                 const char* expected_source,
1653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                 const void* expected,
1663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                 const char* value_source,
1673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                 const void* value) {
168a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (expected == value) {
169a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    V8_Fatal(file, line, "CHECK_NE(%s, %s) failed\n#   Value: %p",
170a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block             expected_source, value_source, value);
171a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
172a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
173a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
174a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
175a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Helper function used by the CHECK function when given floating
176a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// point arguments.  Should not be called directly.
1773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochinline void CheckEqualsHelper(const char* file,
1783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                              int line,
1793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                              const char* expected_source,
1803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                              double expected,
1813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                              const char* value_source,
1823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                              double value) {
183a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Force values to 64 bit memory to truncate 80 bit precision on IA32.
184a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  volatile double* exp = new double[1];
185a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  *exp = expected;
186a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  volatile double* val = new double[1];
187a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  *val = value;
188a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (*exp != *val) {
189a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    V8_Fatal(file, line,
190a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block             "CHECK_EQ(%s, %s) failed\n#   Expected: %f\n#   Found: %f",
191a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block             expected_source, value_source, *exp, *val);
192a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
193a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  delete[] exp;
194a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  delete[] val;
195a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
196a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
197a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
1983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochinline void CheckNonEqualsHelper(const char* file,
1993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                 int line,
2003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                 const char* expected_source,
2013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                 double expected,
2023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                 const char* value_source,
2033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                 double value) {
2046ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  // Force values to 64 bit memory to truncate 80 bit precision on IA32.
2056ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  volatile double* exp = new double[1];
2066ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  *exp = expected;
2076ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  volatile double* val = new double[1];
2086ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  *val = value;
2096ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  if (*exp == *val) {
2106ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    V8_Fatal(file, line,
2116ded16be15dd865a9b21ea304d5273c8be299c87Steve Block             "CHECK_NE(%s, %s) failed\n#   Value: %f",
2126ded16be15dd865a9b21ea304d5273c8be299c87Steve Block             expected_source, value_source, *val);
2136ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  }
2146ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  delete[] exp;
2156ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  delete[] val;
2166ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
2176ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
2186ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
219a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define CHECK_EQ(expected, value) CheckEqualsHelper(__FILE__, __LINE__, \
220a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  #expected, expected, #value, value)
221a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
222a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
223a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define CHECK_NE(unexpected, value) CheckNonEqualsHelper(__FILE__, __LINE__, \
224a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  #unexpected, unexpected, #value, value)
225a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
226a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
227a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define CHECK_GT(a, b) CHECK((a) > (b))
228a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define CHECK_GE(a, b) CHECK((a) >= (b))
229b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#define CHECK_LT(a, b) CHECK((a) < (b))
230b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#define CHECK_LE(a, b) CHECK((a) <= (b))
231a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
232a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
233a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// This is inspired by the static assertion facility in boost.  This
234a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// is pretty magical.  If it causes you trouble on a platform you may
235a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// find a fix in the boost code.
236a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocktemplate <bool> class StaticAssertion;
237a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocktemplate <> class StaticAssertion<true> { };
238a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// This macro joins two tokens.  If one of the tokens is a macro the
239a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// helper call causes it to be resolved before joining.
240a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define SEMI_STATIC_JOIN(a, b) SEMI_STATIC_JOIN_HELPER(a, b)
241a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define SEMI_STATIC_JOIN_HELPER(a, b) a##b
242a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Causes an error during compilation of the condition is not
243a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// statically known to be true.  It is formulated as a typedef so that
244a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// it can be used wherever a typedef can be used.  Beware that this
245a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// actually causes each use to introduce a new defined type with a
246a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// name depending on the source line.
247a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocktemplate <int> class StaticAssertionHelper { };
24869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch#define STATIC_CHECK(test)                                                    \
24969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  typedef                                                                     \
25069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    StaticAssertionHelper<sizeof(StaticAssertion<static_cast<bool>((test))>)> \
251a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    SEMI_STATIC_JOIN(__StaticAssertTypedef__, __LINE__)
252a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
253a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochextern bool FLAG_enable_slow_asserts;
2553e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu
2563e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu
257a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// The ASSERT macro is equivalent to CHECK except that it only
258756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick// generates code in debug builds.
259a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifdef DEBUG
2603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#define ASSERT_RESULT(expr)    CHECK(expr)
2613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#define ASSERT(condition)      CHECK(condition)
2623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#define ASSERT_EQ(v1, v2)      CHECK_EQ(v1, v2)
2633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#define ASSERT_NE(v1, v2)      CHECK_NE(v1, v2)
2643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#define ASSERT_GE(v1, v2)      CHECK_GE(v1, v2)
2653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#define ASSERT_LT(v1, v2)      CHECK_LT(v1, v2)
2663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#define ASSERT_LE(v1, v2)      CHECK_LE(v1, v2)
2673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#define SLOW_ASSERT(condition) CHECK(!FLAG_enable_slow_asserts || (condition))
268a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#else
2693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#define ASSERT_RESULT(expr)    (expr)
270a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define ASSERT(condition)      ((void) 0)
271a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define ASSERT_EQ(v1, v2)      ((void) 0)
2727f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch#define ASSERT_NE(v1, v2)      ((void) 0)
2737f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch#define ASSERT_GE(v1, v2)      ((void) 0)
2748b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch#define ASSERT_LT(v1, v2)      ((void) 0)
2758b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch#define ASSERT_LE(v1, v2)      ((void) 0)
276a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define SLOW_ASSERT(condition) ((void) 0)
277a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif
278756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick// Static asserts has no impact on runtime performance, so they can be
279756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick// safely enabled in release mode. Moreover, the ((void) 0) expression
280756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick// obeys different syntax rules than typedef's, e.g. it can't appear
281756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick// inside class declaration, this leads to inconsistency between debug
282b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// and release compilation modes behavior.
283756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick#define STATIC_ASSERT(test)  STATIC_CHECK(test)
284a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
285a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define ASSERT_NOT_NULL(p)  ASSERT_NE(NULL, p)
286a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
287a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif  // V8_CHECKS_H_
288