| 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 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 45 | 45 |
| 46 byte* raw_buffer_ptr(MaybeHandle<JSArrayBuffer> buffer, int offset) { | 46 byte* raw_buffer_ptr(MaybeHandle<JSArrayBuffer> buffer, int offset) { |
| 47 return static_cast<byte*>(buffer.ToHandleChecked()->backing_store()) + offset; | 47 return static_cast<byte*>(buffer.ToHandleChecked()->backing_store()) + offset; |
| 48 } | 48 } |
| 49 | 49 |
| 50 MaybeHandle<String> ExtractStringFromModuleBytes( | 50 MaybeHandle<String> ExtractStringFromModuleBytes( |
| 51 Isolate* isolate, Handle<WasmCompiledModule> compiled_module, | 51 Isolate* isolate, Handle<WasmCompiledModule> compiled_module, |
| 52 uint32_t offset, uint32_t size) { | 52 uint32_t offset, uint32_t size) { |
| 53 // TODO(wasm): cache strings from modules if it's a performance win. | 53 // TODO(wasm): cache strings from modules if it's a performance win. |
| 54 Handle<SeqOneByteString> module_bytes = compiled_module->module_bytes(); | 54 Handle<SeqOneByteString> module_bytes = compiled_module->module_bytes(); |
| 55 DCHECK_GE(module_bytes->length(), offset); | 55 DCHECK_GE(static_cast<size_t>(module_bytes->length()), offset); |
| 56 DCHECK_GE(module_bytes->length() - offset, size); | 56 DCHECK_GE(static_cast<size_t>(module_bytes->length() - offset), size); |
| 57 Address raw = module_bytes->GetCharsAddress() + offset; | 57 Address raw = module_bytes->GetCharsAddress() + offset; |
| 58 if (!unibrow::Utf8::Validate(reinterpret_cast<const byte*>(raw), size)) | 58 if (!unibrow::Utf8::Validate(reinterpret_cast<const byte*>(raw), size)) |
| 59 return {}; // UTF8 decoding error for name. | 59 return {}; // UTF8 decoding error for name. |
| 60 return isolate->factory()->NewStringFromUtf8SubString( | 60 return isolate->factory()->NewStringFromUtf8SubString( |
| 61 module_bytes, static_cast<int>(offset), static_cast<int>(size)); | 61 module_bytes, static_cast<int>(offset), static_cast<int>(size)); |
| 62 } | 62 } |
| 63 | 63 |
| 64 void ReplaceReferenceInCode(Handle<Code> code, Handle<Object> old_ref, | 64 void ReplaceReferenceInCode(Handle<Code> code, Handle<Object> old_ref, |
| 65 Handle<Object> new_ref) { | 65 Handle<Object> new_ref) { |
| 66 for (RelocIterator it(*code, 1 << RelocInfo::EMBEDDED_OBJECT); !it.done(); | 66 for (RelocIterator it(*code, 1 << RelocInfo::EMBEDDED_OBJECT); !it.done(); |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 103 // things that would be unsafe if they expected guard pages where there | 103 // things that would be unsafe if they expected guard pages where there |
| 104 // weren't any. | 104 // weren't any. |
| 105 if (enable_guard_regions && kGuardRegionsSupported) { | 105 if (enable_guard_regions && kGuardRegionsSupported) { |
| 106 // TODO(eholk): On Windows we want to make sure we don't commit the guard | 106 // TODO(eholk): On Windows we want to make sure we don't commit the guard |
| 107 // pages yet. | 107 // pages yet. |
| 108 | 108 |
| 109 // We always allocate the largest possible offset into the heap, so the | 109 // We always allocate the largest possible offset into the heap, so the |
| 110 // addressable memory after the guard page can be made inaccessible. | 110 // addressable memory after the guard page can be made inaccessible. |
| 111 const size_t alloc_size = | 111 const size_t alloc_size = |
| 112 RoundUp(kWasmMaxHeapOffset, base::OS::CommitPageSize()); | 112 RoundUp(kWasmMaxHeapOffset, base::OS::CommitPageSize()); |
| 113 DCHECK_EQ(0, size % base::OS::CommitPageSize()); | 113 DCHECK_EQ(0u, size % base::OS::CommitPageSize()); |
| 114 | 114 |
| 115 // AllocateGuarded makes the whole region inaccessible by default. | 115 // AllocateGuarded makes the whole region inaccessible by default. |
| 116 void* memory = base::OS::AllocateGuarded(alloc_size); | 116 void* memory = base::OS::AllocateGuarded(alloc_size); |
| 117 if (memory == nullptr) { | 117 if (memory == nullptr) { |
| 118 return nullptr; | 118 return nullptr; |
| 119 } | 119 } |
| 120 | 120 |
| 121 // Make the part we care about accessible. | 121 // Make the part we care about accessible. |
| 122 base::OS::Unprotect(memory, size); | 122 base::OS::Unprotect(memory, size); |
| 123 | 123 |
| (...skipping 757 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 881 isolate, &module_env, wasm_code, exp.index); | 881 isolate, &module_env, wasm_code, exp.index); |
| 882 int export_index = static_cast<int>(functions.size() + func_index); | 882 int export_index = static_cast<int>(functions.size() + func_index); |
| 883 code_table->set(export_index, *wrapper_code); | 883 code_table->set(export_index, *wrapper_code); |
| 884 func_index++; | 884 func_index++; |
| 885 } | 885 } |
| 886 | 886 |
| 887 { | 887 { |
| 888 // TODO(wasm): only save the sections necessary to deserialize a | 888 // TODO(wasm): only save the sections necessary to deserialize a |
| 889 // {WasmModule}. E.g. function bodies could be omitted. | 889 // {WasmModule}. E.g. function bodies could be omitted. |
| 890 size_t module_bytes_len = module_end - module_start; | 890 size_t module_bytes_len = module_end - module_start; |
| 891 DCHECK_LE(module_bytes_len, kMaxInt); | 891 DCHECK_LE(module_bytes_len, static_cast<size_t>(kMaxInt)); |
| 892 Vector<const uint8_t> module_bytes_vec(module_start, | 892 Vector<const uint8_t> module_bytes_vec(module_start, |
| 893 static_cast<int>(module_bytes_len)); | 893 static_cast<int>(module_bytes_len)); |
| 894 Handle<String> module_bytes_string = | 894 Handle<String> module_bytes_string = |
| 895 factory->NewStringFromOneByte(module_bytes_vec, TENURED) | 895 factory->NewStringFromOneByte(module_bytes_vec, TENURED) |
| 896 .ToHandleChecked(); | 896 .ToHandleChecked(); |
| 897 DCHECK(module_bytes_string->IsSeqOneByteString()); | 897 DCHECK(module_bytes_string->IsSeqOneByteString()); |
| 898 ret->set_module_bytes(Handle<SeqOneByteString>::cast(module_bytes_string)); | 898 ret->set_module_bytes(Handle<SeqOneByteString>::cast(module_bytes_string)); |
| 899 } | 899 } |
| 900 | 900 |
| 901 return ret; | 901 return ret; |
| (...skipping 1105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2007 | 2007 |
| 2008 DCHECK_EQ(origin == kAsmJsOrigin, !asm_js_script.is_null()); | 2008 DCHECK_EQ(origin == kAsmJsOrigin, !asm_js_script.is_null()); |
| 2009 DCHECK(!compiled_module->has_script()); | 2009 DCHECK(!compiled_module->has_script()); |
| 2010 DCHECK(!compiled_module->has_asm_js_offset_tables()); | 2010 DCHECK(!compiled_module->has_asm_js_offset_tables()); |
| 2011 if (origin == kAsmJsOrigin) { | 2011 if (origin == kAsmJsOrigin) { |
| 2012 // Set script for the asm.js source, and the offset table mapping wasm byte | 2012 // Set script for the asm.js source, and the offset table mapping wasm byte |
| 2013 // offsets to source positions. | 2013 // offsets to source positions. |
| 2014 compiled_module->set_script(asm_js_script); | 2014 compiled_module->set_script(asm_js_script); |
| 2015 size_t offset_tables_len = | 2015 size_t offset_tables_len = |
| 2016 asm_js_offset_tables_end - asm_js_offset_tables_start; | 2016 asm_js_offset_tables_end - asm_js_offset_tables_start; |
| 2017 DCHECK_GE(kMaxInt, offset_tables_len); | 2017 DCHECK_GE(static_cast<size_t>(kMaxInt), offset_tables_len); |
| 2018 Handle<ByteArray> offset_tables = | 2018 Handle<ByteArray> offset_tables = |
| 2019 isolate->factory()->NewByteArray(static_cast<int>(offset_tables_len)); | 2019 isolate->factory()->NewByteArray(static_cast<int>(offset_tables_len)); |
| 2020 memcpy(offset_tables->GetDataStartAddress(), asm_js_offset_tables_start, | 2020 memcpy(offset_tables->GetDataStartAddress(), asm_js_offset_tables_start, |
| 2021 offset_tables_len); | 2021 offset_tables_len); |
| 2022 compiled_module->set_asm_js_offset_tables(offset_tables); | 2022 compiled_module->set_asm_js_offset_tables(offset_tables); |
| 2023 } else { | 2023 } else { |
| 2024 // Create a new Script object representing this wasm module, store it in the | 2024 // Create a new Script object representing this wasm module, store it in the |
| 2025 // compiled wasm module, and register it at the debugger. | 2025 // compiled wasm module, and register it at the debugger. |
| 2026 Handle<Script> script = | 2026 Handle<Script> script = |
| 2027 isolate->factory()->NewScript(isolate->factory()->empty_string()); | 2027 isolate->factory()->NewScript(isolate->factory()->empty_string()); |
| (...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2266 MaybeHandle<String> WasmCompiledModule::GetFunctionName( | 2266 MaybeHandle<String> WasmCompiledModule::GetFunctionName( |
| 2267 Handle<WasmCompiledModule> compiled_module, uint32_t func_index) { | 2267 Handle<WasmCompiledModule> compiled_module, uint32_t func_index) { |
| 2268 DCHECK_LT(func_index, compiled_module->module()->functions.size()); | 2268 DCHECK_LT(func_index, compiled_module->module()->functions.size()); |
| 2269 WasmFunction& function = compiled_module->module()->functions[func_index]; | 2269 WasmFunction& function = compiled_module->module()->functions[func_index]; |
| 2270 Isolate* isolate = compiled_module->GetIsolate(); | 2270 Isolate* isolate = compiled_module->GetIsolate(); |
| 2271 MaybeHandle<String> string = ExtractStringFromModuleBytes( | 2271 MaybeHandle<String> string = ExtractStringFromModuleBytes( |
| 2272 isolate, compiled_module, function.name_offset, function.name_length); | 2272 isolate, compiled_module, function.name_offset, function.name_length); |
| 2273 if (!string.is_null()) return string.ToHandleChecked(); | 2273 if (!string.is_null()) return string.ToHandleChecked(); |
| 2274 return {}; | 2274 return {}; |
| 2275 } | 2275 } |
| OLD | NEW |