| Index: src/wasm/wasm-result.h
|
| diff --git a/src/wasm/wasm-result.h b/src/wasm/wasm-result.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..59ab29ebe4060c4f54dbfea9e5cc60837745a709
|
| --- /dev/null
|
| +++ b/src/wasm/wasm-result.h
|
| @@ -0,0 +1,116 @@
|
| +// 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_WASM_RESULT_H_
|
| +#define V8_WASM_RESULT_H_
|
| +
|
| +#include "src/base/smart-pointers.h"
|
| +
|
| +#include "src/globals.h"
|
| +
|
| +namespace v8 {
|
| +namespace internal {
|
| +
|
| +class Isolate;
|
| +
|
| +namespace wasm {
|
| +
|
| +// Error codes for programmatic checking of the decoder's verification.
|
| +enum ErrorCode {
|
| + kSuccess,
|
| + kError, // TODO(titzer): remove me
|
| + kOutOfMemory, // decoder ran out of memory
|
| + kEndOfCode, // end of code reached prematurely
|
| + kInvalidOpcode, // found invalid opcode
|
| + kUnreachableCode, // found unreachable code
|
| + kImproperContinue, // improperly nested continue
|
| + kImproperBreak, // improperly nested break
|
| + kReturnCount, // return count mismatch
|
| + kTypeError, // type mismatch
|
| + kInvalidLocalIndex, // invalid local
|
| + kInvalidGlobalIndex, // invalid global
|
| + kInvalidFunctionIndex, // invalid function
|
| + kInvalidMemType // invalid memory type
|
| +};
|
| +
|
| +// The overall result of decoding a function or a module.
|
| +template <typename T>
|
| +struct Result {
|
| + Result()
|
| + : val(nullptr), error_code(kSuccess), start(nullptr), error_pc(nullptr) {
|
| + error_msg.Reset(nullptr);
|
| + }
|
| +
|
| + T val;
|
| + ErrorCode error_code;
|
| + const byte* start;
|
| + const byte* error_pc;
|
| + const byte* error_pt;
|
| + base::SmartArrayPointer<char> error_msg;
|
| +
|
| + bool ok() const { return error_code == kSuccess; }
|
| + bool failed() const { return error_code != kSuccess; }
|
| +
|
| + template <typename V>
|
| + void CopyFrom(Result<V>& that) {
|
| + error_code = that.error_code;
|
| + start = that.start;
|
| + error_pc = that.error_pc;
|
| + error_pt = that.error_pt;
|
| + error_msg = that.error_msg;
|
| + }
|
| +};
|
| +
|
| +template <typename T>
|
| +std::ostream& operator<<(std::ostream& os, const Result<T>& result) {
|
| + os << "Result = ";
|
| + if (result.ok()) {
|
| + if (result.val != nullptr) {
|
| + os << *result.val;
|
| + } else {
|
| + os << "success (no value)";
|
| + }
|
| + } else if (result.error_msg.get() != nullptr) {
|
| + ptrdiff_t offset = result.error_pc - result.start;
|
| + if (offset < 0) {
|
| + os << result.error_msg.get() << " @" << offset;
|
| + } else {
|
| + os << result.error_msg.get() << " @+" << offset;
|
| + }
|
| + } else {
|
| + os << result.error_code;
|
| + }
|
| + os << std::endl;
|
| + return os;
|
| +}
|
| +
|
| +std::ostream& operator<<(std::ostream& os, const ErrorCode& error_code);
|
| +
|
| +// A helper for generating error messages that bubble up to JS exceptions.
|
| +class ErrorThrower {
|
| + public:
|
| + ErrorThrower(Isolate* isolate, const char* context)
|
| + : isolate_(isolate), context_(context), error_(false) {}
|
| +
|
| + void Error(const char* fmt, ...);
|
| +
|
| + template <typename T>
|
| + void Failed(const char* error, Result<T>& result) {
|
| + std::ostringstream str;
|
| + str << error << result;
|
| + return Error(str.str().c_str());
|
| + }
|
| +
|
| + bool error() const { return error_; }
|
| +
|
| + private:
|
| + Isolate* isolate_;
|
| + const char* context_;
|
| + bool error_;
|
| +};
|
| +} // namespace wasm
|
| +} // namespace internal
|
| +} // namespace v8
|
| +
|
| +#endif
|
|
|