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