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 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
46 } else if (result.failed()) { | 46 } else if (result.failed()) { |
47 thrower->Failed("", result); | 47 thrower->Failed("", result); |
48 } else { | 48 } else { |
49 compiled_module = result.val->CompileFunctions(isolate, thrower); | 49 compiled_module = result.val->CompileFunctions(isolate, thrower); |
50 } | 50 } |
51 | 51 |
52 if (result.val) delete result.val; | 52 if (result.val) delete result.val; |
53 return compiled_module; | 53 return compiled_module; |
54 } | 54 } |
55 | 55 |
| 56 bool IsStdlibMemberValid(i::Isolate* isolate, Handle<JSReceiver> stdlib, |
| 57 i::Handle<i::Object> member_id) { |
| 58 int32_t member_kind; |
| 59 if (!member_id->ToInt32(&member_kind)) { |
| 60 UNREACHABLE(); |
| 61 } |
| 62 switch (member_kind) { |
| 63 case wasm::AsmTyper::StandardMember::kNone: |
| 64 case wasm::AsmTyper::StandardMember::kModule: |
| 65 case wasm::AsmTyper::StandardMember::kStdlib: { |
| 66 // Nothing to check for these. |
| 67 return true; |
| 68 } |
| 69 case wasm::AsmTyper::StandardMember::kNaN: { |
| 70 i::Handle<i::Name> name(isolate->factory()->InternalizeOneByteString( |
| 71 STATIC_CHAR_VECTOR("NaN"))); |
| 72 i::MaybeHandle<i::Object> maybe_value = |
| 73 i::Object::GetProperty(stdlib, name); |
| 74 if (maybe_value.is_null()) { |
| 75 return false; |
| 76 } |
| 77 i::Handle<i::Object> value = maybe_value.ToHandleChecked(); |
| 78 if (!value->IsNaN()) { |
| 79 return false; |
| 80 } |
| 81 return true; |
| 82 } |
| 83 case wasm::AsmTyper::StandardMember::kHeap: |
| 84 case wasm::AsmTyper::StandardMember::kFFI: |
| 85 case wasm::AsmTyper::StandardMember::kInfinity: |
| 86 case wasm::AsmTyper::StandardMember::kMathAcos: |
| 87 case wasm::AsmTyper::StandardMember::kMathAsin: |
| 88 case wasm::AsmTyper::StandardMember::kMathAtan: |
| 89 case wasm::AsmTyper::StandardMember::kMathCos: |
| 90 case wasm::AsmTyper::StandardMember::kMathSin: |
| 91 case wasm::AsmTyper::StandardMember::kMathTan: |
| 92 case wasm::AsmTyper::StandardMember::kMathExp: |
| 93 case wasm::AsmTyper::StandardMember::kMathLog: |
| 94 case wasm::AsmTyper::StandardMember::kMathCeil: |
| 95 case wasm::AsmTyper::StandardMember::kMathFloor: |
| 96 case wasm::AsmTyper::StandardMember::kMathSqrt: |
| 97 case wasm::AsmTyper::StandardMember::kMathAbs: |
| 98 case wasm::AsmTyper::StandardMember::kMathClz32: |
| 99 case wasm::AsmTyper::StandardMember::kMathMin: |
| 100 case wasm::AsmTyper::StandardMember::kMathMax: |
| 101 case wasm::AsmTyper::StandardMember::kMathAtan2: |
| 102 case wasm::AsmTyper::StandardMember::kMathPow: |
| 103 case wasm::AsmTyper::StandardMember::kMathImul: |
| 104 case wasm::AsmTyper::StandardMember::kMathFround: |
| 105 case wasm::AsmTyper::StandardMember::kMathE: |
| 106 case wasm::AsmTyper::StandardMember::kMathLN10: |
| 107 case wasm::AsmTyper::StandardMember::kMathLN2: |
| 108 case wasm::AsmTyper::StandardMember::kMathLOG2E: |
| 109 case wasm::AsmTyper::StandardMember::kMathLOG10E: |
| 110 case wasm::AsmTyper::StandardMember::kMathPI: |
| 111 case wasm::AsmTyper::StandardMember::kMathSQRT1_2: |
| 112 case wasm::AsmTyper::StandardMember::kMathSQRT2: |
| 113 // TODO(bradnelson) Actually check these. |
| 114 return true; |
| 115 default: { UNREACHABLE(); } |
| 116 } |
| 117 return false; |
| 118 } |
| 119 |
56 } // namespace | 120 } // namespace |
57 | 121 |
58 MaybeHandle<FixedArray> AsmJs::ConvertAsmToWasm(ParseInfo* info) { | 122 MaybeHandle<FixedArray> AsmJs::ConvertAsmToWasm(ParseInfo* info) { |
59 ErrorThrower thrower(info->isolate(), "Asm.js -> WebAssembly conversion"); | 123 ErrorThrower thrower(info->isolate(), "Asm.js -> WebAssembly conversion"); |
60 wasm::AsmTyper typer(info->isolate(), info->zone(), *(info->script()), | 124 wasm::AsmTyper typer(info->isolate(), info->zone(), *(info->script()), |
61 info->literal()); | 125 info->literal()); |
62 if (!typer.Validate()) { | 126 if (!typer.Validate()) { |
63 DCHECK(!info->isolate()->has_pending_exception()); | 127 DCHECK(!info->isolate()->has_pending_exception()); |
64 PrintF("Validation of asm.js module failed: %s", typer.error_message()); | 128 PrintF("Validation of asm.js module failed: %s", typer.error_message()); |
65 return MaybeHandle<FixedArray>(); | 129 return MaybeHandle<FixedArray>(); |
66 } | 130 } |
67 v8::internal::wasm::AsmWasmBuilder builder(info->isolate(), info->zone(), | 131 v8::internal::wasm::AsmWasmBuilder builder(info->isolate(), info->zone(), |
68 info->literal(), &typer); | 132 info->literal(), &typer); |
69 i::Handle<i::FixedArray> foreign_globals; | 133 i::Handle<i::FixedArray> foreign_globals; |
70 auto module = builder.Run(&foreign_globals); | 134 auto module = builder.Run(&foreign_globals); |
71 | 135 |
72 i::MaybeHandle<i::FixedArray> compiled = | 136 i::MaybeHandle<i::FixedArray> compiled = |
73 CompileModule(info->isolate(), module->begin(), module->end(), &thrower, | 137 CompileModule(info->isolate(), module->begin(), module->end(), &thrower, |
74 internal::wasm::kAsmJsOrigin); | 138 internal::wasm::kAsmJsOrigin); |
75 DCHECK(!compiled.is_null()); | 139 DCHECK(!compiled.is_null()); |
76 | 140 |
77 Handle<FixedArray> result = info->isolate()->factory()->NewFixedArray(2); | 141 wasm::AsmTyper::StdlibSet uses = typer.StdlibUses(); |
| 142 Handle<FixedArray> uses_array = |
| 143 info->isolate()->factory()->NewFixedArray(static_cast<int>(uses.size())); |
| 144 int count = 0; |
| 145 for (auto i : uses) { |
| 146 uses_array->set(count++, Smi::FromInt(i)); |
| 147 } |
| 148 |
| 149 Handle<FixedArray> result = info->isolate()->factory()->NewFixedArray(3); |
78 result->set(0, *compiled.ToHandleChecked()); | 150 result->set(0, *compiled.ToHandleChecked()); |
79 result->set(1, *foreign_globals); | 151 result->set(1, *foreign_globals); |
| 152 result->set(2, *uses_array); |
80 return result; | 153 return result; |
81 } | 154 } |
82 | 155 |
| 156 bool AsmJs::IsStdlibValid(i::Isolate* isolate, Handle<FixedArray> wasm_data, |
| 157 Handle<JSReceiver> stdlib) { |
| 158 i::Handle<i::FixedArray> uses(i::FixedArray::cast(wasm_data->get(2))); |
| 159 for (int i = 0; i < uses->length(); ++i) { |
| 160 if (!IsStdlibMemberValid(isolate, stdlib, |
| 161 uses->GetValueChecked<i::Object>(isolate, i))) { |
| 162 return false; |
| 163 } |
| 164 } |
| 165 return true; |
| 166 } |
| 167 |
83 MaybeHandle<Object> AsmJs::InstantiateAsmWasm(i::Isolate* isolate, | 168 MaybeHandle<Object> AsmJs::InstantiateAsmWasm(i::Isolate* isolate, |
84 Handle<FixedArray> wasm_data, | 169 Handle<FixedArray> wasm_data, |
85 Handle<JSArrayBuffer> memory, | 170 Handle<JSArrayBuffer> memory, |
86 Handle<JSObject> foreign) { | 171 Handle<JSReceiver> foreign) { |
87 i::Handle<i::FixedArray> compiled(i::FixedArray::cast(wasm_data->get(0))); | 172 i::Handle<i::FixedArray> compiled(i::FixedArray::cast(wasm_data->get(0))); |
88 i::Handle<i::FixedArray> foreign_globals( | 173 i::Handle<i::FixedArray> foreign_globals( |
89 i::FixedArray::cast(wasm_data->get(1))); | 174 i::FixedArray::cast(wasm_data->get(1))); |
90 | 175 |
91 ErrorThrower thrower(isolate, "Asm.js -> WebAssembly instantiation"); | 176 ErrorThrower thrower(isolate, "Asm.js -> WebAssembly instantiation"); |
92 | 177 |
93 i::MaybeHandle<i::JSObject> maybe_module_object = | 178 i::MaybeHandle<i::JSObject> maybe_module_object = |
94 i::wasm::WasmModule::Instantiate(isolate, compiled, foreign, memory); | 179 i::wasm::WasmModule::Instantiate(isolate, compiled, foreign, memory); |
95 if (maybe_module_object.is_null()) { | 180 if (maybe_module_object.is_null()) { |
96 return MaybeHandle<Object>(); | 181 return MaybeHandle<Object>(); |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
130 if (retval.is_null()) { | 215 if (retval.is_null()) { |
131 thrower.Error( | 216 thrower.Error( |
132 "WASM.instantiateModuleFromAsm(): foreign init function failed"); | 217 "WASM.instantiateModuleFromAsm(): foreign init function failed"); |
133 return MaybeHandle<Object>(); | 218 return MaybeHandle<Object>(); |
134 } | 219 } |
135 return maybe_module_object; | 220 return maybe_module_object; |
136 } | 221 } |
137 | 222 |
138 } // namespace internal | 223 } // namespace internal |
139 } // namespace v8 | 224 } // namespace v8 |
OLD | NEW |