Chromium Code Reviews| 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/asmjs/asm-js.h" | 5 #include "src/asmjs/asm-js.h" |
| 6 | 6 |
| 7 #include "src/api-natives.h" | 7 #include "src/api-natives.h" |
| 8 #include "src/api.h" | 8 #include "src/api.h" |
| 9 #include "src/asmjs/asm-typer.h" | 9 #include "src/asmjs/asm-typer.h" |
| 10 #include "src/asmjs/asm-wasm-builder.h" | 10 #include "src/asmjs/asm-wasm-builder.h" |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 67 v8::internal::wasm::AsmWasmBuilder builder(info->isolate(), info->zone(), | 67 v8::internal::wasm::AsmWasmBuilder builder(info->isolate(), info->zone(), |
| 68 info->literal(), &typer); | 68 info->literal(), &typer); |
| 69 i::Handle<i::FixedArray> foreign_globals; | 69 i::Handle<i::FixedArray> foreign_globals; |
| 70 auto module = builder.Run(&foreign_globals); | 70 auto module = builder.Run(&foreign_globals); |
| 71 | 71 |
| 72 i::MaybeHandle<i::FixedArray> compiled = | 72 i::MaybeHandle<i::FixedArray> compiled = |
| 73 CompileModule(info->isolate(), module->begin(), module->end(), &thrower, | 73 CompileModule(info->isolate(), module->begin(), module->end(), &thrower, |
| 74 internal::wasm::kAsmJsOrigin); | 74 internal::wasm::kAsmJsOrigin); |
| 75 DCHECK(!compiled.is_null()); | 75 DCHECK(!compiled.is_null()); |
| 76 | 76 |
| 77 Handle<FixedArray> result = info->isolate()->factory()->NewFixedArray(2); | 77 wasm::AsmTyper::StdlibSet uses = typer.StdlibUses(); |
| 78 Handle<FixedArray> uses_array = | |
| 79 info->isolate()->factory()->NewFixedArray(static_cast<int>(uses.size())); | |
| 80 int count = 0; | |
| 81 for (auto i : uses) { | |
| 82 uses_array->set(count++, Smi::FromInt(i)); | |
| 83 } | |
| 84 | |
| 85 Handle<FixedArray> result = info->isolate()->factory()->NewFixedArray(3); | |
| 78 result->set(0, *compiled.ToHandleChecked()); | 86 result->set(0, *compiled.ToHandleChecked()); |
| 79 result->set(1, *foreign_globals); | 87 result->set(1, *foreign_globals); |
| 88 result->set(2, *uses_array); | |
| 80 return result; | 89 return result; |
| 81 } | 90 } |
| 82 | 91 |
| 92 bool AsmJs::IsStdlibValid(i::Isolate* isolate, Handle<FixedArray> wasm_data, | |
| 93 Handle<JSReceiver> stdlib) { | |
| 94 i::Handle<i::FixedArray> uses(i::FixedArray::cast(wasm_data->get(2))); | |
| 95 for (int i = 0; i < uses->length(); ++i) { | |
| 96 int32_t kind; | |
| 97 if (!uses->get(i)->ToInt32(&kind)) { | |
| 98 continue; | |
| 99 } | |
| 100 switch (kind) { | |
| 101 case wasm::AsmTyper::StandardMember::kNaN: { | |
| 102 i::Handle<i::Name> name(isolate->factory()->InternalizeOneByteString( | |
| 103 STATIC_CHAR_VECTOR("NaN"))); | |
| 104 i::MaybeHandle<i::Object> maybe_value = | |
| 105 i::Object::GetProperty(stdlib, name); | |
| 106 if (maybe_value.is_null()) { | |
| 107 return false; | |
| 108 } | |
| 109 i::Handle<i::Object> value = maybe_value.ToHandleChecked(); | |
| 110 if (!value->IsNaN()) { | |
| 111 return false; | |
| 112 } | |
|
titzer
2016/08/19 10:00:28
Do you want to return true here and then false for
bradn
2016/08/19 17:29:08
Actually not, because this needs to loop to check
| |
| 113 } break; | |
| 114 | |
| 115 default: { | |
| 116 // TODO(bradnelson): Implement check for the others | |
| 117 } | |
| 118 } | |
| 119 } | |
| 120 return true; | |
| 121 } | |
| 122 | |
| 83 MaybeHandle<Object> AsmJs::InstantiateAsmWasm(i::Isolate* isolate, | 123 MaybeHandle<Object> AsmJs::InstantiateAsmWasm(i::Isolate* isolate, |
| 84 Handle<FixedArray> wasm_data, | 124 Handle<FixedArray> wasm_data, |
| 85 Handle<JSArrayBuffer> memory, | 125 Handle<JSArrayBuffer> memory, |
| 86 Handle<JSObject> foreign) { | 126 Handle<JSReceiver> foreign) { |
| 87 i::Handle<i::FixedArray> compiled(i::FixedArray::cast(wasm_data->get(0))); | 127 i::Handle<i::FixedArray> compiled(i::FixedArray::cast(wasm_data->get(0))); |
| 88 i::Handle<i::FixedArray> foreign_globals( | 128 i::Handle<i::FixedArray> foreign_globals( |
| 89 i::FixedArray::cast(wasm_data->get(1))); | 129 i::FixedArray::cast(wasm_data->get(1))); |
| 90 | 130 |
| 91 ErrorThrower thrower(isolate, "Asm.js -> WebAssembly instantiation"); | 131 ErrorThrower thrower(isolate, "Asm.js -> WebAssembly instantiation"); |
| 92 | 132 |
| 93 i::MaybeHandle<i::JSObject> maybe_module_object = | 133 i::MaybeHandle<i::JSObject> maybe_module_object = |
| 94 i::wasm::WasmModule::Instantiate(isolate, compiled, foreign, memory); | 134 i::wasm::WasmModule::Instantiate(isolate, compiled, foreign, memory); |
| 95 if (maybe_module_object.is_null()) { | 135 if (maybe_module_object.is_null()) { |
| 96 return MaybeHandle<Object>(); | 136 return MaybeHandle<Object>(); |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 130 if (retval.is_null()) { | 170 if (retval.is_null()) { |
| 131 thrower.Error( | 171 thrower.Error( |
| 132 "WASM.instantiateModuleFromAsm(): foreign init function failed"); | 172 "WASM.instantiateModuleFromAsm(): foreign init function failed"); |
| 133 return MaybeHandle<Object>(); | 173 return MaybeHandle<Object>(); |
| 134 } | 174 } |
| 135 return maybe_module_object; | 175 return maybe_module_object; |
| 136 } | 176 } |
| 137 | 177 |
| 138 } // namespace internal | 178 } // namespace internal |
| 139 } // namespace v8 | 179 } // namespace v8 |
| OLD | NEW |