Upgrade V8 to version 4.9.385.28
https://chromium.googlesource.com/v8/v8/+/4.9.385.28
FPIIM-449
Change-Id: I4b2e74289d4bf3667f2f3dc8aa2e541f63e26eb4
diff --git a/src/wasm/wasm-result.h b/src/wasm/wasm-result.h
new file mode 100644
index 0000000..59ab29e
--- /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