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 |