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

Unified Diff: src/wasm/wasm-module.cc

Issue 2284683005: [wasm] Use weak reference for wasm deopt data. (Closed)
Patch Set: Created 4 years, 4 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 | « src/wasm/wasm-module.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/wasm/wasm-module.cc
diff --git a/src/wasm/wasm-module.cc b/src/wasm/wasm-module.cc
index 13773f21bedc2f4a4d0acef219e307012ba2d1f9..60136c05fef3d889d19e408ebd69f008fa0d6810 100644
--- a/src/wasm/wasm-module.cc
+++ b/src/wasm/wasm-module.cc
@@ -144,6 +144,18 @@ Handle<JSFunction> WrapExportCodeAsJSFunction(
return function;
}
+Object* GetOwningWasmInstance(Object* undefined, Code* code) {
bradnelson 2016/08/29 19:09:48 Why pass undefined in instead of the isolate?
Mircea Trofin 2016/08/29 19:12:22 Because undefined is the only needed value, rather
+ DCHECK(code->kind() == Code::WASM_FUNCTION);
+ DisallowHeapAllocation no_gc;
+ FixedArray* deopt_data = code->deoptimization_data();
+ DCHECK_NOT_NULL(deopt_data);
+ DCHECK(deopt_data->length() == 2);
+ Object* weak_link = deopt_data->get(0);
+ if (weak_link == undefined) return undefined;
+ WeakCell* cell = WeakCell::cast(weak_link);
+ return cell->value();
+}
+
namespace {
// Internal constants for the layout of the module object.
const int kWasmModuleFunctionTable = 0;
@@ -434,6 +446,24 @@ void FlushAssemblyCache(Isolate* isolate, Handle<FixedArray> functions) {
}
}
+void SetRuntimeSupport(Isolate* isolate, Handle<JSObject> js_object) {
+ Handle<FixedArray> functions = Handle<FixedArray>(
+ FixedArray::cast(js_object->GetInternalField(kWasmModuleCodeTable)));
+ Handle<WeakCell> weak_link = isolate->factory()->NewWeakCell(js_object);
+
+ for (int i = FLAG_skip_compiling_wasm_funcs; i < functions->length(); ++i) {
+ Handle<Code> code = functions->GetValueChecked<Code>(isolate, i);
+ DCHECK(code->deoptimization_data() == nullptr ||
+ code->deoptimization_data()->length() == 0);
+ Handle<FixedArray> deopt_data =
+ isolate->factory()->NewFixedArray(2, TENURED);
+ deopt_data->set(0, *weak_link);
+ deopt_data->set(1, Smi::FromInt(static_cast<int>(i)));
+ deopt_data->set_length(2);
+ code->set_deoptimization_data(*deopt_data);
+ }
+}
+
} // namespace
WasmModule::WasmModule(byte* module_start)
@@ -873,21 +903,6 @@ void SetDebugSupport(Factory* factory, Handle<FixedArray> compiled_module,
js_object->SetInternalField(kWasmModuleBytesString,
*module_bytes_string.ToHandleChecked());
}
- Handle<FixedArray> functions = Handle<FixedArray>(
- FixedArray::cast(js_object->GetInternalField(kWasmModuleCodeTable)));
-
- for (int i = FLAG_skip_compiling_wasm_funcs; i < functions->length(); ++i) {
- Handle<Code> code = functions->GetValueChecked<Code>(isolate, i);
- DCHECK(code->deoptimization_data() == nullptr ||
- code->deoptimization_data()->length() == 0);
- Handle<FixedArray> deopt_data = factory->NewFixedArray(2, TENURED);
- if (!js_object.is_null()) {
- deopt_data->set(0, *js_object);
- }
- deopt_data->set(1, Smi::FromInt(static_cast<int>(i)));
- deopt_data->set_length(2);
- code->set_deoptimization_data(*deopt_data);
- }
MaybeHandle<ByteArray> function_name_table =
compiled_module->GetValue<ByteArray>(isolate, kFunctionNameTable);
@@ -1397,6 +1412,7 @@ MaybeHandle<JSObject> WasmModule::Instantiate(
}
SetDebugSupport(factory, compiled_module, js_object);
+ SetRuntimeSupport(isolate, js_object);
FlushAssemblyCache(isolate, code_table);
« no previous file with comments | « src/wasm/wasm-module.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698