WebAssembly JS API: add Module.sections
[WebKit-https.git] / Source / JavaScriptCore / wasm / js / WebAssemblyModulePrototype.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 "WebAssemblyModulePrototype.h"
28
29 #if ENABLE(WEBASSEMBLY)
30
31 #include "ArrayBuffer.h"
32 #include "FunctionPrototype.h"
33 #include "JSArrayBuffer.h"
34 #include "JSCInlines.h"
35 #include "JSWebAssemblyModule.h"
36
37 namespace JSC {
38 static EncodedJSValue JSC_HOST_CALL webAssemblyModuleProtoCustomSections(ExecState*);
39 }
40
41 #include "WebAssemblyModulePrototype.lut.h"
42
43 namespace JSC {
44
45 const ClassInfo WebAssemblyModulePrototype::s_info = { "WebAssembly.Module.prototype", &Base::s_info, &prototypeTableWebAssemblyModule, CREATE_METHOD_TABLE(WebAssemblyModulePrototype) };
46
47 /* Source for WebAssemblyModulePrototype.lut.h
48  @begin prototypeTableWebAssemblyModule
49  customSections webAssemblyModuleProtoCustomSections DontEnum|Function 1
50  @end
51  */
52
53 EncodedJSValue JSC_HOST_CALL webAssemblyModuleProtoCustomSections(ExecState* exec)
54 {
55     VM& vm = exec->vm();
56     auto* globalObject = exec->lexicalGlobalObject();
57     auto throwScope = DECLARE_THROW_SCOPE(vm);
58
59     JSWebAssemblyModule* module = jsDynamicCast<JSWebAssemblyModule*>(exec->thisValue());
60     if (!module)
61         throwException(exec, throwScope, createTypeError(exec, ASCIILiteral("WebAssembly.Module.prototype.customSections called with non WebAssembly.Module |this| value")));
62     RETURN_IF_EXCEPTION(throwScope, { });
63
64     const String sectionNameString = exec->argument(0).getString(exec);
65     RETURN_IF_EXCEPTION(throwScope, { });
66
67     JSArray* result = constructEmptyArray(exec, nullptr, globalObject);
68     RETURN_IF_EXCEPTION(throwScope, { });
69
70     const auto& customSections = module->moduleInformation().customSections;
71     for (const Wasm::CustomSection& section : customSections) {
72         if (section.name == sectionNameString) {
73             auto buffer = ArrayBuffer::tryCreate(section.payload.data(), section.payload.size());
74             if (!buffer)
75                 throwException(exec, throwScope, createOutOfMemoryError(exec));
76
77             Structure* arrayBufferStructure = InternalFunction::createSubclassStructure(exec, JSValue(), globalObject->arrayBufferStructure(ArrayBufferSharingMode::Default));
78             RETURN_IF_EXCEPTION(throwScope, { });
79
80             result->push(exec, JSArrayBuffer::create(vm, arrayBufferStructure, WTFMove(buffer)));
81             RETURN_IF_EXCEPTION(throwScope, { });
82         }
83     }
84
85     return JSValue::encode(result);
86 }
87
88 WebAssemblyModulePrototype* WebAssemblyModulePrototype::create(VM& vm, JSGlobalObject*, Structure* structure)
89 {
90     auto* object = new (NotNull, allocateCell<WebAssemblyModulePrototype>(vm.heap)) WebAssemblyModulePrototype(vm, structure);
91     object->finishCreation(vm);
92     return object;
93 }
94
95 Structure* WebAssemblyModulePrototype::createStructure(VM& vm, JSGlobalObject* globalObject, JSValue prototype)
96 {
97     return Structure::create(vm, globalObject, prototype, TypeInfo(ObjectType, StructureFlags), info());
98 }
99
100 void WebAssemblyModulePrototype::finishCreation(VM& vm)
101 {
102     Base::finishCreation(vm);
103 }
104
105 WebAssemblyModulePrototype::WebAssemblyModulePrototype(VM& vm, Structure* structure)
106     : Base(vm, structure)
107 {
108 }
109
110 } // namespace JSC
111
112 #endif // ENABLE(WEBASSEMBLY)