OLD | NEW |
---|---|
1 // Copyright 2016 the V8 project authors. All rights reserved. | 1 // Copyright 2016 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/runtime/runtime-utils.h" | 5 #include "src/runtime/runtime-utils.h" |
6 | 6 |
7 #include "src/arguments.h" | 7 #include "src/arguments.h" |
8 #include "src/assembler.h" | 8 #include "src/assembler.h" |
9 #include "src/compiler/wasm-compiler.h" | 9 #include "src/compiler/wasm-compiler.h" |
10 #include "src/conversions.h" | 10 #include "src/conversions.h" |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
79 // If the old memory was zero-sized, we should have been in the | 79 // If the old memory was zero-sized, we should have been in the |
80 // "undefined" case above. | 80 // "undefined" case above. |
81 DCHECK_NOT_NULL(old_mem_start); | 81 DCHECK_NOT_NULL(old_mem_start); |
82 DCHECK_NE(0, old_size); | 82 DCHECK_NE(0, old_size); |
83 | 83 |
84 new_size = old_size + delta_pages * wasm::WasmModule::kPageSize; | 84 new_size = old_size + delta_pages * wasm::WasmModule::kPageSize; |
85 if (new_size > | 85 if (new_size > |
86 wasm::WasmModule::kMaxMemPages * wasm::WasmModule::kPageSize) { | 86 wasm::WasmModule::kMaxMemPages * wasm::WasmModule::kPageSize) { |
87 return *isolate->factory()->NewNumberFromInt(-1); | 87 return *isolate->factory()->NewNumberFromInt(-1); |
88 } | 88 } |
89 new_mem_start = static_cast<Address>(realloc(old_mem_start, new_size)); | 89 new_mem_start = |
90 static_cast<Address>(isolate->array_buffer_allocator()->Allocate( | |
91 static_cast<uint32_t>(new_size))); | |
90 if (new_mem_start == NULL) { | 92 if (new_mem_start == NULL) { |
91 return *isolate->factory()->NewNumberFromInt(-1); | 93 return *isolate->factory()->NewNumberFromInt(-1); |
92 } | 94 } |
95 #if DEBUG | |
96 // Double check the API allocator actually zero-initialized the memory. | |
97 for (size_t i = old_size; i < new_size; i++) { | |
98 DCHECK_EQ(0, new_mem_start[i]); | |
99 } | |
100 #endif | |
101 // Copy contents of the old buffer to the new buffer before detaching old | |
102 // buffer | |
103 memcpy(new_mem_start, old_mem_start, old_size); | |
93 old_buffer->set_is_external(true); | 104 old_buffer->set_is_external(true); |
94 isolate->heap()->UnregisterArrayBuffer(*old_buffer); | 105 isolate->heap()->UnregisterArrayBuffer(*old_buffer); |
gdeepti
2016/09/08 06:04:47
Is this the right way to deal with the old buffer?
Michael Lippautz
2016/09/08 09:43:31
UnregisterArrayBuffer will make the GC stop tracki
ahaas
2016/09/08 12:23:33
Hi Deepti, I talked with Ben about it, and we thin
gdeepti
2016/09/08 22:44:50
Thanks for explaining that, I've removed the code
| |
95 // Zero initializing uninitialized memory from realloc | |
96 memset(new_mem_start + old_size, 0, new_size - old_size); | |
97 } | 106 } |
98 | 107 |
99 Handle<JSArrayBuffer> buffer = isolate->factory()->NewJSArrayBuffer(); | 108 Handle<JSArrayBuffer> buffer = isolate->factory()->NewJSArrayBuffer(); |
100 JSArrayBuffer::Setup(buffer, isolate, false, new_mem_start, new_size); | 109 JSArrayBuffer::Setup(buffer, isolate, false, new_mem_start, new_size); |
101 buffer->set_is_neuterable(false); | 110 buffer->set_is_neuterable(false); |
102 | 111 |
103 // Set new buffer to be wasm memory | 112 // Set new buffer to be wasm memory |
104 module_object->SetInternalField(kWasmMemArrayBuffer, *buffer); | 113 module_object->SetInternalField(kWasmMemArrayBuffer, *buffer); |
105 | |
106 CHECK(wasm::UpdateWasmModuleMemory(module_object, old_mem_start, | 114 CHECK(wasm::UpdateWasmModuleMemory(module_object, old_mem_start, |
107 new_mem_start, old_size, new_size)); | 115 new_mem_start, old_size, new_size)); |
108 | 116 |
109 return *isolate->factory()->NewNumberFromInt(old_size / | 117 return *isolate->factory()->NewNumberFromInt(old_size / |
110 wasm::WasmModule::kPageSize); | 118 wasm::WasmModule::kPageSize); |
111 } | 119 } |
112 | 120 |
113 RUNTIME_FUNCTION(Runtime_WasmThrowTypeError) { | 121 RUNTIME_FUNCTION(Runtime_WasmThrowTypeError) { |
114 HandleScope scope(isolate); | 122 HandleScope scope(isolate); |
115 DCHECK_EQ(0, args.length()); | 123 DCHECK_EQ(0, args.length()); |
116 THROW_NEW_ERROR_RETURN_FAILURE( | 124 THROW_NEW_ERROR_RETURN_FAILURE( |
117 isolate, NewTypeError(MessageTemplate::kWasmTrapTypeError)); | 125 isolate, NewTypeError(MessageTemplate::kWasmTrapTypeError)); |
118 } | 126 } |
119 } // namespace internal | 127 } // namespace internal |
120 } // namespace v8 | 128 } // namespace v8 |
OLD | NEW |