@@ -103,6 +103,7 @@ class JitCall {
103
103
enum Kind : char {
104
104
kUnknown = 0 ,
105
105
kGenericCall ,
106
+ kConstructorCall ,
106
107
kDestructorCall ,
107
108
};
108
109
struct ArgList {
@@ -116,20 +117,25 @@ class JitCall {
116
117
// FIXME: Hide these implementation details by moving wrapper generation in
117
118
// this class.
118
119
// (self, nargs, args, result, nary)
119
- using GenericCall = void (*)(void *, size_t , void **, void *, size_t );
120
+ using GenericCall = void (*)(void *, size_t , void **, void *);
121
+ // (result, nary, nargs, args, is_arena)
122
+ using ConstructorCall = void (*)(void *, size_t , size_t , void **, void *);
120
123
// (self, nary, withFree)
121
124
using DestructorCall = void (*)(void *, size_t , int );
122
125
123
126
private:
124
127
union {
125
128
GenericCall m_GenericCall;
129
+ ConstructorCall m_ConstructorCall;
126
130
DestructorCall m_DestructorCall;
127
131
};
128
132
Kind m_Kind;
129
133
TCppConstFunction_t m_FD;
130
134
JitCall () : m_GenericCall(nullptr ), m_Kind(kUnknown ), m_FD(nullptr ) {}
131
135
JitCall (Kind K, GenericCall C, TCppConstFunction_t FD)
132
136
: m_GenericCall(C), m_Kind(K), m_FD(FD) {}
137
+ JitCall (Kind K, ConstructorCall C, TCppConstFunction_t Ctor)
138
+ : m_ConstructorCall(C), m_Kind(K), m_FD(Ctor) {}
133
139
JitCall (Kind K, DestructorCall C, TCppConstFunction_t Dtor)
134
140
: m_DestructorCall(C), m_Kind(K), m_FD(Dtor) {}
135
141
@@ -164,20 +170,29 @@ class JitCall {
164
170
// self can go in the end and be nullptr by default; result can be a nullptr
165
171
// by default. These changes should be synchronized with the wrapper if we
166
172
// decide to directly.
167
- void Invoke (void * result, ArgList args = {}, void * self = nullptr ,
168
- size_t nary = 0UL ) const {
173
+ void Invoke (void * result, ArgList args = {}, void * self = nullptr ) const {
169
174
// NOLINTBEGIN(*-type-union-access)
170
- // Forward if we intended to call a dtor with only 1 parameter.
171
- if (m_Kind == kDestructorCall && result && !args.m_Args ) {
172
- InvokeDestructor (result, nary, /* withFree=*/ true );
173
- return ;
175
+ // Its possible the JitCall object deals with structor decls but went
176
+ // through Invoke
177
+ if (result && m_Kind != kGenericCall ) {
178
+ // Forward if we intended to call a dtor with only 1 parameter.
179
+ if (m_Kind == kDestructorCall && !args.m_Args ) {
180
+ InvokeDestructor (result, /* nary=*/ 0UL , /* withFree=*/ true );
181
+ return ;
182
+ }
183
+ // Forward if we intended to call a constructor (nary cannot be inferred,
184
+ // so we stick to constructing a single object)
185
+ if (m_Kind == kConstructorCall ) {
186
+ InvokeConstructor (result, /* nary=*/ 1UL , args, self);
187
+ return ;
188
+ }
174
189
}
175
190
176
191
#ifndef NDEBUG
177
192
assert (AreArgumentsValid (result, args, self) && " Invalid args!" );
178
193
ReportInvokeStart (result, args, self);
179
194
#endif // NDEBUG
180
- m_GenericCall (self, args.m_ArgSize , args.m_Args , result, nary );
195
+ m_GenericCall (self, args.m_ArgSize , args.m_Args , result);
181
196
// NOLINTEND(*-type-union-access)
182
197
}
183
198
// / Makes a call to a destructor.
@@ -195,6 +210,28 @@ class JitCall {
195
210
#endif // NDEBUG
196
211
m_DestructorCall (object, nary, withFree);
197
212
}
213
+
214
+ // / Makes a call to a constructor.
215
+ // /\param[in] result - the memory address at which we construct the object
216
+ // / (placement new).
217
+ // /\param[in] nary - Use array new if we have to construct an array of
218
+ // / objects (nary > 1).
219
+ // /\param[in] args - a pointer to a argument list and argument size.
220
+ // FIXME: Change the type of withFree from int to bool in the wrapper code.
221
+ void InvokeConstructor (void * result, unsigned long nary = 1 ,
222
+ ArgList args = {}, void * is_arena = nullptr ) const {
223
+ assert (m_Kind == kConstructorCall && " Wrong overload!" );
224
+ #ifndef NDEBUG
225
+ <<<<<<< Updated upstream
226
+ assert (AreArgumentsValid (result, args, nullptr , nary) && " Invalid args!" );
227
+ =======
228
+ assert (AreArgumentsValid (result, args, /* self=*/ nullptr , nary) &&
229
+ " Invalid args!" );
230
+ >>>>>>> Stashed changes
231
+ ReportInvokeStart (result, args, nullptr );
232
+ #endif // NDEBUG
233
+ m_ConstructorCall (result, nary, args.m_ArgSize , args.m_Args , is_arena);
234
+ }
198
235
};
199
236
200
237
// /\returns the version string information of the library.
0 commit comments