@@ -390,9 +390,12 @@ class NativeApiSuperHostObject final : public HostObject {
390390 const auto & members = bridge_->membersForClass (*symbol);
391391 if (const NativeApiMember* propertyMember =
392392 selectPropertyMember (members, property, false )) {
393- return callObjCSelector (runtime, bridge_, receiver_, false ,
394- propertyMember->selectorName , propertyMember,
395- nullptr , 0 , dispatchClass_);
393+ SEL selector = sel_getUid (propertyMember->selectorName .c_str ());
394+ if (class_getInstanceMethod (dispatchClass_, selector) != nullptr ) {
395+ return callObjCSelector (runtime, bridge_, receiver_, false ,
396+ propertyMember->selectorName , propertyMember,
397+ nullptr , 0 , dispatchClass_);
398+ }
396399 }
397400
398401 if (selectMethodMember (members, property, false , 0 ) != nullptr ) {
@@ -845,12 +848,21 @@ class NativeApiObjectHostObject final
845848 if (const NativeApiMember* propertyMember =
846849 selectPropertyMember (members, property, false )) {
847850 SEL selector = sel_getUid (propertyMember->selectorName .c_str ());
848- if (class_getInstanceMethod (object_getClass (object_), selector) ==
849- nullptr ) {
850- return Value::undefined ();
851+ if ([object_ respondsToSelector:selector]) {
852+ return callObjectSelector (runtime, propertyMember->selectorName ,
853+ propertyMember, nullptr , 0 );
854+ }
855+ std::string booleanSelectorName =
856+ booleanGetterSelectorForProperty (property);
857+ if (booleanSelectorName != propertyMember->selectorName ) {
858+ SEL booleanSelector = sel_getUid (booleanSelectorName.c_str ());
859+ if ([object_ respondsToSelector:booleanSelector]) {
860+ NativeApiMember getterMember = *propertyMember;
861+ getterMember.selectorName = booleanSelectorName;
862+ return callObjectSelector (runtime, getterMember.selectorName ,
863+ &getterMember, nullptr , 0 );
864+ }
851865 }
852- return callObjectSelector (runtime, propertyMember->selectorName ,
853- propertyMember, nullptr , 0 );
854866 }
855867
856868 if (selectMethodMember (members, property, false , 0 ) != nullptr ) {
@@ -958,7 +970,7 @@ class NativeApiObjectHostObject final
958970
959971 std::string setterSelectorName = setterSelectorForProperty (property);
960972 SEL selector = sel_getUid (setterSelectorName.c_str ());
961- if (class_getInstanceMethod ( object_getClass ( object_), selector) != nullptr ) {
973+ if ([ object_ respondsToSelector: selector] ) {
962974 Value args[] = {Value (runtime, value)};
963975 callObjCSelector (runtime, bridge_, object_, false , setterSelectorName,
964976 nullptr , args, 1 );
@@ -1163,12 +1175,11 @@ class NativeApiClassHostObject final : public HostObject {
11631175 runtime, " Objective-C class is not available: " + symbol.name );
11641176 }
11651177 SEL selector = sel_getUid (propertyMember->selectorName .c_str ());
1166- if (class_getClassMethod (cls, selector) == nullptr ) {
1167- return Value::undefined ();
1178+ if (class_getClassMethod (cls, selector) != nullptr ) {
1179+ return callObjCSelector (runtime, bridge, static_cast <id>(cls), true ,
1180+ propertyMember->selectorName , propertyMember,
1181+ nullptr , 0 );
11681182 }
1169- return callObjCSelector (runtime, bridge, static_cast <id>(cls), true ,
1170- propertyMember->selectorName , propertyMember,
1171- nullptr , 0 );
11721183 }
11731184
11741185 if (selectMethodMember (members, property, true , 0 ) != nullptr ) {
0 commit comments