@@ -237,7 +237,22 @@ class GettablePropertyProjector : public ComponentProjector {
237237 assert (getter->getArguments ().size () == 2 + target.isOSBinFormatWasm ());
238238
239239 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);
241256
242257 // If we were previously accessing a class member, we're done now.
243258 insertEndAccess (beginAccess, builder);
0 commit comments