f75e9a7e79ac121df96f1f200920684851bc0493
[WebKit-https.git] / Source / JavaScriptCore / wasm / js / WebAssemblyModuleConstructor.cpp
1 /*
2  * Copyright (C) 2016 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #include "config.h"
27 #include "WebAssemblyModuleConstructor.h"
28
29 #if ENABLE(WEBASSEMBLY)
30
31 #include "ExceptionHelpers.h"
32 #include "FunctionPrototype.h"
33 #include "JSArrayBuffer.h"
34 #include "JSCInlines.h"
35 #include "JSTypedArrays.h"
36 #include "JSWebAssemblyCompileError.h"
37 #include "JSWebAssemblyHelpers.h"
38 #include "JSWebAssemblyModule.h"
39 #include "SymbolTable.h"
40 #include "WasmCallee.h"
41 #include "WasmPlan.h"
42 #include "WebAssemblyModulePrototype.h"
43 #include <wtf/StdLibExtras.h>
44
45 #include "WebAssemblyModuleConstructor.lut.h"
46
47 namespace JSC {
48
49 const ClassInfo WebAssemblyModuleConstructor::s_info = { "Function", &Base::s_info, &constructorTableWebAssemblyModule, CREATE_METHOD_TABLE(WebAssemblyModuleConstructor) };
50
51 /* Source for WebAssemblyModuleConstructor.lut.h
52  @begin constructorTableWebAssemblyModule
53  @end
54  */
55
56 static EncodedJSValue JSC_HOST_CALL constructJSWebAssemblyModule(ExecState* exec)
57 {
58     VM& vm = exec->vm();
59     auto throwScope = DECLARE_THROW_SCOPE(vm);
60     auto* structure = InternalFunction::createSubclassStructure(exec, exec->newTarget(), exec->lexicalGlobalObject()->WebAssemblyModuleStructure());
61     RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
62     throwScope.release();
63     return JSValue::encode(WebAssemblyModuleConstructor::createModule(exec, exec->argument(0), structure));
64 }
65
66 static EncodedJSValue JSC_HOST_CALL callJSWebAssemblyModule(ExecState* exec)
67 {
68     VM& vm = exec->vm();
69     auto scope = DECLARE_THROW_SCOPE(vm);
70     return JSValue::encode(throwConstructorCannotBeCalledAsFunctionTypeError(exec, scope, "WebAssembly.Module"));
71 }
72
73 JSValue WebAssemblyModuleConstructor::createModule(ExecState* exec, JSValue buffer, Structure* structure)
74 {
75     VM& vm = exec->vm();
76     auto scope = DECLARE_THROW_SCOPE(vm);
77
78     RefPtr<ArrayBuffer> source = createSourceBufferFromValue(vm, exec, buffer);
79     RETURN_IF_EXCEPTION(scope, { });
80
81     RefPtr<Wasm::Plan> plan = adoptRef(new Wasm::Plan(vm, *source, Wasm::Plan::Validation, Wasm::Plan::dontFinalize));
82     if (!plan->parseAndValidateModule())
83         return throwException(exec, scope, JSWebAssemblyCompileError::create(exec, vm, exec->lexicalGlobalObject()->WebAssemblyCompileErrorStructure(), plan->errorMessage()));
84     return JSWebAssemblyModule::createStub(vm, exec, structure, WTFMove(source), WTFMove(plan));
85 }
86
87 WebAssemblyModuleConstructor* WebAssemblyModuleConstructor::create(VM& vm, Structure* structure, WebAssemblyModulePrototype* thisPrototype)
88 {
89     auto* constructor = new (NotNull, allocateCell<WebAssemblyModuleConstructor>(vm.heap)) WebAssemblyModuleConstructor(vm, structure);
90     constructor->finishCreation(vm, thisPrototype);
91     return constructor;
92 }
93
94 Structure* WebAssemblyModuleConstructor::createStructure(VM& vm, JSGlobalObject* globalObject, JSValue prototype)
95 {
96     return Structure::create(vm, globalObject, prototype, TypeInfo(ObjectType, StructureFlags), info());
97 }
98
99 void WebAssemblyModuleConstructor::finishCreation(VM& vm, WebAssemblyModulePrototype* prototype)
100 {
101     Base::finishCreation(vm, ASCIILiteral("Module"));
102     putDirectWithoutTransition(vm, vm.propertyNames->prototype, prototype, DontEnum | DontDelete | ReadOnly);
103     putDirectWithoutTransition(vm, vm.propertyNames->length, jsNumber(1), ReadOnly | DontEnum | DontDelete);
104 }
105
106 WebAssemblyModuleConstructor::WebAssemblyModuleConstructor(VM& vm, Structure* structure)
107     : Base(vm, structure)
108 {
109 }
110
111 ConstructType WebAssemblyModuleConstructor::getConstructData(JSCell*, ConstructData& constructData)
112 {
113     constructData.native.function = constructJSWebAssemblyModule;
114     return ConstructType::Host;
115 }
116
117 CallType WebAssemblyModuleConstructor::getCallData(JSCell*, CallData& callData)
118 {
119     callData.native.function = callJSWebAssemblyModule;
120     return CallType::Host;
121 }
122
123 void WebAssemblyModuleConstructor::visitChildren(JSCell* cell, SlotVisitor& visitor)
124 {
125     auto* thisObject = jsCast<WebAssemblyModuleConstructor*>(cell);
126     ASSERT_GC_OBJECT_INHERITS(thisObject, info());
127     Base::visitChildren(thisObject, visitor);
128 }
129
130 } // namespace JSC
131
132 #endif // ENABLE(WEBASSEMBLY)
133