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 <memory> | 5 #include <memory> |
6 | 6 |
7 #include "src/base/atomic-utils.h" | 7 #include "src/base/atomic-utils.h" |
8 #include "src/code-stubs.h" | 8 #include "src/code-stubs.h" |
9 | 9 |
10 #include "src/macro-assembler.h" | 10 #include "src/macro-assembler.h" |
(...skipping 1193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1204 Handle<JSObject> owner; | 1204 Handle<JSObject> owner; |
1205 // If we don't clone, this will be null(). Otherwise, this will | 1205 // If we don't clone, this will be null(). Otherwise, this will |
1206 // be a weak link to the original. If we lose the original to GC, | 1206 // be a weak link to the original. If we lose the original to GC, |
1207 // this will be a cleared. We'll link the instances chain last. | 1207 // this will be a cleared. We'll link the instances chain last. |
1208 MaybeHandle<WeakCell> link_to_original; | 1208 MaybeHandle<WeakCell> link_to_original; |
1209 | 1209 |
1210 TRACE("Starting new module instantiation\n"); | 1210 TRACE("Starting new module instantiation\n"); |
1211 { | 1211 { |
1212 Handle<WasmCompiledModule> original( | 1212 Handle<WasmCompiledModule> original( |
1213 WasmCompiledModule::cast(module_object->GetInternalField(0)), isolate); | 1213 WasmCompiledModule::cast(module_object->GetInternalField(0)), isolate); |
1214 // Always make a new copy of the code_table, since the old_code_table | |
1215 // may still have placeholders for imports. | |
1216 old_code_table = original->code_table(); | |
1217 code_table = factory->CopyFixedArray(old_code_table); | |
1218 | |
1219 if (original->has_weak_owning_instance()) { | 1214 if (original->has_weak_owning_instance()) { |
1220 WeakCell* tmp = original->ptr_to_weak_owning_instance(); | 1215 WeakCell* tmp = original->ptr_to_weak_owning_instance(); |
titzer
2016/10/07 12:40:32
Why do we have a raw pointer here?
Mircea Trofin
2016/10/07 14:44:23
Not sure, I think this is from 0xC; it's immateria
| |
1221 DCHECK(!tmp->cleared()); | 1216 DCHECK(!tmp->cleared()); |
1222 // There is already an owner, clone everything. | 1217 // There is already an owner, clone everything. |
1223 owner = Handle<JSObject>(JSObject::cast(tmp->value()), isolate); | 1218 owner = Handle<JSObject>(JSObject::cast(tmp->value()), isolate); |
1219 | |
1220 old_code_table = original->code_table(); | |
1221 code_table = factory->CopyFixedArray(old_code_table); | |
titzer
2016/10/07 12:40:32
I don't understand how this fixes anything. As far
Mircea Trofin
2016/10/07 14:44:23
Consider the old code. Suppose the allocation on l
titzer
2016/10/07 15:37:42
Ok, until then can we have a switch to turn off th
| |
1222 | |
1224 // Insert the latest clone in front. | 1223 // Insert the latest clone in front. |
1225 TRACE("Cloning from %d\n", original->instance_id()); | 1224 TRACE("Cloning from %d\n", original->instance_id()); |
1226 compiled_module = WasmCompiledModule::Clone(isolate, original); | 1225 compiled_module = WasmCompiledModule::Clone(isolate, original); |
1227 // Replace the strong reference to point to the new instance here. | 1226 // Replace the strong reference to point to the new instance here. |
1228 // This allows any of the other instances, including the original, | 1227 // This allows any of the other instances, including the original, |
1229 // to be collected. | 1228 // to be collected. |
1230 module_object->SetInternalField(0, *compiled_module); | 1229 module_object->SetInternalField(0, *compiled_module); |
1231 compiled_module->set_weak_module_object(original->weak_module_object()); | 1230 compiled_module->set_weak_module_object(original->weak_module_object()); |
1232 link_to_original = factory->NewWeakCell(original); | 1231 link_to_original = factory->NewWeakCell(original); |
1233 // Don't link to original here. We remember the original | 1232 // Don't link to original here. We remember the original |
(...skipping 13 matching lines...) Expand all Loading... | |
1247 Handle<Code> code = factory->CopyCode(orig_code); | 1246 Handle<Code> code = factory->CopyCode(orig_code); |
1248 code_table->set(i, *code); | 1247 code_table->set(i, *code); |
1249 break; | 1248 break; |
1250 } | 1249 } |
1251 default: | 1250 default: |
1252 UNREACHABLE(); | 1251 UNREACHABLE(); |
1253 } | 1252 } |
1254 } | 1253 } |
1255 RecordStats(isolate, code_table); | 1254 RecordStats(isolate, code_table); |
1256 } else { | 1255 } else { |
1256 // Always make a new copy of the code_table, since the old_code_table | |
1257 // may still have placeholders for imports. | |
1258 old_code_table = original->code_table(); | |
1259 code_table = factory->CopyFixedArray(old_code_table); | |
1260 | |
1257 // There was no owner, so we can reuse the original. | 1261 // There was no owner, so we can reuse the original. |
1258 compiled_module = original; | 1262 compiled_module = original; |
1259 TRACE("Reusing existing instance %d\n", compiled_module->instance_id()); | 1263 TRACE("Reusing existing instance %d\n", compiled_module->instance_id()); |
1260 } | 1264 } |
1261 compiled_module->set_code_table(code_table); | 1265 compiled_module->set_code_table(code_table); |
1262 } | 1266 } |
1263 | 1267 |
1264 //-------------------------------------------------------------------------- | 1268 //-------------------------------------------------------------------------- |
1265 // Allocate the instance object. | 1269 // Allocate the instance object. |
1266 //-------------------------------------------------------------------------- | 1270 //-------------------------------------------------------------------------- |
(...skipping 646 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1913 WasmCompiledModule* compiled_module = | 1917 WasmCompiledModule* compiled_module = |
1914 WasmCompiledModule::cast(instance->GetInternalField(kWasmCompiledModule)); | 1918 WasmCompiledModule::cast(instance->GetInternalField(kWasmCompiledModule)); |
1915 CHECK(compiled_module->has_weak_module_object()); | 1919 CHECK(compiled_module->has_weak_module_object()); |
1916 CHECK(compiled_module->ptr_to_weak_module_object()->cleared()); | 1920 CHECK(compiled_module->ptr_to_weak_module_object()->cleared()); |
1917 } | 1921 } |
1918 | 1922 |
1919 } // namespace testing | 1923 } // namespace testing |
1920 } // namespace wasm | 1924 } // namespace wasm |
1921 } // namespace internal | 1925 } // namespace internal |
1922 } // namespace v8 | 1926 } // namespace v8 |
OLD | NEW |