Chromium Code Reviews| 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.h" | 5 #include "src/api.h" |
| 6 #include "src/api-natives.h" | 6 #include "src/api-natives.h" |
| 7 #include "src/assert-scope.h" | 7 #include "src/assert-scope.h" |
| 8 #include "src/ast/ast.h" | 8 #include "src/ast/ast.h" |
| 9 #include "src/ast/scopes.h" | 9 #include "src/ast/scopes.h" |
| 10 #include "src/factory.h" | 10 #include "src/factory.h" |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 30 namespace { | 30 namespace { |
| 31 struct RawBuffer { | 31 struct RawBuffer { |
| 32 const byte* start; | 32 const byte* start; |
| 33 const byte* end; | 33 const byte* end; |
| 34 size_t size() { return static_cast<size_t>(end - start); } | 34 size_t size() { return static_cast<size_t>(end - start); } |
| 35 }; | 35 }; |
| 36 | 36 |
| 37 | 37 |
| 38 RawBuffer GetRawBufferArgument( | 38 RawBuffer GetRawBufferArgument( |
| 39 ErrorThrower& thrower, const v8::FunctionCallbackInfo<v8::Value>& args) { | 39 ErrorThrower& thrower, const v8::FunctionCallbackInfo<v8::Value>& args) { |
| 40 // TODO(titzer): allow typed array views. | 40 if (args.Length() < 1) { |
| 41 if (args.Length() < 1 || !args[0]->IsArrayBuffer()) { | |
| 42 thrower.Error("Argument 0 must be an array buffer"); | 41 thrower.Error("Argument 0 must be an array buffer"); |
| 43 return {nullptr, nullptr}; | 42 return {nullptr, nullptr}; |
| 44 } | 43 } |
| 45 Local<ArrayBuffer> buffer = Local<ArrayBuffer>::Cast(args[0]); | |
| 46 ArrayBuffer::Contents contents = buffer->GetContents(); | |
| 47 | 44 |
| 48 const byte* start = reinterpret_cast<const byte*>(contents.Data()); | 45 const byte* start = nullptr; |
| 49 const byte* end = start + contents.ByteLength(); | 46 const byte* end = nullptr; |
| 50 | 47 |
| 51 if (start == nullptr) { | 48 if (args[0]->IsArrayBuffer()) { |
| 52 thrower.Error("ArrayBuffer argument is empty"); | 49 // A raw array buffer was passed. |
| 50 Local<ArrayBuffer> buffer = Local<ArrayBuffer>::Cast(args[0]); | |
| 51 ArrayBuffer::Contents contents = buffer->GetContents(); | |
| 52 | |
| 53 start = reinterpret_cast<const byte*>(contents.Data()); | |
| 54 end = start + contents.ByteLength(); | |
| 55 | |
| 56 if (start == nullptr) { | |
|
Derek Schuff
2016/03/07 20:37:17
should we also throw if the length is 0 or otherwi
titzer
2016/03/07 20:39:53
Done.
| |
| 57 thrower.Error("ArrayBuffer argument is empty"); | |
| 58 } | |
| 59 } else if (args[0]->IsUint8Array()) { | |
| 60 // A Uint8Array was passed. | |
| 61 Local<Uint8Array> array = Local<Uint8Array>::Cast(args[0]); | |
| 62 Local<ArrayBuffer> buffer = array->Buffer(); | |
| 63 | |
| 64 ArrayBuffer::Contents contents = buffer->GetContents(); | |
| 65 | |
| 66 start = | |
| 67 reinterpret_cast<const byte*>(contents.Data()) + array->ByteOffset(); | |
| 68 end = start + array->ByteLength(); | |
| 69 | |
| 70 if (start == nullptr || end == start) { | |
| 71 thrower.Error("ArrayBuffer argument is empty"); | |
| 72 } | |
| 73 } else { | |
| 74 thrower.Error("Argument 0 must be an ArrayBuffer or Uint8Array"); | |
| 53 } | 75 } |
| 76 | |
| 54 return {start, end}; | 77 return {start, end}; |
| 55 } | 78 } |
| 56 | 79 |
| 57 | 80 |
| 58 void VerifyModule(const v8::FunctionCallbackInfo<v8::Value>& args) { | 81 void VerifyModule(const v8::FunctionCallbackInfo<v8::Value>& args) { |
| 59 HandleScope scope(args.GetIsolate()); | 82 HandleScope scope(args.GetIsolate()); |
| 60 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(args.GetIsolate()); | 83 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(args.GetIsolate()); |
| 61 ErrorThrower thrower(isolate, "WASM.verifyModule()"); | 84 ErrorThrower thrower(isolate, "WASM.verifyModule()"); |
| 62 | 85 |
| 63 RawBuffer buffer = GetRawBufferArgument(thrower, args); | 86 RawBuffer buffer = GetRawBufferArgument(thrower, args); |
| (...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 286 if (!context->get(Context::WASM_FUNCTION_MAP_INDEX)->IsMap()) { | 309 if (!context->get(Context::WASM_FUNCTION_MAP_INDEX)->IsMap()) { |
| 287 Handle<Map> wasm_function_map = isolate->factory()->NewMap( | 310 Handle<Map> wasm_function_map = isolate->factory()->NewMap( |
| 288 JS_FUNCTION_TYPE, JSFunction::kSize + kPointerSize); | 311 JS_FUNCTION_TYPE, JSFunction::kSize + kPointerSize); |
| 289 wasm_function_map->set_is_callable(); | 312 wasm_function_map->set_is_callable(); |
| 290 context->set_wasm_function_map(*wasm_function_map); | 313 context->set_wasm_function_map(*wasm_function_map); |
| 291 } | 314 } |
| 292 } | 315 } |
| 293 | 316 |
| 294 } // namespace internal | 317 } // namespace internal |
| 295 } // namespace v8 | 318 } // namespace v8 |
| OLD | NEW |