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/api.h" | 5 #include "src/api.h" |
6 #include "src/api-natives.h" | 6 #include "src/api-natives.h" |
7 #include "src/assert-scope.h" | 7 #include "src/assert-scope.h" |
8 #include "src/ast/ast.h" | 8 #include "src/ast/ast.h" |
9 #include "src/ast/scopes.h" | 9 #include "src/ast/scopes.h" |
10 #include "src/factory.h" | 10 #include "src/factory.h" |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
93 } | 93 } |
94 | 94 |
95 if (result.failed()) { | 95 if (result.failed()) { |
96 thrower.Failed("", result); | 96 thrower.Failed("", result); |
97 } | 97 } |
98 | 98 |
99 if (result.val) delete result.val; | 99 if (result.val) delete result.val; |
100 } | 100 } |
101 | 101 |
102 | 102 |
103 void CompileRun(const v8::FunctionCallbackInfo<v8::Value>& args) { | |
104 HandleScope scope(args.GetIsolate()); | |
105 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(args.GetIsolate()); | |
106 ErrorThrower thrower(isolate, "WASM.compileRun()"); | |
107 | |
108 RawBuffer buffer = GetRawBufferArgument(thrower, args); | |
109 if (thrower.error()) return; | |
110 | |
111 // Decode and pre-verify the functions before compiling and running. | |
112 i::Zone zone; | |
113 internal::wasm::ModuleResult result = internal::wasm::DecodeWasmModule( | |
114 isolate, &zone, buffer.start, buffer.end, true, false); | |
115 | |
116 if (result.failed()) { | |
117 thrower.Failed("", result); | |
118 } else { | |
119 // Success. Compile and run! | |
120 int32_t retval = i::wasm::CompileAndRunWasmModule(isolate, result.val); | |
121 args.GetReturnValue().Set(retval); | |
122 } | |
123 | |
124 if (result.val) delete result.val; | |
125 } | |
126 | |
127 | |
128 v8::internal::wasm::WasmModuleIndex* TranslateAsmModule(i::ParseInfo* info, | 103 v8::internal::wasm::WasmModuleIndex* TranslateAsmModule(i::ParseInfo* info, |
129 ErrorThrower* thrower) { | 104 ErrorThrower* thrower) { |
130 info->set_global(); | 105 info->set_global(); |
131 info->set_lazy(false); | 106 info->set_lazy(false); |
132 info->set_allow_lazy_parsing(false); | 107 info->set_allow_lazy_parsing(false); |
133 info->set_toplevel(true); | 108 info->set_toplevel(true); |
134 | 109 |
135 if (!i::Compiler::ParseAndAnalyze(info)) { | 110 if (!i::Compiler::ParseAndAnalyze(info)) { |
136 return nullptr; | 111 return nullptr; |
137 } | 112 } |
(...skipping 11 matching lines...) Expand all Loading... |
149 return nullptr; | 124 return nullptr; |
150 } | 125 } |
151 | 126 |
152 auto module = v8::internal::wasm::AsmWasmBuilder( | 127 auto module = v8::internal::wasm::AsmWasmBuilder( |
153 info->isolate(), info->zone(), info->literal()) | 128 info->isolate(), info->zone(), info->literal()) |
154 .Run(); | 129 .Run(); |
155 return module; | 130 return module; |
156 } | 131 } |
157 | 132 |
158 | 133 |
159 void AsmCompileRun(const v8::FunctionCallbackInfo<v8::Value>& args) { | |
160 HandleScope scope(args.GetIsolate()); | |
161 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(args.GetIsolate()); | |
162 ErrorThrower thrower(isolate, "WASM.asmCompileRun()"); | |
163 | |
164 if (args.Length() != 1) { | |
165 thrower.Error("Invalid argument count"); | |
166 return; | |
167 } | |
168 if (!args[0]->IsString()) { | |
169 thrower.Error("Asm module text should be a string"); | |
170 return; | |
171 } | |
172 | |
173 i::Factory* factory = isolate->factory(); | |
174 i::Zone zone; | |
175 Local<String> source = Local<String>::Cast(args[0]); | |
176 i::Handle<i::Script> script = factory->NewScript(Utils::OpenHandle(*source)); | |
177 i::ParseInfo info(&zone, script); | |
178 | |
179 auto module = TranslateAsmModule(&info, &thrower); | |
180 if (module == nullptr) { | |
181 return; | |
182 } | |
183 | |
184 int32_t result = v8::internal::wasm::CompileAndRunWasmModule( | |
185 isolate, module->Begin(), module->End(), true); | |
186 args.GetReturnValue().Set(result); | |
187 } | |
188 | |
189 | |
190 void InstantiateModuleCommon(const v8::FunctionCallbackInfo<v8::Value>& args, | 134 void InstantiateModuleCommon(const v8::FunctionCallbackInfo<v8::Value>& args, |
191 const byte* start, const byte* end, | 135 const byte* start, const byte* end, |
192 ErrorThrower* thrower, bool must_decode) { | 136 ErrorThrower* thrower, bool must_decode) { |
193 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(args.GetIsolate()); | 137 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(args.GetIsolate()); |
194 | 138 |
195 i::Handle<i::JSArrayBuffer> memory = i::Handle<i::JSArrayBuffer>::null(); | 139 i::Handle<i::JSArrayBuffer> memory = i::Handle<i::JSArrayBuffer>::null(); |
196 if (args.Length() > 2 && args[2]->IsArrayBuffer()) { | 140 if (args.Length() > 2 && args[2]->IsArrayBuffer()) { |
197 Local<Object> obj = Local<Object>::Cast(args[2]); | 141 Local<Object> obj = Local<Object>::Cast(args[2]); |
198 i::Handle<i::Object> mem_obj = v8::Utils::OpenHandle(*obj); | 142 i::Handle<i::Object> mem_obj = v8::Utils::OpenHandle(*obj); |
199 memory = i::Handle<i::JSArrayBuffer>(i::JSArrayBuffer::cast(*mem_obj)); | 143 memory = i::Handle<i::JSArrayBuffer>(i::JSArrayBuffer::cast(*mem_obj)); |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
305 Handle<String> name = v8_str(isolate, "_WASMEXP_"); | 249 Handle<String> name = v8_str(isolate, "_WASMEXP_"); |
306 Handle<JSFunction> cons = factory->NewFunction(name); | 250 Handle<JSFunction> cons = factory->NewFunction(name); |
307 JSFunction::SetInstancePrototype( | 251 JSFunction::SetInstancePrototype( |
308 cons, Handle<Object>(context->initial_object_prototype(), isolate)); | 252 cons, Handle<Object>(context->initial_object_prototype(), isolate)); |
309 cons->shared()->set_instance_class_name(*name); | 253 cons->shared()->set_instance_class_name(*name); |
310 Handle<JSObject> wasm_object = factory->NewJSObject(cons, TENURED); | 254 Handle<JSObject> wasm_object = factory->NewJSObject(cons, TENURED); |
311 PropertyAttributes attributes = static_cast<PropertyAttributes>(DONT_ENUM); | 255 PropertyAttributes attributes = static_cast<PropertyAttributes>(DONT_ENUM); |
312 JSObject::AddProperty(global, name, wasm_object, attributes); | 256 JSObject::AddProperty(global, name, wasm_object, attributes); |
313 | 257 |
314 // Install functions on the WASM object. | 258 // Install functions on the WASM object. |
315 InstallFunc(isolate, wasm_object, "instantiateModule", InstantiateModule); | |
316 InstallFunc(isolate, wasm_object, "verifyModule", VerifyModule); | 259 InstallFunc(isolate, wasm_object, "verifyModule", VerifyModule); |
317 InstallFunc(isolate, wasm_object, "verifyFunction", VerifyFunction); | 260 InstallFunc(isolate, wasm_object, "verifyFunction", VerifyFunction); |
318 InstallFunc(isolate, wasm_object, "compileRun", CompileRun); | 261 InstallFunc(isolate, wasm_object, "instantiateModule", InstantiateModule); |
319 InstallFunc(isolate, wasm_object, "asmCompileRun", AsmCompileRun); | |
320 InstallFunc(isolate, wasm_object, "instantiateModuleFromAsm", | 262 InstallFunc(isolate, wasm_object, "instantiateModuleFromAsm", |
321 InstantiateModuleFromAsm); | 263 InstantiateModuleFromAsm); |
322 } | 264 } |
323 | 265 |
324 | 266 |
325 void WasmJs::InstallWasmFunctionMap(Isolate* isolate, Handle<Context> context) { | 267 void WasmJs::InstallWasmFunctionMap(Isolate* isolate, Handle<Context> context) { |
326 if (!context->get(Context::WASM_FUNCTION_MAP_INDEX)->IsMap()) { | 268 if (!context->get(Context::WASM_FUNCTION_MAP_INDEX)->IsMap()) { |
327 Handle<Map> wasm_function_map = isolate->factory()->NewMap( | 269 Handle<Map> wasm_function_map = isolate->factory()->NewMap( |
328 JS_FUNCTION_TYPE, JSFunction::kSize + kPointerSize); | 270 JS_FUNCTION_TYPE, JSFunction::kSize + kPointerSize); |
329 wasm_function_map->set_is_callable(); | 271 wasm_function_map->set_is_callable(); |
330 context->set_wasm_function_map(*wasm_function_map); | 272 context->set_wasm_function_map(*wasm_function_map); |
331 } | 273 } |
332 } | 274 } |
333 | 275 |
334 } // namespace internal | 276 } // namespace internal |
335 } // namespace v8 | 277 } // namespace v8 |
OLD | NEW |