Implement calls to JavaScript functions in WebAssembly
[WebKit-https.git] / Source / JavaScriptCore / wasm / JSWASMModule.h
1 /*
2  * Copyright (C) 2015 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 #ifndef JSWASMModule_h
27 #define JSWASMModule_h
28
29 #if ENABLE(WEBASSEMBLY)
30
31 #include "JSDestructibleObject.h"
32 #include "WASMFormat.h"
33
34 namespace JSC {
35
36 class JSWASMModule : public JSDestructibleObject {
37 public:
38     typedef JSDestructibleObject Base;
39
40     union GlobalVariable {
41         GlobalVariable(int32_t value)
42             : intValue(value)
43         {
44         }
45         GlobalVariable(float value)
46             : floatValue(value)
47         {
48         }
49         GlobalVariable(double value)
50             : doubleValue(value)
51         {
52         }
53
54         int32_t intValue;
55         float floatValue;
56         double doubleValue;
57     };
58
59     static JSWASMModule* create(VM& vm, Structure* structure)
60     {
61         JSWASMModule* module = new (NotNull, allocateCell<JSWASMModule>(vm.heap)) JSWASMModule(vm, structure);
62         module->finishCreation(vm);
63         return module;
64     }
65
66     DECLARE_INFO;
67
68     static Structure* createStructure(VM& vm, JSGlobalObject* globalObject)
69     {
70         return Structure::create(vm, globalObject, jsNull(), TypeInfo(ObjectType, StructureFlags), info());
71     }
72
73     static void destroy(JSCell*);
74     static void visitChildren(JSCell*, SlotVisitor&);
75
76     Vector<uint32_t>& i32Constants() { return m_i32Constants; }
77     Vector<float>& f32Constants() { return m_f32Constants; }
78     Vector<double>& f64Constants() { return m_f64Constants; }
79     Vector<WASMSignature>& signatures() { return m_signatures; }
80     Vector<WASMFunctionImport>& functionImports() { return m_functionImports; }
81     Vector<WASMFunctionImportSignature>& functionImportSignatures() { return m_functionImportSignatures; }
82     Vector<WASMType>& globalVariableTypes() { return m_globalVariableTypes; }
83     Vector<WASMFunctionDeclaration>& functionDeclarations() { return m_functionDeclarations; }
84     Vector<WASMFunctionPointerTable>& functionPointerTables() { return m_functionPointerTables; }
85
86     Vector<WriteBarrier<JSFunction>>& functions() { return m_functions; }
87     Vector<unsigned>& functionStartOffsetsInSource() { return m_functionStartOffsetsInSource; }
88     Vector<unsigned>& functionStackHeights() { return m_functionStackHeights; }
89     Vector<GlobalVariable>& globalVariables() { return m_globalVariables; }
90     Vector<WriteBarrier<JSFunction>>& importedFunctions() { return m_importedFunctions; }
91
92 private:
93     JSWASMModule(VM& vm, Structure* structure)
94         : Base(vm, structure)
95     {
96     }
97
98     Vector<uint32_t> m_i32Constants;
99     Vector<float> m_f32Constants;
100     Vector<double> m_f64Constants;
101     Vector<WASMSignature> m_signatures;
102     Vector<WASMFunctionImport> m_functionImports;
103     Vector<WASMFunctionImportSignature> m_functionImportSignatures;
104     Vector<WASMType> m_globalVariableTypes;
105     Vector<WASMFunctionDeclaration> m_functionDeclarations;
106     Vector<WASMFunctionPointerTable> m_functionPointerTables;
107
108     Vector<WriteBarrier<JSFunction>> m_functions;
109     Vector<unsigned> m_functionStartOffsetsInSource;
110     Vector<unsigned> m_functionStackHeights;
111     Vector<GlobalVariable> m_globalVariables;
112     Vector<WriteBarrier<JSFunction>> m_importedFunctions;
113 };
114
115 } // namespace JSC
116
117 #endif // ENABLE(WEBASSEMBLY)
118
119 #endif // JSWASMModule_h