b28b7e1328
For historical reasons, the interpreter's bytecode expectations tests required a type for the constant pool. This had two disadvantages: 1. Strings and numbers were not visible in mixed pools, and 2. Mismatches of pool types (e.g. when rebaselining) would cause parser errors This removes the pool types, making everything 'mixed', but appending the values to string and number valued constants. Specifying a pool type in the *.golden header now prints a warning (for backwards compatibility). BUG=v8:5350 Review-Url: https://codereview.chromium.org/2310103002 Cr-Commit-Position: refs/heads/master@{#39216}
113 lines
4.0 KiB
C++
113 lines
4.0 KiB
C++
// Copyright 2016 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 TEST_CCTEST_INTERPRETER_BYTECODE_EXPECTATIONS_PRINTER_H_
|
|
#define TEST_CCTEST_INTERPRETER_BYTECODE_EXPECTATIONS_PRINTER_H_
|
|
|
|
#include <iostream>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
#include "src/interpreter/bytecodes.h"
|
|
#include "src/objects.h"
|
|
|
|
namespace v8 {
|
|
|
|
class Isolate;
|
|
|
|
namespace internal {
|
|
|
|
class SourcePositionTableIterator;
|
|
|
|
namespace interpreter {
|
|
|
|
class BytecodeArrayIterator;
|
|
|
|
class BytecodeExpectationsPrinter final {
|
|
public:
|
|
explicit BytecodeExpectationsPrinter(v8::Isolate* i)
|
|
: isolate_(i),
|
|
execute_(true),
|
|
wrap_(true),
|
|
top_level_(false),
|
|
test_function_name_(kDefaultTopFunctionName) {}
|
|
|
|
void PrintExpectation(std::ostream& stream, // NOLINT
|
|
const std::string& snippet) const;
|
|
|
|
void set_execute(bool execute) { execute_ = execute; }
|
|
bool execute() const { return execute_; }
|
|
|
|
void set_wrap(bool wrap) { wrap_ = wrap; }
|
|
bool wrap() const { return wrap_; }
|
|
|
|
void set_top_level(bool top_level) { top_level_ = top_level; }
|
|
bool top_level() const { return top_level_; }
|
|
|
|
void set_test_function_name(const std::string& test_function_name) {
|
|
test_function_name_ = test_function_name;
|
|
}
|
|
std::string test_function_name() const { return test_function_name_; }
|
|
|
|
private:
|
|
void PrintEscapedString(std::ostream& stream, // NOLINT
|
|
const std::string& string) const;
|
|
void PrintBytecodeOperand(std::ostream& stream, // NOLINT
|
|
const BytecodeArrayIterator& bytecode_iterator,
|
|
const Bytecode& bytecode, int op_index,
|
|
int parameter_count) const;
|
|
void PrintBytecode(std::ostream& stream, // NOLINT
|
|
const BytecodeArrayIterator& bytecode_iterator,
|
|
int parameter_count) const;
|
|
void PrintSourcePosition(std::ostream& stream, // NOLINT
|
|
SourcePositionTableIterator& source_iterator,
|
|
int bytecode_offset) const;
|
|
void PrintV8String(std::ostream& stream, // NOLINT
|
|
i::String* string) const;
|
|
void PrintConstant(std::ostream& stream, // NOLINT
|
|
i::Handle<i::Object> constant) const;
|
|
void PrintFrameSize(std::ostream& stream, // NOLINT
|
|
i::Handle<i::BytecodeArray> bytecode_array) const;
|
|
void PrintBytecodeSequence(std::ostream& stream, // NOLINT
|
|
i::Handle<i::BytecodeArray> bytecode_array) const;
|
|
void PrintConstantPool(std::ostream& stream, // NOLINT
|
|
i::FixedArray* constant_pool) const;
|
|
void PrintCodeSnippet(std::ostream& stream, // NOLINT
|
|
const std::string& body) const;
|
|
void PrintBytecodeArray(std::ostream& stream, // NOLINT
|
|
i::Handle<i::BytecodeArray> bytecode_array) const;
|
|
void PrintHandlers(std::ostream& stream, // NOLINT
|
|
i::Handle<i::BytecodeArray> bytecode_array) const;
|
|
|
|
v8::Local<v8::String> V8StringFromUTF8(const char* data) const;
|
|
std::string WrapCodeInFunction(const char* function_name,
|
|
const std::string& function_body) const;
|
|
|
|
v8::Local<v8::Script> Compile(const char* program) const;
|
|
void Run(v8::Local<v8::Script> script) const;
|
|
i::Handle<i::BytecodeArray> GetBytecodeArrayForGlobal(
|
|
const char* global_name) const;
|
|
i::Handle<v8::internal::BytecodeArray> GetBytecodeArrayForScript(
|
|
v8::Local<v8::Script> script) const;
|
|
|
|
i::Isolate* i_isolate() const {
|
|
return reinterpret_cast<i::Isolate*>(isolate_);
|
|
}
|
|
|
|
v8::Isolate* isolate_;
|
|
bool execute_;
|
|
bool wrap_;
|
|
bool top_level_;
|
|
std::string test_function_name_;
|
|
|
|
static const char* const kDefaultTopFunctionName;
|
|
static const char* const kIndent;
|
|
};
|
|
|
|
} // namespace interpreter
|
|
} // namespace internal
|
|
} // namespace v8
|
|
|
|
#endif // TEST_CCTEST_INTERPRETER_BYTECODE_EXPECTATIONS_PRINTER_H_
|