| Index: test/cctest/scope-test-helper.h
|
| diff --git a/test/cctest/scope-test-helper.h b/test/cctest/scope-test-helper.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..de77e47b32cfbb6de996a8a2477ad265c74eeadd
|
| --- /dev/null
|
| +++ b/test/cctest/scope-test-helper.h
|
| @@ -0,0 +1,88 @@
|
| +// Copyright 2017 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_CCTEST_SCOPE_TEST_HELPER_H_
|
| +#define V8_CCTEST_SCOPE_TEST_HELPER_H_
|
| +
|
| +#include "src/ast/scopes.h"
|
| +#include "src/ast/variables.h"
|
| +
|
| +namespace v8 {
|
| +namespace internal {
|
| +
|
| +class ScopeTestHelper {
|
| + public:
|
| + static bool MustAllocateInContext(Variable* var) {
|
| + return var->scope()->MustAllocateInContext(var);
|
| + }
|
| +
|
| + // True if the scope is and its entire subscope tree are hidden.
|
| + static bool ScopeTreeIsHidden(Scope* scope) {
|
| + if (!scope->is_hidden()) {
|
| + return false;
|
| + }
|
| + for (Scope* inner = scope->inner_scope(); inner != nullptr;
|
| + inner = inner->sibling()) {
|
| + if (!ScopeTreeIsHidden(inner)) {
|
| + return false;
|
| + }
|
| + }
|
| + return true;
|
| + }
|
| +
|
| + static void CompareScopeToData(Scope* scope, const PreParsedScopeData* data,
|
| + size_t& index) {
|
| + CHECK_EQ(data->backing_store_[index++], scope->scope_type());
|
| + CHECK_EQ(data->backing_store_[index++], scope->start_position());
|
| + CHECK_EQ(data->backing_store_[index++], scope->end_position());
|
| +
|
| + int inner_scope_count = 0;
|
| + for (Scope* inner = scope->inner_scope(); inner != nullptr;
|
| + inner = inner->sibling()) {
|
| + // FIXME(marja): This is probably not the right condition for knowing what
|
| + // scopes are present in the preparse data.
|
| + if (!ScopeTreeIsHidden(inner)) {
|
| + ++inner_scope_count;
|
| + }
|
| + }
|
| + CHECK_EQ(data->backing_store_[index++], inner_scope_count);
|
| +
|
| + int variable_count = 0;
|
| + for (Variable* local : scope->locals_) {
|
| + if (local->mode() == VAR || local->mode() == LET ||
|
| + local->mode() == CONST) {
|
| + ++variable_count;
|
| + }
|
| + }
|
| +
|
| + CHECK_EQ(data->backing_store_[index++], variable_count);
|
| +
|
| + for (Variable* local : scope->locals_) {
|
| + if (local->mode() == VAR || local->mode() == LET ||
|
| + local->mode() == CONST) {
|
| +#ifdef DEBUG
|
| + const AstRawString* local_name = local->raw_name();
|
| + int name_length = data->backing_store_[index++];
|
| + CHECK_EQ(name_length, local_name->length());
|
| + for (int i = 0; i < name_length; ++i) {
|
| + CHECK_EQ(data->backing_store_[index++], local_name->raw_data()[i]);
|
| + }
|
| +#endif
|
| + CHECK_EQ(data->backing_store_[index++], local->location());
|
| + CHECK_EQ(data->backing_store_[index++], local->maybe_assigned());
|
| + }
|
| + }
|
| +
|
| + for (Scope* inner = scope->inner_scope(); inner != nullptr;
|
| + inner = inner->sibling()) {
|
| + if (!ScopeTreeIsHidden(inner)) {
|
| + CompareScopeToData(inner, data, index);
|
| + }
|
| + }
|
| + }
|
| +};
|
| +} // namespace internal
|
| +} // namespace v8
|
| +
|
| +#endif // V8_CCTEST_SCOPE_TEST_HELPER_H_
|
|
|