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

Side by Side Diff: src/wasm/wasm-module.h

Issue 2340623003: [wasm] Strongly typed compiled module (Closed)
Patch Set: Created 4 years, 3 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 | src/wasm/wasm-module.cc » ('j') | 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 #ifndef V8_WASM_MODULE_H_ 5 #ifndef V8_WASM_MODULE_H_
6 #define V8_WASM_MODULE_H_ 6 #define V8_WASM_MODULE_H_
7 7
8 #include <memory> 8 #include <memory>
9 9
10 #include "src/api.h" 10 #include "src/api.h"
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after
153 153
154 // Static representation of a wasm indirect call table. 154 // Static representation of a wasm indirect call table.
155 struct WasmIndirectFunctionTable { 155 struct WasmIndirectFunctionTable {
156 uint32_t size; // initial table size. 156 uint32_t size; // initial table size.
157 uint32_t max_size; // maximum table size. 157 uint32_t max_size; // maximum table size.
158 std::vector<uint16_t> values; // function table. 158 std::vector<uint16_t> values; // function table.
159 }; 159 };
160 160
161 enum ModuleOrigin { kWasmOrigin, kAsmJsOrigin }; 161 enum ModuleOrigin { kWasmOrigin, kAsmJsOrigin };
162 162
163 class WasmCompiledModule;
164
163 // Static representation of a module. 165 // Static representation of a module.
164 struct WasmModule { 166 struct WasmModule {
165 static const uint32_t kPageSize = 0x10000; // Page size, 64kb. 167 static const uint32_t kPageSize = 0x10000; // Page size, 64kb.
166 static const uint32_t kMinMemPages = 1; // Minimum memory size = 64kb 168 static const uint32_t kMinMemPages = 1; // Minimum memory size = 64kb
167 static const uint32_t kMaxMemPages = 16384; // Maximum memory size = 1gb 169 static const uint32_t kMaxMemPages = 16384; // Maximum memory size = 1gb
168 170
169 const byte* module_start; // starting address for the module bytes. 171 const byte* module_start; // starting address for the module bytes.
170 const byte* module_end; // end address for the module bytes. 172 const byte* module_end; // end address for the module bytes.
171 uint32_t min_mem_pages; // minimum size of the memory in 64k pages. 173 uint32_t min_mem_pages; // minimum size of the memory in 64k pages.
172 uint32_t max_mem_pages; // maximum size of the memory in 64k pages. 174 uint32_t max_mem_pages; // maximum size of the memory in 64k pages.
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
231 size_t size = module_end - module_start; 233 size_t size = module_end - module_start;
232 return start <= size && end <= size; 234 return start <= size && end <= size;
233 } 235 }
234 236
235 // Creates a new instantiation of the module in the given isolate. 237 // Creates a new instantiation of the module in the given isolate.
236 static MaybeHandle<JSObject> Instantiate(Isolate* isolate, 238 static MaybeHandle<JSObject> Instantiate(Isolate* isolate,
237 Handle<JSObject> module_object, 239 Handle<JSObject> module_object,
238 Handle<JSReceiver> ffi, 240 Handle<JSReceiver> ffi,
239 Handle<JSArrayBuffer> memory); 241 Handle<JSArrayBuffer> memory);
240 242
241 MaybeHandle<FixedArray> CompileFunctions(Isolate* isolate, 243 MaybeHandle<WasmCompiledModule> CompileFunctions(Isolate* isolate,
242 ErrorThrower* thrower) const; 244 ErrorThrower* thrower) const;
243 245
244 private: 246 private:
245 DISALLOW_COPY_AND_ASSIGN(WasmModule); 247 DISALLOW_COPY_AND_ASSIGN(WasmModule);
246 }; 248 };
247 249
248 // An instantiated WASM module, including memory, function table, etc. 250 // An instantiated WASM module, including memory, function table, etc.
249 struct WasmModuleInstance { 251 struct WasmModuleInstance {
250 const WasmModule* module; // static representation of the module. 252 const WasmModule* module; // static representation of the module.
251 // -- Heap allocated -------------------------------------------------------- 253 // -- Heap allocated --------------------------------------------------------
252 Handle<JSObject> js_object; // JavaScript module object. 254 Handle<JSObject> js_object; // JavaScript module object.
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
340 342
341 std::ostream& operator<<(std::ostream& os, const WasmModule& module); 343 std::ostream& operator<<(std::ostream& os, const WasmModule& module);
342 std::ostream& operator<<(std::ostream& os, const WasmFunction& function); 344 std::ostream& operator<<(std::ostream& os, const WasmFunction& function);
343 std::ostream& operator<<(std::ostream& os, const WasmFunctionName& name); 345 std::ostream& operator<<(std::ostream& os, const WasmFunctionName& name);
344 346
345 typedef Result<const WasmModule*> ModuleResult; 347 typedef Result<const WasmModule*> ModuleResult;
346 typedef Result<WasmFunction*> FunctionResult; 348 typedef Result<WasmFunction*> FunctionResult;
347 typedef std::vector<std::pair<int, int>> FunctionOffsets; 349 typedef std::vector<std::pair<int, int>> FunctionOffsets;
348 typedef Result<FunctionOffsets> FunctionOffsetsResult; 350 typedef Result<FunctionOffsets> FunctionOffsetsResult;
349 351
352 class WasmCompiledModule : public FixedArray {
353 public:
354 static WasmCompiledModule* cast(Object* fixed_array) {
355 return reinterpret_cast<WasmCompiledModule*>(fixed_array);
356 }
357 static Handle<WasmCompiledModule> New(Isolate* isolate) {
358 Handle<FixedArray> ret =
359 isolate->factory()->NewFixedArray(kTotalFieldCount, TENURED);
360 ret->set(8, *isolate->factory()->NewHeapNumber(0.0, MUTABLE, TENURED));
361 ret->set(11, *isolate->factory()->NewHeapNumber(0.0, MUTABLE, TENURED));
362 ret->set(12, *isolate->factory()->NewHeapNumber(0.0, MUTABLE, TENURED));
363 return handle(WasmCompiledModule::cast(*ret));
364 }
365
366 #define WCM_PROPERTY(ID, TYPE, NAME) \
367 Handle<TYPE> NAME() { return handle(ptr_to_##NAME()); } \
368 MaybeHandle<TYPE> maybe_##NAME() { \
369 if (has_##NAME()) return NAME(); \
370 return MaybeHandle<TYPE>(); \
371 } \
372 TYPE* ptr_to_##NAME() { \
373 Object* obj = get(ID); \
374 if (!obj->Is##TYPE()) return nullptr; \
375 return TYPE::cast(obj); \
376 } \
377 void set_##NAME(Handle<TYPE> value) { set_ptr_to_##NAME(*value); } \
378 void set_ptr_to_##NAME(TYPE* value) { set(ID, value); } \
379 bool has_##NAME() { return get(ID)->Is##TYPE(); } \
380 void reset_##NAME(Isolate* isolate) { \
381 set(ID, *isolate->factory()->undefined_value()); \
382 }
383
384 #define WCM_SMALL_NUMERIC_PROPERTY(ID, TYPE, NAME) \
385 TYPE NAME() { return static_cast<TYPE>(Smi::cast(get(ID))->value()); } \
386 void set_##NAME(TYPE value) { \
387 set(ID, Smi::FromInt(static_cast<int>(value))); \
388 }
389
390 #define WCM_LARGE_NUMERIC_PROPERTY(ID, TYPE, NAME) \
391 TYPE NAME() { \
392 return static_cast<TYPE>(HeapNumber::cast(get(ID))->value()); \
393 } \
394 void set_##NAME(TYPE value) { \
395 HeapNumber::cast(get(ID))->set_value(static_cast<double>(value)); \
396 }
397
398 #define WCM_WEAK_LINK(ID, TYPE, NAME) \
399 WCM_PROPERTY(ID, WeakCell, weak_##NAME); \
400 Handle<TYPE> NAME() { return handle(TYPE::cast(weak_##NAME()->value())); }
401
402 WCM_PROPERTY(0, FixedArray, functions);
bradnelson 2016/09/13 23:54:49 Use x-macros as discussed.
Mircea Trofin 2016/09/14 16:06:28 Done.
403 WCM_PROPERTY(1, FixedArray, import_data);
404 WCM_PROPERTY(2, FixedArray, import_map);
405 WCM_PROPERTY(3, FixedArray, exports);
406 WCM_PROPERTY(4, FixedArray, startup_function);
407 WCM_PROPERTY(5, FixedArray, indirect_function_tables);
408 WCM_PROPERTY(6, String, module_bytes);
409 WCM_PROPERTY(7, ByteArray, function_names);
410 WCM_LARGE_NUMERIC_PROPERTY(8, uint32_t, min_required_memory);
411 WCM_PROPERTY(9, FixedArray, data_segments_info);
412 WCM_PROPERTY(10, ByteArray, data_segments);
413 WCM_LARGE_NUMERIC_PROPERTY(11, uint32_t, globals_size);
414 WCM_LARGE_NUMERIC_PROPERTY(12, uint32_t, mem_size);
415 WCM_PROPERTY(13, JSArrayBuffer, mem_start);
416 WCM_SMALL_NUMERIC_PROPERTY(14, bool, export_memory);
417 WCM_SMALL_NUMERIC_PROPERTY(15, ModuleOrigin, origin);
418 WCM_WEAK_LINK(16, WasmCompiledModule, next_instance);
419 WCM_WEAK_LINK(17, WasmCompiledModule, prev_instance);
420 WCM_WEAK_LINK(18, JSObject, owning_instance);
421 WCM_WEAK_LINK(19, JSObject, module_object);
422
423 private:
424 static const int kTotalFieldCount = 20;
425 DISALLOW_IMPLICIT_CONSTRUCTORS(WasmCompiledModule);
426 };
427
350 // Extract a function name from the given wasm object. 428 // Extract a function name from the given wasm object.
351 // Returns "<WASM UNNAMED>" if the function is unnamed or the name is not a 429 // Returns "<WASM UNNAMED>" if the function is unnamed or the name is not a
352 // valid UTF-8 string. 430 // valid UTF-8 string.
353 Handle<String> GetWasmFunctionName(Isolate* isolate, Handle<Object> wasm, 431 Handle<String> GetWasmFunctionName(Isolate* isolate, Handle<Object> wasm,
354 uint32_t func_index); 432 uint32_t func_index);
355 433
356 // Extract a function name from the given wasm object. 434 // Extract a function name from the given wasm object.
357 // Returns a null handle if the function is unnamed or the name is not a valid 435 // Returns a null handle if the function is unnamed or the name is not a valid
358 // UTF-8 string. 436 // UTF-8 string.
359 Handle<Object> GetWasmFunctionNameOrNull(Isolate* isolate, Handle<Object> wasm, 437 Handle<Object> GetWasmFunctionNameOrNull(Isolate* isolate, Handle<Object> wasm,
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
425 int instance_count); 503 int instance_count);
426 void ValidateModuleState(Isolate* isolate, Handle<JSObject> module_obj); 504 void ValidateModuleState(Isolate* isolate, Handle<JSObject> module_obj);
427 void ValidateOrphanedInstance(Isolate* isolate, Handle<JSObject> instance); 505 void ValidateOrphanedInstance(Isolate* isolate, Handle<JSObject> instance);
428 506
429 } // namespace testing 507 } // namespace testing
430 } // namespace wasm 508 } // namespace wasm
431 } // namespace internal 509 } // namespace internal
432 } // namespace v8 510 } // namespace v8
433 511
434 #endif // V8_WASM_MODULE_H_ 512 #endif // V8_WASM_MODULE_H_
OLDNEW
« no previous file with comments | « no previous file | src/wasm/wasm-module.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698