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

Unified 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | src/wasm/wasm-module.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/wasm/wasm-module.h
diff --git a/src/wasm/wasm-module.h b/src/wasm/wasm-module.h
index 0b9bc9762edec2834637c738356d4c160f5f6e71..0ee385e219a5b8f74ef3a6046dc0695de24cab12 100644
--- a/src/wasm/wasm-module.h
+++ b/src/wasm/wasm-module.h
@@ -160,6 +160,8 @@ struct WasmIndirectFunctionTable {
enum ModuleOrigin { kWasmOrigin, kAsmJsOrigin };
+class WasmCompiledModule;
+
// Static representation of a module.
struct WasmModule {
static const uint32_t kPageSize = 0x10000; // Page size, 64kb.
@@ -238,8 +240,8 @@ struct WasmModule {
Handle<JSReceiver> ffi,
Handle<JSArrayBuffer> memory);
- MaybeHandle<FixedArray> CompileFunctions(Isolate* isolate,
- ErrorThrower* thrower) const;
+ MaybeHandle<WasmCompiledModule> CompileFunctions(Isolate* isolate,
+ ErrorThrower* thrower) const;
private:
DISALLOW_COPY_AND_ASSIGN(WasmModule);
@@ -347,6 +349,82 @@ typedef Result<WasmFunction*> FunctionResult;
typedef std::vector<std::pair<int, int>> FunctionOffsets;
typedef Result<FunctionOffsets> FunctionOffsetsResult;
+class WasmCompiledModule : public FixedArray {
+ public:
+ static WasmCompiledModule* cast(Object* fixed_array) {
+ return reinterpret_cast<WasmCompiledModule*>(fixed_array);
+ }
+ static Handle<WasmCompiledModule> New(Isolate* isolate) {
+ Handle<FixedArray> ret =
+ isolate->factory()->NewFixedArray(kTotalFieldCount, TENURED);
+ ret->set(8, *isolate->factory()->NewHeapNumber(0.0, MUTABLE, TENURED));
+ ret->set(11, *isolate->factory()->NewHeapNumber(0.0, MUTABLE, TENURED));
+ ret->set(12, *isolate->factory()->NewHeapNumber(0.0, MUTABLE, TENURED));
+ return handle(WasmCompiledModule::cast(*ret));
+ }
+
+#define WCM_PROPERTY(ID, TYPE, NAME) \
+ Handle<TYPE> NAME() { return handle(ptr_to_##NAME()); } \
+ MaybeHandle<TYPE> maybe_##NAME() { \
+ if (has_##NAME()) return NAME(); \
+ return MaybeHandle<TYPE>(); \
+ } \
+ TYPE* ptr_to_##NAME() { \
+ Object* obj = get(ID); \
+ if (!obj->Is##TYPE()) return nullptr; \
+ return TYPE::cast(obj); \
+ } \
+ void set_##NAME(Handle<TYPE> value) { set_ptr_to_##NAME(*value); } \
+ void set_ptr_to_##NAME(TYPE* value) { set(ID, value); } \
+ bool has_##NAME() { return get(ID)->Is##TYPE(); } \
+ void reset_##NAME(Isolate* isolate) { \
+ set(ID, *isolate->factory()->undefined_value()); \
+ }
+
+#define WCM_SMALL_NUMERIC_PROPERTY(ID, TYPE, NAME) \
+ TYPE NAME() { return static_cast<TYPE>(Smi::cast(get(ID))->value()); } \
+ void set_##NAME(TYPE value) { \
+ set(ID, Smi::FromInt(static_cast<int>(value))); \
+ }
+
+#define WCM_LARGE_NUMERIC_PROPERTY(ID, TYPE, NAME) \
+ TYPE NAME() { \
+ return static_cast<TYPE>(HeapNumber::cast(get(ID))->value()); \
+ } \
+ void set_##NAME(TYPE value) { \
+ HeapNumber::cast(get(ID))->set_value(static_cast<double>(value)); \
+ }
+
+#define WCM_WEAK_LINK(ID, TYPE, NAME) \
+ WCM_PROPERTY(ID, WeakCell, weak_##NAME); \
+ Handle<TYPE> NAME() { return handle(TYPE::cast(weak_##NAME()->value())); }
+
+ 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.
+ WCM_PROPERTY(1, FixedArray, import_data);
+ WCM_PROPERTY(2, FixedArray, import_map);
+ WCM_PROPERTY(3, FixedArray, exports);
+ WCM_PROPERTY(4, FixedArray, startup_function);
+ WCM_PROPERTY(5, FixedArray, indirect_function_tables);
+ WCM_PROPERTY(6, String, module_bytes);
+ WCM_PROPERTY(7, ByteArray, function_names);
+ WCM_LARGE_NUMERIC_PROPERTY(8, uint32_t, min_required_memory);
+ WCM_PROPERTY(9, FixedArray, data_segments_info);
+ WCM_PROPERTY(10, ByteArray, data_segments);
+ WCM_LARGE_NUMERIC_PROPERTY(11, uint32_t, globals_size);
+ WCM_LARGE_NUMERIC_PROPERTY(12, uint32_t, mem_size);
+ WCM_PROPERTY(13, JSArrayBuffer, mem_start);
+ WCM_SMALL_NUMERIC_PROPERTY(14, bool, export_memory);
+ WCM_SMALL_NUMERIC_PROPERTY(15, ModuleOrigin, origin);
+ WCM_WEAK_LINK(16, WasmCompiledModule, next_instance);
+ WCM_WEAK_LINK(17, WasmCompiledModule, prev_instance);
+ WCM_WEAK_LINK(18, JSObject, owning_instance);
+ WCM_WEAK_LINK(19, JSObject, module_object);
+
+ private:
+ static const int kTotalFieldCount = 20;
+ DISALLOW_IMPLICIT_CONSTRUCTORS(WasmCompiledModule);
+};
+
// Extract a function name from the given wasm object.
// Returns "<WASM UNNAMED>" if the function is unnamed or the name is not a
// valid UTF-8 string.
« 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