@@ -233,7 +233,22 @@ class GettablePropertyProjector : public ComponentProjector {
233
233
assert (getter->getConventions ().getNumSILArguments ());
234
234
235
235
auto ref = builder.createFunctionRef (loc, getter);
236
- builder.createApply (loc, ref, subs, {addr, parentValue});
236
+
237
+ std::vector<SILValue> args{addr, parentValue};
238
+ // FIXME(wasm): For wasm, KeyPath getter always take indices parameter
239
+ // to match callee and caller signature. So need to pass stub pointer.
240
+ // See also: getOrCreateKeyPathSetter and getOrCreateKeyPathGetter
241
+ if (builder.getASTContext ().LangOpts .Target .isOSBinFormatWasm ()) {
242
+ auto IntTy = SILType::getBuiltinIntegerType (32 , builder.getASTContext ());
243
+ auto UnsafeRawPointerTy = SILType::getRawPointerType (builder.getASTContext ());
244
+ auto zeroVal = SILValue (builder.createIntegerLiteral (loc, IntTy, 0 ));
245
+ auto stackBuffer = SILValue (builder.createAllocStack (loc, IntTy));
246
+ builder.createStore (loc, zeroVal, stackBuffer, StoreOwnershipQualifier::Unqualified);
247
+ auto nonePointer = builder.createUncheckedAddrCast (loc, stackBuffer, UnsafeRawPointerTy);
248
+ args.push_back (SILValue (nonePointer));
249
+ }
250
+
251
+ builder.createApply (loc, ref, subs, args);
237
252
238
253
// If we were previously accessing a class member, we're done now.
239
254
insertEndAccess (beginAccess, builder);
0 commit comments