// Copyright 2015 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef V8_EXPRESSION_TYPE_COLLECTOR_MACROS_H_
#define V8_EXPRESSION_TYPE_COLLECTOR_MACROS_H_

#define CHECK_TYPES_BEGIN \
  {                       \
    size_t index = 0;     \
    int depth = 0;

#define CHECK_TYPES_END          \
  CHECK_EQ(index, types.size()); \
  }

#ifdef DEBUG
#define CHECK_TYPE(type)                    \
  if (!types[index].bounds.Narrows(type)) { \
    fprintf(stderr, "Expected:\n");         \
    fprintf(stderr, "  lower: ");           \
    type.lower->Print();                    \
    fprintf(stderr, "  upper: ");           \
    type.upper->Print();                    \
    fprintf(stderr, "Actual:\n");           \
    fprintf(stderr, "  lower: ");           \
    types[index].bounds.lower->Print();     \
    fprintf(stderr, "  upper: ");           \
    types[index].bounds.upper->Print();     \
  }                                         \
  CHECK(types[index].bounds.Narrows(type));
#else
#define CHECK_TYPE(type) CHECK(types[index].bounds.Narrows(type));
#endif

#define CHECK_EXPR(ekind, type)                   \
  CHECK_LT(index, types.size());                  \
  CHECK_EQ(strcmp(#ekind, types[index].kind), 0); \
  CHECK_EQ(depth, types[index].depth);            \
  CHECK_TYPE(type);                               \
  for (int j = (++depth, ++index, 0); j < 1 ? 1 : (--depth, 0); ++j)

#define CHECK_VAR(vname, type)                                     \
  CHECK_EXPR(VariableProxy, type);                                 \
  CHECK_EQ(#vname, std::string(types[index - 1].name->raw_data(),  \
                               types[index - 1].name->raw_data() + \
                                   types[index - 1].name->byte_length()));

#define CHECK_SKIP()                                             \
  {                                                              \
    ++index;                                                     \
    while (index < types.size() && types[index].depth > depth) { \
      ++index;                                                   \
    }                                                            \
  }

#endif  // V8_EXPRESSION_TYPE_COLLECTOR_MACROS_H_
