v8
V8 is Google’s open source high-performance JavaScript and WebAssembly engine, written in C++.
Loading...
Searching...
No Matches
wasm-result.cc
Go to the documentation of this file.
1// Copyright 2015 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
6
7#include "src/base/strings.h"
9#include "src/heap/factory.h"
10#include "src/objects/objects.h"
11
12namespace v8 {
13namespace internal {
14namespace wasm {
15
16namespace {
17
18PRINTF_FORMAT(3, 0)
19void VPrintFToString(std::string* str, size_t str_offset, const char* format,
20 va_list args) {
21 DCHECK_LE(str_offset, str->size());
22 size_t len = str_offset + strlen(format);
23 // Allocate increasingly large buffers until the message fits.
24 for (;; len = base::bits::RoundUpToPowerOfTwo64(len + 1)) {
25 DCHECK_GE(kMaxInt, len);
26 str->resize(len);
27 va_list args_copy;
28 va_copy(args_copy, args);
29 int written =
30 base::VSNPrintF(base::Vector<char>(&str->front() + str_offset,
31 static_cast<int>(len - str_offset)),
32 format, args_copy);
33 va_end(args_copy);
34 if (written < 0) continue; // not enough space.
35 str->resize(str_offset + written);
36 return;
37 }
38}
39
40PRINTF_FORMAT(3, 4)
41void PrintFToString(std::string* str, size_t str_offset, const char* format,
42 ...) {
43 va_list args;
44 va_start(args, format);
45 VPrintFToString(str, str_offset, format, args);
46 va_end(args);
47}
48
49} // namespace
50
51// static
52std::string WasmError::FormatError(const char* format, va_list args) {
53 std::string result;
54 VPrintFToString(&result, 0, format, args);
55 return result;
56}
57
58void ErrorThrower::Format(ErrorType type, const char* format, va_list args) {
59 DCHECK_NE(kNone, type);
60 // Only report the first error.
61 if (error()) return;
62
63 size_t context_len = 0;
64 if (context_) {
65 PrintFToString(&error_msg_, 0, "%s: ", context_);
66 context_len = error_msg_.size();
67 }
68 VPrintFToString(&error_msg_, context_len, format, args);
70}
71
72void ErrorThrower::TypeError(const char* format, ...) {
73 va_list arguments;
74 va_start(arguments, format);
75 Format(kTypeError, format, arguments);
76 va_end(arguments);
77}
78
79void ErrorThrower::RangeError(const char* format, ...) {
80 va_list arguments;
81 va_start(arguments, format);
82 Format(kRangeError, format, arguments);
83 va_end(arguments);
84}
85
86void ErrorThrower::CompileError(const char* format, ...) {
87 va_list arguments;
88 va_start(arguments, format);
89 Format(kCompileError, format, arguments);
90 va_end(arguments);
91}
92
93void ErrorThrower::LinkError(const char* format, ...) {
94 va_list arguments;
95 va_start(arguments, format);
96 Format(kLinkError, format, arguments);
97 va_end(arguments);
98}
99
100void ErrorThrower::RuntimeError(const char* format, ...) {
101 va_list arguments;
102 va_start(arguments, format);
103 Format(kRuntimeError, format, arguments);
104 va_end(arguments);
105}
106
108 DirectHandle<JSFunction> constructor;
109 switch (error_type_) {
110 case kNone:
111 UNREACHABLE();
112 case kTypeError:
113 constructor = isolate_->type_error_function();
114 break;
115 case kRangeError:
116 constructor = isolate_->range_error_function();
117 break;
118 case kCompileError:
119 constructor = isolate_->wasm_compile_error_function();
120 break;
121 case kLinkError:
122 constructor = isolate_->wasm_link_error_function();
123 break;
124 case kRuntimeError:
125 constructor = isolate_->wasm_runtime_error_function();
126 break;
127 }
128 DirectHandle<String> message =
131 .ToHandleChecked();
132 Reset();
133 return isolate_->factory()->NewError(constructor, message);
134}
135
138 error_msg_.clear();
139}
140
142 if (!error() || isolate_->has_exception()) return;
143
144 HandleScope handle_scope{isolate_};
145 isolate_->Throw(*Reify());
146}
147
148} // namespace wasm
149} // namespace internal
150} // namespace v8
V8_WARN_UNUSED_RESULT MaybeHandle< String > NewStringFromUtf8(base::Vector< const char > str, AllocationType allocation=AllocationType::kYoung)
Definition factory.cc:753
Handle< JSObject > NewError(DirectHandle< JSFunction > constructor, DirectHandle< String > message, DirectHandle< Object > options={})
Definition factory.cc:2799
Tagged< Object > Throw(Tagged< Object > exception, MessageLocation *location=nullptr)
Definition isolate.cc:2091
v8::internal::Factory * factory()
Definition isolate.h:1527
V8_WARN_UNUSED_RESULT DirectHandle< JSObject > Reify()
void Format(ErrorType error_type_, const char *fmt, va_list)
static std::string FormatError(const char *format, va_list args)
base::Vector< const DirectHandle< Object > > args
Definition execution.cc:74
ZoneVector< RpoNumber > & result
STL namespace.
V8_BASE_EXPORT constexpr uint64_t RoundUpToPowerOfTwo64(uint64_t value)
Definition bits.h:235
constexpr Vector< T > VectorOf(T *start, size_t size)
Definition vector.h:360
int VSNPrintF(Vector< char > str, const char *format, va_list args)
Definition strings.cc:16
constexpr int kMaxInt
Definition globals.h:374
Definition c-api.cc:87
#define PRINTF_FORMAT(format_param, dots_param)
#define DCHECK_LE(v1, v2)
Definition logging.h:490
#define DCHECK_NE(v1, v2)
Definition logging.h:486
#define DCHECK_GE(v1, v2)
Definition logging.h:488
wasm::ValueType type