| 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 767 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 778 case kStartSectionCode: | 778 case kStartSectionCode: |
| 779 return "Start"; | 779 return "Start"; |
| 780 case kCodeSectionCode: | 780 case kCodeSectionCode: |
| 781 return "Code"; | 781 return "Code"; |
| 782 case kElementSectionCode: | 782 case kElementSectionCode: |
| 783 return "Element"; | 783 return "Element"; |
| 784 case kDataSectionCode: | 784 case kDataSectionCode: |
| 785 return "Data"; | 785 return "Data"; |
| 786 case kNameSectionCode: | 786 case kNameSectionCode: |
| 787 return "Name"; | 787 return "Name"; |
| 788 case kAsmOffsetsSectionCode: |
| 789 return "AsmOffsets"; |
| 788 default: | 790 default: |
| 789 return "<unknown>"; | 791 return "<unknown>"; |
| 790 } | 792 } |
| 791 } | 793 } |
| 792 | 794 |
| 793 std::ostream& operator<<(std::ostream& os, const WasmModule& module) { | 795 std::ostream& operator<<(std::ostream& os, const WasmModule& module) { |
| 794 os << "WASM module with "; | 796 os << "WASM module with "; |
| 795 os << (module.min_mem_pages * module.kPageSize) << " min mem"; | 797 os << (module.min_mem_pages * module.kPageSize) << " min mem"; |
| 796 os << (module.max_mem_pages * module.kPageSize) << " max mem"; | 798 os << (module.max_mem_pages * module.kPageSize) << " max mem"; |
| 797 os << module.functions.size() << " functions"; | 799 os << module.functions.size() << " functions"; |
| (...skipping 1197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1995 !(mem->IsUndefined(isolate) || mem->IsJSArrayBuffer()) || | 1997 !(mem->IsUndefined(isolate) || mem->IsJSArrayBuffer()) || |
| 1996 !WasmCompiledModule::IsWasmCompiledModule( | 1998 !WasmCompiledModule::IsWasmCompiledModule( |
| 1997 obj->GetInternalField(kWasmCompiledModule))) { | 1999 obj->GetInternalField(kWasmCompiledModule))) { |
| 1998 return false; | 2000 return false; |
| 1999 } | 2001 } |
| 2000 | 2002 |
| 2001 // All checks passed. | 2003 // All checks passed. |
| 2002 return true; | 2004 return true; |
| 2003 } | 2005 } |
| 2004 | 2006 |
| 2007 bool WasmIsAsm(Object* wasm, Isolate* isolate) { |
| 2008 if (wasm->IsUndefined(isolate)) return false; |
| 2009 DCHECK(IsWasmObject(wasm)); |
| 2010 Object* compiled_module = |
| 2011 JSObject::cast(wasm)->GetInternalField(kWasmCompiledModule); |
| 2012 return WasmCompiledModule::cast(compiled_module)->has_asm_js_script(); |
| 2013 } |
| 2014 |
| 2015 Handle<Script> GetAsmWasmScript(Handle<JSObject> wasm) { |
| 2016 DCHECK(IsWasmObject(*wasm)); |
| 2017 Object* compiled_module = |
| 2018 JSObject::cast(*wasm)->GetInternalField(kWasmCompiledModule); |
| 2019 return WasmCompiledModule::cast(compiled_module)->asm_js_script(); |
| 2020 } |
| 2021 |
| 2022 int GetAsmWasmSourcePosition(Handle<JSObject> wasm, int func_index, |
| 2023 int byte_offset) { |
| 2024 return WasmDebugInfo::GetAsmJsSourcePosition(GetDebugInfo(wasm), func_index, |
| 2025 byte_offset); |
| 2026 } |
| 2027 |
| 2005 Handle<SeqOneByteString> GetWasmBytes(Handle<JSObject> wasm) { | 2028 Handle<SeqOneByteString> GetWasmBytes(Handle<JSObject> wasm) { |
| 2006 DCHECK(IsWasmObject(*wasm)); | 2029 DCHECK(IsWasmObject(*wasm)); |
| 2007 Object* compiled_module = wasm->GetInternalField(kWasmCompiledModule); | 2030 Object* compiled_module = wasm->GetInternalField(kWasmCompiledModule); |
| 2008 return WasmCompiledModule::cast(compiled_module)->module_bytes(); | 2031 return WasmCompiledModule::cast(compiled_module)->module_bytes(); |
| 2009 } | 2032 } |
| 2010 | 2033 |
| 2011 Handle<WasmDebugInfo> GetDebugInfo(Handle<JSObject> wasm) { | 2034 Handle<WasmDebugInfo> GetDebugInfo(Handle<JSObject> wasm) { |
| 2012 Handle<Object> info(wasm->GetInternalField(kWasmDebugInfo), | 2035 Handle<Object> info(wasm->GetInternalField(kWasmDebugInfo), |
| 2013 wasm->GetIsolate()); | 2036 wasm->GetIsolate()); |
| 2014 if (!info->IsUndefined(wasm->GetIsolate())) | 2037 if (!info->IsUndefined(wasm->GetIsolate())) |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2112 module_obj->SetInternalField(0, *compiled_module); | 2135 module_obj->SetInternalField(0, *compiled_module); |
| 2113 if (origin == ModuleOrigin::kWasmOrigin) { | 2136 if (origin == ModuleOrigin::kWasmOrigin) { |
| 2114 Handle<Symbol> module_sym(isolate->native_context()->wasm_module_sym()); | 2137 Handle<Symbol> module_sym(isolate->native_context()->wasm_module_sym()); |
| 2115 Object::SetProperty(module_obj, module_sym, module_obj, STRICT).Check(); | 2138 Object::SetProperty(module_obj, module_sym, module_obj, STRICT).Check(); |
| 2116 } | 2139 } |
| 2117 Handle<WeakCell> link_to_module = isolate->factory()->NewWeakCell(module_obj); | 2140 Handle<WeakCell> link_to_module = isolate->factory()->NewWeakCell(module_obj); |
| 2118 compiled_module->set_weak_module_object(link_to_module); | 2141 compiled_module->set_weak_module_object(link_to_module); |
| 2119 return module_obj; | 2142 return module_obj; |
| 2120 } | 2143 } |
| 2121 | 2144 |
| 2122 MaybeHandle<JSObject> CreateModuleObjectFromBytes(Isolate* isolate, | 2145 // TODO(clemensh): origin can be inferred from asm_js_script; remove it. |
| 2123 const byte* start, | 2146 MaybeHandle<JSObject> CreateModuleObjectFromBytes( |
| 2124 const byte* end, | 2147 Isolate* isolate, const byte* start, const byte* end, ErrorThrower* thrower, |
| 2125 ErrorThrower* thrower, | 2148 ModuleOrigin origin, Handle<Script> asm_js_script) { |
| 2126 ModuleOrigin origin) { | |
| 2127 MaybeHandle<JSObject> nothing; | 2149 MaybeHandle<JSObject> nothing; |
| 2128 Zone zone(isolate->allocator()); | 2150 Zone zone(isolate->allocator()); |
| 2129 ModuleResult result = | 2151 ModuleResult result = |
| 2130 DecodeWasmModule(isolate, &zone, start, end, false, origin); | 2152 DecodeWasmModule(isolate, &zone, start, end, false, origin); |
| 2131 std::unique_ptr<const WasmModule> decoded_module(result.val); | 2153 std::unique_ptr<const WasmModule> decoded_module(result.val); |
| 2132 if (result.failed()) { | 2154 if (result.failed()) { |
| 2133 thrower->Failed("Wasm decoding failed", result); | 2155 thrower->Failed("Wasm decoding failed", result); |
| 2134 return nothing; | 2156 return nothing; |
| 2135 } | 2157 } |
| 2136 MaybeHandle<WasmCompiledModule> compiled_module = | 2158 MaybeHandle<WasmCompiledModule> maybe_compiled_module = |
| 2137 decoded_module->CompileFunctions(isolate, thrower); | 2159 decoded_module->CompileFunctions(isolate, thrower); |
| 2138 if (compiled_module.is_null()) return nothing; | 2160 if (maybe_compiled_module.is_null()) return nothing; |
| 2161 Handle<WasmCompiledModule> compiled_module = |
| 2162 maybe_compiled_module.ToHandleChecked(); |
| 2139 | 2163 |
| 2140 return CreateCompiledModuleObject(isolate, compiled_module.ToHandleChecked(), | 2164 DCHECK_EQ(origin == kAsmJsOrigin, !asm_js_script.is_null()); |
| 2141 origin); | 2165 DCHECK(!compiled_module->has_asm_js_script()); |
| 2166 if (origin == kAsmJsOrigin) { |
| 2167 compiled_module->set_asm_js_script(asm_js_script); |
| 2168 } |
| 2169 |
| 2170 return CreateCompiledModuleObject(isolate, compiled_module, origin); |
| 2142 } | 2171 } |
| 2143 | 2172 |
| 2144 bool ValidateModuleBytes(Isolate* isolate, const byte* start, const byte* end, | 2173 bool ValidateModuleBytes(Isolate* isolate, const byte* start, const byte* end, |
| 2145 ErrorThrower* thrower, ModuleOrigin origin) { | 2174 ErrorThrower* thrower, ModuleOrigin origin) { |
| 2146 Zone zone(isolate->allocator()); | 2175 Zone zone(isolate->allocator()); |
| 2147 ModuleResult result = | 2176 ModuleResult result = |
| 2148 DecodeWasmModule(isolate, &zone, start, end, false, origin); | 2177 DecodeWasmModule(isolate, &zone, start, end, false, origin); |
| 2149 if (result.ok()) { | 2178 if (result.ok()) { |
| 2150 DCHECK_NOT_NULL(result.val); | 2179 DCHECK_NOT_NULL(result.val); |
| 2151 delete result.val; | 2180 delete result.val; |
| (...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2278 WasmCompiledModule* compiled_module = | 2307 WasmCompiledModule* compiled_module = |
| 2279 WasmCompiledModule::cast(instance->GetInternalField(kWasmCompiledModule)); | 2308 WasmCompiledModule::cast(instance->GetInternalField(kWasmCompiledModule)); |
| 2280 CHECK(compiled_module->has_weak_module_object()); | 2309 CHECK(compiled_module->has_weak_module_object()); |
| 2281 CHECK(compiled_module->ptr_to_weak_module_object()->cleared()); | 2310 CHECK(compiled_module->ptr_to_weak_module_object()->cleared()); |
| 2282 } | 2311 } |
| 2283 | 2312 |
| 2284 } // namespace testing | 2313 } // namespace testing |
| 2285 } // namespace wasm | 2314 } // namespace wasm |
| 2286 } // namespace internal | 2315 } // namespace internal |
| 2287 } // namespace v8 | 2316 } // namespace v8 |
| OLD | NEW |