| OLD | NEW | 
|---|
| 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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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 | 
| OLD | NEW | 
|---|