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

Side by Side Diff: src/wasm/wasm-js.cc

Issue 2724053002: [wasm] Better error message for exceeding module size limits. (Closed)
Patch Set: [wasm] Better error message for exceeding module size limits. Created 3 years, 9 months 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 unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 the V8 project authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/api-natives.h" 5 #include "src/api-natives.h"
6 #include "src/api.h" 6 #include "src/api.h"
7 #include "src/asmjs/asm-js.h" 7 #include "src/asmjs/asm-js.h"
8 #include "src/asmjs/asm-typer.h" 8 #include "src/asmjs/asm-typer.h"
9 #include "src/asmjs/asm-wasm-builder.h" 9 #include "src/asmjs/asm-wasm-builder.h"
10 #include "src/assert-scope.h" 10 #include "src/assert-scope.h"
(...skipping 14 matching lines...) Expand all
25 #include "src/wasm/wasm-result.h" 25 #include "src/wasm/wasm-result.h"
26 26
27 typedef uint8_t byte; 27 typedef uint8_t byte;
28 28
29 using v8::internal::wasm::ErrorThrower; 29 using v8::internal::wasm::ErrorThrower;
30 30
31 namespace v8 { 31 namespace v8 {
32 32
33 namespace { 33 namespace {
34 34
35 #define RANGE_ERROR_MSG \
36 "Wasm compilation exceeds internal limits in this context for the provided " \
37 "arguments"
38
39 // TODO(wasm): move brand check to the respective types, and don't throw 35 // TODO(wasm): move brand check to the respective types, and don't throw
40 // in it, rather, use a provided ErrorThrower, or let caller handle it. 36 // in it, rather, use a provided ErrorThrower, or let caller handle it.
41 static bool HasBrand(i::Handle<i::Object> value, i::Handle<i::Symbol> sym) { 37 static bool HasBrand(i::Handle<i::Object> value, i::Handle<i::Symbol> sym) {
42 if (!value->IsJSObject()) return false; 38 if (!value->IsJSObject()) return false;
43 i::Handle<i::JSObject> object = i::Handle<i::JSObject>::cast(value); 39 i::Handle<i::JSObject> object = i::Handle<i::JSObject>::cast(value);
44 Maybe<bool> has_brand = i::JSObject::HasOwnProperty(object, sym); 40 Maybe<bool> has_brand = i::JSObject::HasOwnProperty(object, sym);
45 return has_brand.FromMaybe(false); 41 return has_brand.FromMaybe(false);
46 } 42 }
47 43
48 static bool BrandCheck(i::Handle<i::Object> value, i::Handle<i::Symbol> sym, 44 static bool BrandCheck(i::Handle<i::Object> value, i::Handle<i::Symbol> sym,
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
81 bool IsCompilationAllowed(i::Isolate* isolate, ErrorThrower* thrower, 77 bool IsCompilationAllowed(i::Isolate* isolate, ErrorThrower* thrower,
82 v8::Local<v8::Value> source, bool is_async) { 78 v8::Local<v8::Value> source, bool is_async) {
83 // Allow caller to do one final check on thrower state, rather than 79 // Allow caller to do one final check on thrower state, rather than
84 // one at each step. No information is lost - failure reason is captured 80 // one at each step. No information is lost - failure reason is captured
85 // in the thrower state. 81 // in the thrower state.
86 if (thrower->error()) return false; 82 if (thrower->error()) return false;
87 83
88 AllowWasmCompileCallback callback = isolate->allow_wasm_compile_callback(); 84 AllowWasmCompileCallback callback = isolate->allow_wasm_compile_callback();
89 if (callback != nullptr && 85 if (callback != nullptr &&
90 !callback(reinterpret_cast<v8::Isolate*>(isolate), source, is_async)) { 86 !callback(reinterpret_cast<v8::Isolate*>(isolate), source, is_async)) {
91 thrower->RangeError(RANGE_ERROR_MSG); 87 thrower->RangeError(
88 "%ssynchronous compilation disallowed due to module size limit set by "
89 "embedder",
90 is_async ? "a" : "");
92 return false; 91 return false;
93 } 92 }
94 return true; 93 return true;
95 } 94 }
96 95
97 bool IsInstantiationAllowed(i::Isolate* isolate, ErrorThrower* thrower, 96 bool IsInstantiationAllowed(i::Isolate* isolate, ErrorThrower* thrower,
98 v8::Local<v8::Value> module_or_bytes, 97 v8::Local<v8::Value> module_or_bytes,
99 i::MaybeHandle<i::JSReceiver> ffi, bool is_async) { 98 i::MaybeHandle<i::JSReceiver> ffi, bool is_async) {
100 // Allow caller to do one final check on thrower state, rather than 99 // Allow caller to do one final check on thrower state, rather than
101 // one at each step. No information is lost - failure reason is captured 100 // one at each step. No information is lost - failure reason is captured
102 // in the thrower state. 101 // in the thrower state.
103 if (thrower->error()) return false; 102 if (thrower->error()) return false;
104 v8::MaybeLocal<v8::Value> v8_ffi; 103 v8::MaybeLocal<v8::Value> v8_ffi;
105 if (!ffi.is_null()) { 104 if (!ffi.is_null()) {
106 v8_ffi = v8::Local<v8::Value>::Cast(Utils::ToLocal(ffi.ToHandleChecked())); 105 v8_ffi = v8::Local<v8::Value>::Cast(Utils::ToLocal(ffi.ToHandleChecked()));
107 } 106 }
108 AllowWasmInstantiateCallback callback = 107 AllowWasmInstantiateCallback callback =
109 isolate->allow_wasm_instantiate_callback(); 108 isolate->allow_wasm_instantiate_callback();
110 if (callback != nullptr && 109 if (callback != nullptr &&
111 !callback(reinterpret_cast<v8::Isolate*>(isolate), module_or_bytes, 110 !callback(reinterpret_cast<v8::Isolate*>(isolate), module_or_bytes,
112 v8_ffi, is_async)) { 111 v8_ffi, is_async)) {
113 thrower->RangeError(RANGE_ERROR_MSG); 112 thrower->RangeError(
113 "%ssynchronous instantiation disallowed due to module size limit set "
114 "by embedder",
115 is_async ? "a" : "");
114 return false; 116 return false;
115 } 117 }
116 return true; 118 return true;
117 } 119 }
118 120
119 i::wasm::ModuleWireBytes GetFirstArgumentAsBytes( 121 i::wasm::ModuleWireBytes GetFirstArgumentAsBytes(
120 const v8::FunctionCallbackInfo<v8::Value>& args, ErrorThrower* thrower) { 122 const v8::FunctionCallbackInfo<v8::Value>& args, ErrorThrower* thrower) {
121 if (args.Length() < 1) { 123 if (args.Length() < 1) {
122 thrower->TypeError("Argument 0 must be a buffer source"); 124 thrower->TypeError("Argument 0 must be a buffer source");
123 return i::wasm::ModuleWireBytes(nullptr, nullptr); 125 return i::wasm::ModuleWireBytes(nullptr, nullptr);
(...skipping 792 matching lines...) Expand 10 before | Expand all | Expand 10 after
916 i::Handle<i::Symbol> symbol(isolate->context()->wasm_memory_sym(), isolate); 918 i::Handle<i::Symbol> symbol(isolate->context()->wasm_memory_sym(), isolate);
917 return HasBrand(value, symbol); 919 return HasBrand(value, symbol);
918 } 920 }
919 921
920 bool WasmJs::IsWasmTableObject(Isolate* isolate, Handle<Object> value) { 922 bool WasmJs::IsWasmTableObject(Isolate* isolate, Handle<Object> value) {
921 i::Handle<i::Symbol> symbol(isolate->context()->wasm_table_sym(), isolate); 923 i::Handle<i::Symbol> symbol(isolate->context()->wasm_table_sym(), isolate);
922 return HasBrand(value, symbol); 924 return HasBrand(value, symbol);
923 } 925 }
924 } // namespace internal 926 } // namespace internal
925 } // namespace v8 927 } // namespace v8
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698