| 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 "src/macro-assembler.h" | 5 #include "src/macro-assembler.h" |
| 6 #include "src/objects.h" | 6 #include "src/objects.h" |
| 7 #include "src/v8.h" | 7 #include "src/v8.h" |
| 8 | 8 |
| 9 #include "src/simulator.h" | 9 #include "src/simulator.h" |
| 10 | 10 |
| 11 #include "src/wasm/ast-decoder.h" | 11 #include "src/wasm/ast-decoder.h" |
| 12 #include "src/wasm/module-decoder.h" | 12 #include "src/wasm/module-decoder.h" |
| 13 #include "src/wasm/wasm-module.h" | 13 #include "src/wasm/wasm-module.h" |
| 14 #include "src/wasm/wasm-result.h" | 14 #include "src/wasm/wasm-result.h" |
| 15 | 15 |
| 16 #include "src/compiler/wasm-compiler.h" | 16 #include "src/compiler/wasm-compiler.h" |
| 17 | 17 |
| 18 namespace v8 { | 18 namespace v8 { |
| 19 namespace internal { | 19 namespace internal { |
| 20 namespace wasm { | 20 namespace wasm { |
| 21 | 21 |
| 22 std::ostream& operator<<(std::ostream& os, const WasmModule& module) { | 22 std::ostream& operator<<(std::ostream& os, const WasmModule& module) { |
| 23 os << "WASM module with "; | 23 os << "WASM module with "; |
| 24 os << (1 << module.min_mem_size_log2) << " min mem"; | 24 os << (module.min_mem_pages * module.kPageSize) << " min mem"; |
| 25 os << (1 << module.max_mem_size_log2) << " max mem"; | 25 os << (module.max_mem_pages * module.kPageSize) << " max mem"; |
| 26 os << module.functions.size() << " functions"; | 26 os << module.functions.size() << " functions"; |
| 27 os << module.functions.size() << " globals"; | 27 os << module.functions.size() << " globals"; |
| 28 os << module.functions.size() << " data segments"; | 28 os << module.functions.size() << " data segments"; |
| 29 return os; | 29 return os; |
| 30 } | 30 } |
| 31 | 31 |
| 32 | 32 |
| 33 std::ostream& operator<<(std::ostream& os, const WasmFunction& function) { | 33 std::ostream& operator<<(std::ostream& os, const WasmFunction& function) { |
| 34 os << "WASM function with signature " << *function.sig; | 34 os << "WASM function with signature " << *function.sig; |
| 35 | 35 |
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 160 global.offset = offset; | 160 global.offset = offset; |
| 161 offset += size; | 161 offset += size; |
| 162 } | 162 } |
| 163 return offset; | 163 return offset; |
| 164 } | 164 } |
| 165 | 165 |
| 166 | 166 |
| 167 void LoadDataSegments(WasmModule* module, byte* mem_addr, size_t mem_size) { | 167 void LoadDataSegments(WasmModule* module, byte* mem_addr, size_t mem_size) { |
| 168 for (const WasmDataSegment& segment : module->data_segments) { | 168 for (const WasmDataSegment& segment : module->data_segments) { |
| 169 if (!segment.init) continue; | 169 if (!segment.init) continue; |
| 170 if (!segment.source_size) continue; |
| 170 CHECK_LT(segment.dest_addr, mem_size); | 171 CHECK_LT(segment.dest_addr, mem_size); |
| 171 CHECK_LE(segment.source_size, mem_size); | 172 CHECK_LE(segment.source_size, mem_size); |
| 172 CHECK_LE(segment.dest_addr + segment.source_size, mem_size); | 173 CHECK_LE(segment.dest_addr + segment.source_size, mem_size); |
| 173 byte* addr = mem_addr + segment.dest_addr; | 174 byte* addr = mem_addr + segment.dest_addr; |
| 174 memcpy(addr, module->module_start + segment.source_offset, | 175 memcpy(addr, module->module_start + segment.source_offset, |
| 175 segment.source_size); | 176 segment.source_size); |
| 176 } | 177 } |
| 177 } | 178 } |
| 178 | 179 |
| 179 | 180 |
| 180 Handle<FixedArray> BuildFunctionTable(Isolate* isolate, WasmModule* module) { | 181 Handle<FixedArray> BuildFunctionTable(Isolate* isolate, WasmModule* module) { |
| 181 if (module->function_table.size() == 0) { | 182 if (module->function_table.size() == 0) { |
| 182 return Handle<FixedArray>::null(); | 183 return Handle<FixedArray>::null(); |
| 183 } | 184 } |
| 184 int table_size = static_cast<int>(module->function_table.size()); | 185 int table_size = static_cast<int>(module->function_table.size()); |
| 185 Handle<FixedArray> fixed = isolate->factory()->NewFixedArray(2 * table_size); | 186 Handle<FixedArray> fixed = isolate->factory()->NewFixedArray(2 * table_size); |
| 186 for (int i = 0; i < table_size; i++) { | 187 for (int i = 0; i < table_size; i++) { |
| 187 WasmFunction* function = &module->functions[module->function_table[i]]; | 188 WasmFunction* function = &module->functions[module->function_table[i]]; |
| 188 fixed->set(i, Smi::FromInt(function->sig_index)); | 189 fixed->set(i, Smi::FromInt(function->sig_index)); |
| 189 } | 190 } |
| 190 return fixed; | 191 return fixed; |
| 191 } | 192 } |
| 192 | 193 |
| 193 Handle<JSArrayBuffer> NewArrayBuffer(Isolate* isolate, size_t size, | 194 Handle<JSArrayBuffer> NewArrayBuffer(Isolate* isolate, size_t size, |
| 194 byte** backing_store) { | 195 byte** backing_store) { |
| 195 if (size > (1 << WasmModule::kMaxMemSize)) { | 196 if (size > (WasmModule::kMaxMemPages * WasmModule::kPageSize)) { |
| 196 // TODO(titzer): lift restriction on maximum memory allocated here. | 197 // TODO(titzer): lift restriction on maximum memory allocated here. |
| 197 *backing_store = nullptr; | 198 *backing_store = nullptr; |
| 198 return Handle<JSArrayBuffer>::null(); | 199 return Handle<JSArrayBuffer>::null(); |
| 199 } | 200 } |
| 200 void* memory = | 201 void* memory = |
| 201 isolate->array_buffer_allocator()->Allocate(static_cast<int>(size)); | 202 isolate->array_buffer_allocator()->Allocate(static_cast<int>(size)); |
| 202 if (!memory) { | 203 if (!memory) { |
| 203 *backing_store = nullptr; | 204 *backing_store = nullptr; |
| 204 return Handle<JSArrayBuffer>::null(); | 205 return Handle<JSArrayBuffer>::null(); |
| 205 } | 206 } |
| (...skipping 21 matching lines...) Expand all Loading... |
| 227 instance->mem_size = memory->byte_length()->Number(); | 228 instance->mem_size = memory->byte_length()->Number(); |
| 228 instance->mem_buffer = memory; | 229 instance->mem_buffer = memory; |
| 229 } | 230 } |
| 230 | 231 |
| 231 // Allocate memory for a module instance as a new JSArrayBuffer. | 232 // Allocate memory for a module instance as a new JSArrayBuffer. |
| 232 bool AllocateMemory(ErrorThrower* thrower, Isolate* isolate, | 233 bool AllocateMemory(ErrorThrower* thrower, Isolate* isolate, |
| 233 WasmModuleInstance* instance) { | 234 WasmModuleInstance* instance) { |
| 234 DCHECK(instance->module); | 235 DCHECK(instance->module); |
| 235 DCHECK(instance->mem_buffer.is_null()); | 236 DCHECK(instance->mem_buffer.is_null()); |
| 236 | 237 |
| 237 if (instance->module->min_mem_size_log2 > WasmModule::kMaxMemSize) { | 238 if (instance->module->min_mem_pages > WasmModule::kMaxMemPages) { |
| 238 thrower->Error("Out of memory: wasm memory too large"); | 239 thrower->Error("Out of memory: wasm memory too large"); |
| 239 return false; | 240 return false; |
| 240 } | 241 } |
| 241 instance->mem_size = static_cast<size_t>(1) | 242 instance->mem_size = WasmModule::kPageSize * instance->module->min_mem_pages; |
| 242 << instance->module->min_mem_size_log2; | |
| 243 instance->mem_buffer = | 243 instance->mem_buffer = |
| 244 NewArrayBuffer(isolate, instance->mem_size, &instance->mem_start); | 244 NewArrayBuffer(isolate, instance->mem_size, &instance->mem_start); |
| 245 if (!instance->mem_start) { | 245 if (!instance->mem_start) { |
| 246 thrower->Error("Out of memory: wasm memory"); | 246 thrower->Error("Out of memory: wasm memory"); |
| 247 instance->mem_size = 0; | 247 instance->mem_size = 0; |
| 248 return false; | 248 return false; |
| 249 } | 249 } |
| 250 return true; | 250 return true; |
| 251 } | 251 } |
| 252 | 252 |
| (...skipping 11 matching lines...) Expand all Loading... |
| 264 } | 264 } |
| 265 } | 265 } |
| 266 return true; | 266 return true; |
| 267 } | 267 } |
| 268 } // namespace | 268 } // namespace |
| 269 | 269 |
| 270 WasmModule::WasmModule() | 270 WasmModule::WasmModule() |
| 271 : shared_isolate(nullptr), | 271 : shared_isolate(nullptr), |
| 272 module_start(nullptr), | 272 module_start(nullptr), |
| 273 module_end(nullptr), | 273 module_end(nullptr), |
| 274 min_mem_size_log2(0), | 274 min_mem_pages(0), |
| 275 max_mem_size_log2(0), | 275 max_mem_pages(0), |
| 276 mem_export(false), | 276 mem_export(false), |
| 277 mem_external(false), | 277 mem_external(false), |
| 278 start_function_index(-1), | 278 start_function_index(-1), |
| 279 origin(kWasmOrigin) {} | 279 origin(kWasmOrigin) {} |
| 280 | 280 |
| 281 static MaybeHandle<JSFunction> LookupFunction(ErrorThrower& thrower, | 281 static MaybeHandle<JSFunction> LookupFunction(ErrorThrower& thrower, |
| 282 Handle<JSObject> ffi, | 282 Handle<JSObject> ffi, |
| 283 uint32_t index, | 283 uint32_t index, |
| 284 Handle<String> name, | 284 Handle<String> name, |
| 285 const char* cstr) { | 285 const char* cstr) { |
| (...skipping 320 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 606 } | 606 } |
| 607 if (result->IsHeapNumber()) { | 607 if (result->IsHeapNumber()) { |
| 608 return static_cast<int32_t>(HeapNumber::cast(*result)->value()); | 608 return static_cast<int32_t>(HeapNumber::cast(*result)->value()); |
| 609 } | 609 } |
| 610 thrower.Error("WASM.compileRun() failed: Return value should be number"); | 610 thrower.Error("WASM.compileRun() failed: Return value should be number"); |
| 611 return -1; | 611 return -1; |
| 612 } | 612 } |
| 613 } // namespace wasm | 613 } // namespace wasm |
| 614 } // namespace internal | 614 } // namespace internal |
| 615 } // namespace v8 | 615 } // namespace v8 |
| OLD | NEW |