From 860592239db4ee4bf96fd91da610df35ab52216c Mon Sep 17 00:00:00 2001 From: Shai Almog <67850168+shai-almog@users.noreply.github.com> Date: Wed, 13 May 2026 19:08:57 +0300 Subject: [PATCH] iOS: drop stale thread-state arg from social-login set_field_* calls GoogleConnectImpl.m and FacebookImpl.m pass `CN1_THREAD_GET_STATE_PASS_ARG` (or `threadStateData`) as the first argument to `set_field_com_codename1_social_*` setters, but those ParparVM-generated instance-field setters take only `(value, instance)` -- the translator's `ByteCodeClass` emit comment even spells this out: "Instance field setters don't use thread context directly." The extra arg has been there since the GoogleSignIn 5.0 migration in 2020; older clang accepted it with a warning, but Xcode 26's clang now rejects it as `error: too many arguments to function call, expected 2, have 3`, breaking every Google sign-in iOS source build (and every Facebook one with NEW_CODENAME_ONE_VM). Also extends the ios-packaging CI to enable Google sign-in via `ios.gplus.clientId`, so GoogleConnectImpl.m is exercised under Xcode 26 on every PR -- the same class of signature drift would otherwise stay invisible until a customer turns the feature on. Co-Authored-By: Claude Opus 4.7 (1M context) --- .github/workflows/ios-packaging.yml | 7 ++++++- Ports/iOSPort/nativeSources/FacebookImpl.m | 4 ++-- .../iOSPort/nativeSources/GoogleConnectImpl.m | 20 +++++++++---------- 3 files changed, 18 insertions(+), 13 deletions(-) diff --git a/.github/workflows/ios-packaging.yml b/.github/workflows/ios-packaging.yml index 1db554a0e3..30df87c38e 100644 --- a/.github/workflows/ios-packaging.yml +++ b/.github/workflows/ios-packaging.yml @@ -41,13 +41,18 @@ jobs: timeout-minutes: 45 # Exercises both CocoaPods and SPM in a single Xcode project. Catches # regressions in either dependency manager (each pathway runs end to end) - # and additionally validates that they coexist correctly. + # and additionally validates that they coexist correctly. Also turns on + # Google sign-in so GoogleConnectImpl.m is compiled under Xcode -- catches + # signature drift between hand-written iOS port .m files and the + # ParparVM-generated `set_field_*` headers, which is otherwise invisible + # until a customer enables Google sign-in. env: IOS_DEPENDENCY_ARGS: >- -Dcodename1.arg.ios.dependencyManager=both -Dcodename1.arg.ios.pods=AFNetworking -Dcodename1.arg.ios.spm.packages=swift-collections|https://github.com/apple/swift-collections.git|from:1.1.0 -Dcodename1.arg.ios.spm.products.swift-collections=Collections + -Dcodename1.arg.ios.gplus.clientId=000000000000-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.apps.googleusercontent.com steps: - uses: actions/checkout@v4 diff --git a/Ports/iOSPort/nativeSources/FacebookImpl.m b/Ports/iOSPort/nativeSources/FacebookImpl.m index 2f5e5b765c..76685973da 100644 --- a/Ports/iOSPort/nativeSources/FacebookImpl.m +++ b/Ports/iOSPort/nativeSources/FacebookImpl.m @@ -64,14 +64,14 @@ void com_codename1_impl_ios_IOSNative_facebookLogin___java_lang_Object(CN1_THREA if (result.isCancelled) { // Handle cancellations #ifdef NEW_CODENAME_ONE_VM - set_field_com_codename1_social_FacebookImpl_loginCancelled(threadStateData, JAVA_TRUE, instance); + set_field_com_codename1_social_FacebookImpl_loginCancelled(JAVA_TRUE, instance); #else com_codename1_social_FacebookImpl* impl = (com_codename1_social_FacebookImpl*)instance; impl->fields.com_codename1_social_FacebookImpl.loginCancelled_ = TRUE; #endif } else { #ifdef NEW_CODENAME_ONE_VM - set_field_com_codename1_social_FacebookImpl_loginCompleted(threadStateData, JAVA_TRUE, instance); + set_field_com_codename1_social_FacebookImpl_loginCompleted(JAVA_TRUE, instance); #else com_codename1_social_FacebookImpl* impl = (com_codename1_social_FacebookImpl*)instance; #endif diff --git a/Ports/iOSPort/nativeSources/GoogleConnectImpl.m b/Ports/iOSPort/nativeSources/GoogleConnectImpl.m index 85e7eb840b..a29811d4f6 100644 --- a/Ports/iOSPort/nativeSources/GoogleConnectImpl.m +++ b/Ports/iOSPort/nativeSources/GoogleConnectImpl.m @@ -70,8 +70,8 @@ void com_codename1_impl_ios_IOSNative_googleLogin___java_lang_Object(CN1_THREAD_ JAVA_OBJECT d = com_codename1_ui_Display_getInstance__(CN1_THREAD_GET_STATE_PASS_SINGLE_ARG); JAVA_OBJECT jClientID = virtual_com_codename1_ui_Display_getProperty___java_lang_String_java_lang_String_R_java_lang_String(CN1_THREAD_STATE_PASS_ARG d, fromNSString(CN1_THREAD_STATE_PASS_ARG @"ios.gplus.clientId"), JAVA_NULL); if (jClientID == JAVA_NULL) { - set_field_com_codename1_social_GoogleImpl_loginMessage(CN1_THREAD_GET_STATE_PASS_ARG fromNSString(CN1_THREAD_GET_STATE_PASS_ARG @"Failed to log in due to a configuration error."), googleLoginCallback); - set_field_com_codename1_social_GoogleImpl_loginCompleted(CN1_THREAD_GET_STATE_PASS_ARG JAVA_TRUE, googleLoginCallback); + set_field_com_codename1_social_GoogleImpl_loginMessage(fromNSString(CN1_THREAD_GET_STATE_PASS_ARG @"Failed to log in due to a configuration error."), googleLoginCallback); + set_field_com_codename1_social_GoogleImpl_loginCompleted(JAVA_TRUE, googleLoginCallback); googleLoginCallback = NULL; CN1Log(@"Could not login to Google Plus because 'ios.gplus.clientId' property is not set. Ensure that the ios.gplus.clientId build hint is set"); return; @@ -88,8 +88,8 @@ void com_codename1_impl_ios_IOSNative_googleLogin___java_lang_Object(CN1_THREAD_ BOOL isGooglePlusInstalled = [[UIApplication sharedApplication] canOpenURL: [NSURL URLWithString:@"gplus://"]]; if (!isGooglePlusInstalled) { - set_field_com_codename1_social_GoogleImpl_loginMessage(CN1_THREAD_GET_STATE_PASS_ARG fromNSString(CN1_THREAD_GET_STATE_PASS_ARG @"Please install the Google Plus app on your device in order to log in with Google Plus."), googleLoginCallback); - set_field_com_codename1_social_GoogleImpl_loginCompleted(CN1_THREAD_GET_STATE_PASS_ARG JAVA_TRUE, googleLoginCallback); + set_field_com_codename1_social_GoogleImpl_loginMessage(fromNSString(CN1_THREAD_GET_STATE_PASS_ARG @"Please install the Google Plus app on your device in order to log in with Google Plus."), googleLoginCallback); + set_field_com_codename1_social_GoogleImpl_loginCompleted(JAVA_TRUE, googleLoginCallback); googleLoginCallback = NULL; CN1Log(@"Could not log into Google plus because the Google Plus app isn't installed and the ios.gplus.requireGplusAppForLogin property is set to true. This limitation is to work around Apple app store rejections caused by logging in with Safari"); return; @@ -127,11 +127,11 @@ void com_codename1_impl_ios_GoogleConnectImpl_finishedWithAuth(GTMOAuth2Authenti if (googleLoginCallback != NULL) { if (error != nil) { - set_field_com_codename1_social_GoogleImpl_loginMessage(CN1_THREAD_GET_STATE_PASS_ARG fromNSString(CN1_THREAD_GET_STATE_PASS_ARG [error localizedDescription]), googleLoginCallback); + set_field_com_codename1_social_GoogleImpl_loginMessage(fromNSString(CN1_THREAD_GET_STATE_PASS_ARG [error localizedDescription]), googleLoginCallback); } else { - set_field_com_codename1_social_GoogleImpl_loginMessage(CN1_THREAD_GET_STATE_PASS_ARG JAVA_NULL, googleLoginCallback); + set_field_com_codename1_social_GoogleImpl_loginMessage(JAVA_NULL, googleLoginCallback); } - set_field_com_codename1_social_GoogleImpl_loginCompleted(CN1_THREAD_GET_STATE_PASS_ARG JAVA_TRUE, googleLoginCallback); + set_field_com_codename1_social_GoogleImpl_loginCompleted(JAVA_TRUE, googleLoginCallback); googleLoginCallback = NULL; } @@ -152,11 +152,11 @@ void com_codename1_impl_ios_GoogleConnectImpl_finishedWithAuth(GIDGoogleUser *us if (googleLoginCallback != NULL) { if (error != nil) { - set_field_com_codename1_social_GoogleImpl_loginMessage(CN1_THREAD_GET_STATE_PASS_ARG fromNSString(CN1_THREAD_GET_STATE_PASS_ARG [error localizedDescription]), googleLoginCallback); + set_field_com_codename1_social_GoogleImpl_loginMessage(fromNSString(CN1_THREAD_GET_STATE_PASS_ARG [error localizedDescription]), googleLoginCallback); } else { - set_field_com_codename1_social_GoogleImpl_loginMessage(CN1_THREAD_GET_STATE_PASS_ARG JAVA_NULL, googleLoginCallback); + set_field_com_codename1_social_GoogleImpl_loginMessage(JAVA_NULL, googleLoginCallback); } - set_field_com_codename1_social_GoogleImpl_loginCompleted(CN1_THREAD_GET_STATE_PASS_ARG JAVA_TRUE, googleLoginCallback); + set_field_com_codename1_social_GoogleImpl_loginCompleted(JAVA_TRUE, googleLoginCallback); googleLoginCallback = NULL; }