Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(57)

Unified Diff: src/wasm/wasm-result.h

Issue 1504713014: Initial import of v8-native WASM. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698