validating core objects property keys on load

this should fix fuzz crashes caught from bad animation keys

Diffs=
8a538c243 validating core objects property keys on load (#7298)

Co-authored-by: Luigi Rosso <luigi-rosso@users.noreply.github.com>
diff --git a/.rive_head b/.rive_head
index 29b2afd..dd5879c 100644
--- a/.rive_head
+++ b/.rive_head
@@ -1 +1 @@
-cd6210f42d644de3cc1c83fa65b3d4e1f790cece
+8a538c243fcc5b72159388a7e63669f1e6998dda
diff --git a/dev/core_generator/lib/src/definition.dart b/dev/core_generator/lib/src/definition.dart
index eeac898..5a04630 100644
--- a/dev/core_generator/lib/src/definition.dart
+++ b/dev/core_generator/lib/src/definition.dart
@@ -557,6 +557,22 @@
     ctxCode.writeln('default:return false;');
     ctxCode.writeln('}}');
 
+    // static bool objectSupportsProperty(Core* object, uint32_t propertyKey) { return true; }
+    ctxCode.writeln('''
+      static bool objectSupportsProperty(Core* object, uint32_t propertyKey) {
+        switch(propertyKey) {''');
+    for (final fieldType in usedFieldTypes.keys) {
+      var properties = getSetFieldTypes[fieldType];
+      if (properties != null) {
+        for (final property in properties) {
+          ctxCode.writeln('case ${property.definition.name}Base'
+              '::${property.name}PropertyKey:');
+          ctxCode
+              .writeln('return object->is<${property.definition.name}Base>();');
+        }
+      }
+    }
+    ctxCode.writeln('}return false;}');
     ctxCode.writeln('};}');
 
     var output = generatedHppPath;
diff --git a/include/rive/generated/core_registry.hpp b/include/rive/generated/core_registry.hpp
index a0c8df9..c306c1f 100644
--- a/include/rive/generated/core_registry.hpp
+++ b/include/rive/generated/core_registry.hpp
@@ -2055,6 +2055,541 @@
                 return false;
         }
     }
+    static bool objectSupportsProperty(Core* object, uint32_t propertyKey)
+    {
+        switch (propertyKey)
+        {
+            case ComponentBase::namePropertyKey:
+                return object->is<ComponentBase>();
+            case AnimationBase::namePropertyKey:
+                return object->is<AnimationBase>();
+            case StateMachineComponentBase::namePropertyKey:
+                return object->is<StateMachineComponentBase>();
+            case KeyFrameStringBase::valuePropertyKey:
+                return object->is<KeyFrameStringBase>();
+            case OpenUrlEventBase::urlPropertyKey:
+                return object->is<OpenUrlEventBase>();
+            case TextValueRunBase::textPropertyKey:
+                return object->is<TextValueRunBase>();
+            case CustomPropertyStringBase::propertyValuePropertyKey:
+                return object->is<CustomPropertyStringBase>();
+            case AssetBase::namePropertyKey:
+                return object->is<AssetBase>();
+            case FileAssetBase::cdnBaseUrlPropertyKey:
+                return object->is<FileAssetBase>();
+            case ComponentBase::parentIdPropertyKey:
+                return object->is<ComponentBase>();
+            case DrawTargetBase::drawableIdPropertyKey:
+                return object->is<DrawTargetBase>();
+            case DrawTargetBase::placementValuePropertyKey:
+                return object->is<DrawTargetBase>();
+            case TargetedConstraintBase::targetIdPropertyKey:
+                return object->is<TargetedConstraintBase>();
+            case DistanceConstraintBase::modeValuePropertyKey:
+                return object->is<DistanceConstraintBase>();
+            case TransformSpaceConstraintBase::sourceSpaceValuePropertyKey:
+                return object->is<TransformSpaceConstraintBase>();
+            case TransformSpaceConstraintBase::destSpaceValuePropertyKey:
+                return object->is<TransformSpaceConstraintBase>();
+            case TransformComponentConstraintBase::minMaxSpaceValuePropertyKey:
+                return object->is<TransformComponentConstraintBase>();
+            case IKConstraintBase::parentBoneCountPropertyKey:
+                return object->is<IKConstraintBase>();
+            case DrawableBase::blendModeValuePropertyKey:
+                return object->is<DrawableBase>();
+            case DrawableBase::drawableFlagsPropertyKey:
+                return object->is<DrawableBase>();
+            case NestedArtboardBase::artboardIdPropertyKey:
+                return object->is<NestedArtboardBase>();
+            case NestedAnimationBase::animationIdPropertyKey:
+                return object->is<NestedAnimationBase>();
+            case SoloBase::activeComponentIdPropertyKey:
+                return object->is<SoloBase>();
+            case ListenerFireEventBase::eventIdPropertyKey:
+                return object->is<ListenerFireEventBase>();
+            case LayerStateBase::flagsPropertyKey:
+                return object->is<LayerStateBase>();
+            case ListenerInputChangeBase::inputIdPropertyKey:
+                return object->is<ListenerInputChangeBase>();
+            case ListenerInputChangeBase::nestedInputIdPropertyKey:
+                return object->is<ListenerInputChangeBase>();
+            case AnimationStateBase::animationIdPropertyKey:
+                return object->is<AnimationStateBase>();
+            case NestedInputBase::inputIdPropertyKey:
+                return object->is<NestedInputBase>();
+            case KeyedObjectBase::objectIdPropertyKey:
+                return object->is<KeyedObjectBase>();
+            case BlendAnimationBase::animationIdPropertyKey:
+                return object->is<BlendAnimationBase>();
+            case BlendAnimationDirectBase::inputIdPropertyKey:
+                return object->is<BlendAnimationDirectBase>();
+            case BlendAnimationDirectBase::blendSourcePropertyKey:
+                return object->is<BlendAnimationDirectBase>();
+            case TransitionConditionBase::inputIdPropertyKey:
+                return object->is<TransitionConditionBase>();
+            case KeyedPropertyBase::propertyKeyPropertyKey:
+                return object->is<KeyedPropertyBase>();
+            case StateMachineListenerBase::targetIdPropertyKey:
+                return object->is<StateMachineListenerBase>();
+            case StateMachineListenerBase::listenerTypeValuePropertyKey:
+                return object->is<StateMachineListenerBase>();
+            case StateMachineListenerBase::eventIdPropertyKey:
+                return object->is<StateMachineListenerBase>();
+            case KeyFrameBase::framePropertyKey:
+                return object->is<KeyFrameBase>();
+            case InterpolatingKeyFrameBase::interpolationTypePropertyKey:
+                return object->is<InterpolatingKeyFrameBase>();
+            case InterpolatingKeyFrameBase::interpolatorIdPropertyKey:
+                return object->is<InterpolatingKeyFrameBase>();
+            case KeyFrameIdBase::valuePropertyKey:
+                return object->is<KeyFrameIdBase>();
+            case ListenerBoolChangeBase::valuePropertyKey:
+                return object->is<ListenerBoolChangeBase>();
+            case ListenerAlignTargetBase::targetIdPropertyKey:
+                return object->is<ListenerAlignTargetBase>();
+            case TransitionValueConditionBase::opValuePropertyKey:
+                return object->is<TransitionValueConditionBase>();
+            case StateTransitionBase::stateToIdPropertyKey:
+                return object->is<StateTransitionBase>();
+            case StateTransitionBase::flagsPropertyKey:
+                return object->is<StateTransitionBase>();
+            case StateTransitionBase::durationPropertyKey:
+                return object->is<StateTransitionBase>();
+            case StateTransitionBase::exitTimePropertyKey:
+                return object->is<StateTransitionBase>();
+            case StateTransitionBase::interpolationTypePropertyKey:
+                return object->is<StateTransitionBase>();
+            case StateTransitionBase::interpolatorIdPropertyKey:
+                return object->is<StateTransitionBase>();
+            case StateTransitionBase::randomWeightPropertyKey:
+                return object->is<StateTransitionBase>();
+            case StateMachineFireEventBase::eventIdPropertyKey:
+                return object->is<StateMachineFireEventBase>();
+            case StateMachineFireEventBase::occursValuePropertyKey:
+                return object->is<StateMachineFireEventBase>();
+            case LinearAnimationBase::fpsPropertyKey:
+                return object->is<LinearAnimationBase>();
+            case LinearAnimationBase::durationPropertyKey:
+                return object->is<LinearAnimationBase>();
+            case LinearAnimationBase::loopValuePropertyKey:
+                return object->is<LinearAnimationBase>();
+            case LinearAnimationBase::workStartPropertyKey:
+                return object->is<LinearAnimationBase>();
+            case LinearAnimationBase::workEndPropertyKey:
+                return object->is<LinearAnimationBase>();
+            case ElasticInterpolatorBase::easingValuePropertyKey:
+                return object->is<ElasticInterpolatorBase>();
+            case BlendState1DBase::inputIdPropertyKey:
+                return object->is<BlendState1DBase>();
+            case BlendStateTransitionBase::exitBlendAnimationIdPropertyKey:
+                return object->is<BlendStateTransitionBase>();
+            case StrokeBase::capPropertyKey:
+                return object->is<StrokeBase>();
+            case StrokeBase::joinPropertyKey:
+                return object->is<StrokeBase>();
+            case TrimPathBase::modeValuePropertyKey:
+                return object->is<TrimPathBase>();
+            case FillBase::fillRulePropertyKey:
+                return object->is<FillBase>();
+            case PathBase::pathFlagsPropertyKey:
+                return object->is<PathBase>();
+            case ClippingShapeBase::sourceIdPropertyKey:
+                return object->is<ClippingShapeBase>();
+            case ClippingShapeBase::fillRulePropertyKey:
+                return object->is<ClippingShapeBase>();
+            case PolygonBase::pointsPropertyKey:
+                return object->is<PolygonBase>();
+            case ImageBase::assetIdPropertyKey:
+                return object->is<ImageBase>();
+            case DrawRulesBase::drawTargetIdPropertyKey:
+                return object->is<DrawRulesBase>();
+            case ArtboardBase::defaultStateMachineIdPropertyKey:
+                return object->is<ArtboardBase>();
+            case JoystickBase::xIdPropertyKey:
+                return object->is<JoystickBase>();
+            case JoystickBase::yIdPropertyKey:
+                return object->is<JoystickBase>();
+            case JoystickBase::joystickFlagsPropertyKey:
+                return object->is<JoystickBase>();
+            case JoystickBase::handleSourceIdPropertyKey:
+                return object->is<JoystickBase>();
+            case OpenUrlEventBase::targetValuePropertyKey:
+                return object->is<OpenUrlEventBase>();
+            case WeightBase::valuesPropertyKey:
+                return object->is<WeightBase>();
+            case WeightBase::indicesPropertyKey:
+                return object->is<WeightBase>();
+            case TendonBase::boneIdPropertyKey:
+                return object->is<TendonBase>();
+            case CubicWeightBase::inValuesPropertyKey:
+                return object->is<CubicWeightBase>();
+            case CubicWeightBase::inIndicesPropertyKey:
+                return object->is<CubicWeightBase>();
+            case CubicWeightBase::outValuesPropertyKey:
+                return object->is<CubicWeightBase>();
+            case CubicWeightBase::outIndicesPropertyKey:
+                return object->is<CubicWeightBase>();
+            case TextModifierRangeBase::unitsValuePropertyKey:
+                return object->is<TextModifierRangeBase>();
+            case TextModifierRangeBase::typeValuePropertyKey:
+                return object->is<TextModifierRangeBase>();
+            case TextModifierRangeBase::modeValuePropertyKey:
+                return object->is<TextModifierRangeBase>();
+            case TextModifierRangeBase::runIdPropertyKey:
+                return object->is<TextModifierRangeBase>();
+            case TextStyleFeatureBase::tagPropertyKey:
+                return object->is<TextStyleFeatureBase>();
+            case TextStyleFeatureBase::featureValuePropertyKey:
+                return object->is<TextStyleFeatureBase>();
+            case TextVariationModifierBase::axisTagPropertyKey:
+                return object->is<TextVariationModifierBase>();
+            case TextModifierGroupBase::modifierFlagsPropertyKey:
+                return object->is<TextModifierGroupBase>();
+            case TextStyleBase::fontAssetIdPropertyKey:
+                return object->is<TextStyleBase>();
+            case TextStyleAxisBase::tagPropertyKey:
+                return object->is<TextStyleAxisBase>();
+            case TextBase::alignValuePropertyKey:
+                return object->is<TextBase>();
+            case TextBase::sizingValuePropertyKey:
+                return object->is<TextBase>();
+            case TextBase::overflowValuePropertyKey:
+                return object->is<TextBase>();
+            case TextBase::originValuePropertyKey:
+                return object->is<TextBase>();
+            case TextValueRunBase::styleIdPropertyKey:
+                return object->is<TextValueRunBase>();
+            case FileAssetBase::assetIdPropertyKey:
+                return object->is<FileAssetBase>();
+            case AudioEventBase::assetIdPropertyKey:
+                return object->is<AudioEventBase>();
+            case CustomPropertyNumberBase::propertyValuePropertyKey:
+                return object->is<CustomPropertyNumberBase>();
+            case ConstraintBase::strengthPropertyKey:
+                return object->is<ConstraintBase>();
+            case DistanceConstraintBase::distancePropertyKey:
+                return object->is<DistanceConstraintBase>();
+            case TransformComponentConstraintBase::copyFactorPropertyKey:
+                return object->is<TransformComponentConstraintBase>();
+            case TransformComponentConstraintBase::minValuePropertyKey:
+                return object->is<TransformComponentConstraintBase>();
+            case TransformComponentConstraintBase::maxValuePropertyKey:
+                return object->is<TransformComponentConstraintBase>();
+            case TransformComponentConstraintYBase::copyFactorYPropertyKey:
+                return object->is<TransformComponentConstraintYBase>();
+            case TransformComponentConstraintYBase::minValueYPropertyKey:
+                return object->is<TransformComponentConstraintYBase>();
+            case TransformComponentConstraintYBase::maxValueYPropertyKey:
+                return object->is<TransformComponentConstraintYBase>();
+            case FollowPathConstraintBase::distancePropertyKey:
+                return object->is<FollowPathConstraintBase>();
+            case TransformConstraintBase::originXPropertyKey:
+                return object->is<TransformConstraintBase>();
+            case TransformConstraintBase::originYPropertyKey:
+                return object->is<TransformConstraintBase>();
+            case WorldTransformComponentBase::opacityPropertyKey:
+                return object->is<WorldTransformComponentBase>();
+            case TransformComponentBase::rotationPropertyKey:
+                return object->is<TransformComponentBase>();
+            case TransformComponentBase::scaleXPropertyKey:
+                return object->is<TransformComponentBase>();
+            case TransformComponentBase::scaleYPropertyKey:
+                return object->is<TransformComponentBase>();
+            case NodeBase::xPropertyKey:
+                return object->is<NodeBase>();
+            case NodeBase::yPropertyKey:
+                return object->is<NodeBase>();
+            case NestedLinearAnimationBase::mixPropertyKey:
+                return object->is<NestedLinearAnimationBase>();
+            case NestedSimpleAnimationBase::speedPropertyKey:
+                return object->is<NestedSimpleAnimationBase>();
+            case AdvanceableStateBase::speedPropertyKey:
+                return object->is<AdvanceableStateBase>();
+            case BlendAnimationDirectBase::mixValuePropertyKey:
+                return object->is<BlendAnimationDirectBase>();
+            case StateMachineNumberBase::valuePropertyKey:
+                return object->is<StateMachineNumberBase>();
+            case CubicInterpolatorBase::x1PropertyKey:
+                return object->is<CubicInterpolatorBase>();
+            case CubicInterpolatorBase::y1PropertyKey:
+                return object->is<CubicInterpolatorBase>();
+            case CubicInterpolatorBase::x2PropertyKey:
+                return object->is<CubicInterpolatorBase>();
+            case CubicInterpolatorBase::y2PropertyKey:
+                return object->is<CubicInterpolatorBase>();
+            case TransitionNumberConditionBase::valuePropertyKey:
+                return object->is<TransitionNumberConditionBase>();
+            case CubicInterpolatorComponentBase::x1PropertyKey:
+                return object->is<CubicInterpolatorComponentBase>();
+            case CubicInterpolatorComponentBase::y1PropertyKey:
+                return object->is<CubicInterpolatorComponentBase>();
+            case CubicInterpolatorComponentBase::x2PropertyKey:
+                return object->is<CubicInterpolatorComponentBase>();
+            case CubicInterpolatorComponentBase::y2PropertyKey:
+                return object->is<CubicInterpolatorComponentBase>();
+            case ListenerNumberChangeBase::valuePropertyKey:
+                return object->is<ListenerNumberChangeBase>();
+            case KeyFrameDoubleBase::valuePropertyKey:
+                return object->is<KeyFrameDoubleBase>();
+            case LinearAnimationBase::speedPropertyKey:
+                return object->is<LinearAnimationBase>();
+            case ElasticInterpolatorBase::amplitudePropertyKey:
+                return object->is<ElasticInterpolatorBase>();
+            case ElasticInterpolatorBase::periodPropertyKey:
+                return object->is<ElasticInterpolatorBase>();
+            case NestedNumberBase::nestedValuePropertyKey:
+                return object->is<NestedNumberBase>();
+            case NestedRemapAnimationBase::timePropertyKey:
+                return object->is<NestedRemapAnimationBase>();
+            case BlendAnimation1DBase::valuePropertyKey:
+                return object->is<BlendAnimation1DBase>();
+            case LinearGradientBase::startXPropertyKey:
+                return object->is<LinearGradientBase>();
+            case LinearGradientBase::startYPropertyKey:
+                return object->is<LinearGradientBase>();
+            case LinearGradientBase::endXPropertyKey:
+                return object->is<LinearGradientBase>();
+            case LinearGradientBase::endYPropertyKey:
+                return object->is<LinearGradientBase>();
+            case LinearGradientBase::opacityPropertyKey:
+                return object->is<LinearGradientBase>();
+            case StrokeBase::thicknessPropertyKey:
+                return object->is<StrokeBase>();
+            case GradientStopBase::positionPropertyKey:
+                return object->is<GradientStopBase>();
+            case TrimPathBase::startPropertyKey:
+                return object->is<TrimPathBase>();
+            case TrimPathBase::endPropertyKey:
+                return object->is<TrimPathBase>();
+            case TrimPathBase::offsetPropertyKey:
+                return object->is<TrimPathBase>();
+            case VertexBase::xPropertyKey:
+                return object->is<VertexBase>();
+            case VertexBase::yPropertyKey:
+                return object->is<VertexBase>();
+            case MeshVertexBase::uPropertyKey:
+                return object->is<MeshVertexBase>();
+            case MeshVertexBase::vPropertyKey:
+                return object->is<MeshVertexBase>();
+            case StraightVertexBase::radiusPropertyKey:
+                return object->is<StraightVertexBase>();
+            case CubicAsymmetricVertexBase::rotationPropertyKey:
+                return object->is<CubicAsymmetricVertexBase>();
+            case CubicAsymmetricVertexBase::inDistancePropertyKey:
+                return object->is<CubicAsymmetricVertexBase>();
+            case CubicAsymmetricVertexBase::outDistancePropertyKey:
+                return object->is<CubicAsymmetricVertexBase>();
+            case ParametricPathBase::widthPropertyKey:
+                return object->is<ParametricPathBase>();
+            case ParametricPathBase::heightPropertyKey:
+                return object->is<ParametricPathBase>();
+            case ParametricPathBase::originXPropertyKey:
+                return object->is<ParametricPathBase>();
+            case ParametricPathBase::originYPropertyKey:
+                return object->is<ParametricPathBase>();
+            case RectangleBase::cornerRadiusTLPropertyKey:
+                return object->is<RectangleBase>();
+            case RectangleBase::cornerRadiusTRPropertyKey:
+                return object->is<RectangleBase>();
+            case RectangleBase::cornerRadiusBLPropertyKey:
+                return object->is<RectangleBase>();
+            case RectangleBase::cornerRadiusBRPropertyKey:
+                return object->is<RectangleBase>();
+            case CubicMirroredVertexBase::rotationPropertyKey:
+                return object->is<CubicMirroredVertexBase>();
+            case CubicMirroredVertexBase::distancePropertyKey:
+                return object->is<CubicMirroredVertexBase>();
+            case PolygonBase::cornerRadiusPropertyKey:
+                return object->is<PolygonBase>();
+            case StarBase::innerRadiusPropertyKey:
+                return object->is<StarBase>();
+            case ImageBase::originXPropertyKey:
+                return object->is<ImageBase>();
+            case ImageBase::originYPropertyKey:
+                return object->is<ImageBase>();
+            case CubicDetachedVertexBase::inRotationPropertyKey:
+                return object->is<CubicDetachedVertexBase>();
+            case CubicDetachedVertexBase::inDistancePropertyKey:
+                return object->is<CubicDetachedVertexBase>();
+            case CubicDetachedVertexBase::outRotationPropertyKey:
+                return object->is<CubicDetachedVertexBase>();
+            case CubicDetachedVertexBase::outDistancePropertyKey:
+                return object->is<CubicDetachedVertexBase>();
+            case ArtboardBase::widthPropertyKey:
+                return object->is<ArtboardBase>();
+            case ArtboardBase::heightPropertyKey:
+                return object->is<ArtboardBase>();
+            case ArtboardBase::xPropertyKey:
+                return object->is<ArtboardBase>();
+            case ArtboardBase::yPropertyKey:
+                return object->is<ArtboardBase>();
+            case ArtboardBase::originXPropertyKey:
+                return object->is<ArtboardBase>();
+            case ArtboardBase::originYPropertyKey:
+                return object->is<ArtboardBase>();
+            case JoystickBase::xPropertyKey:
+                return object->is<JoystickBase>();
+            case JoystickBase::yPropertyKey:
+                return object->is<JoystickBase>();
+            case JoystickBase::posXPropertyKey:
+                return object->is<JoystickBase>();
+            case JoystickBase::posYPropertyKey:
+                return object->is<JoystickBase>();
+            case JoystickBase::originXPropertyKey:
+                return object->is<JoystickBase>();
+            case JoystickBase::originYPropertyKey:
+                return object->is<JoystickBase>();
+            case JoystickBase::widthPropertyKey:
+                return object->is<JoystickBase>();
+            case JoystickBase::heightPropertyKey:
+                return object->is<JoystickBase>();
+            case BoneBase::lengthPropertyKey:
+                return object->is<BoneBase>();
+            case RootBoneBase::xPropertyKey:
+                return object->is<RootBoneBase>();
+            case RootBoneBase::yPropertyKey:
+                return object->is<RootBoneBase>();
+            case SkinBase::xxPropertyKey:
+                return object->is<SkinBase>();
+            case SkinBase::yxPropertyKey:
+                return object->is<SkinBase>();
+            case SkinBase::xyPropertyKey:
+                return object->is<SkinBase>();
+            case SkinBase::yyPropertyKey:
+                return object->is<SkinBase>();
+            case SkinBase::txPropertyKey:
+                return object->is<SkinBase>();
+            case SkinBase::tyPropertyKey:
+                return object->is<SkinBase>();
+            case TendonBase::xxPropertyKey:
+                return object->is<TendonBase>();
+            case TendonBase::yxPropertyKey:
+                return object->is<TendonBase>();
+            case TendonBase::xyPropertyKey:
+                return object->is<TendonBase>();
+            case TendonBase::yyPropertyKey:
+                return object->is<TendonBase>();
+            case TendonBase::txPropertyKey:
+                return object->is<TendonBase>();
+            case TendonBase::tyPropertyKey:
+                return object->is<TendonBase>();
+            case TextModifierRangeBase::modifyFromPropertyKey:
+                return object->is<TextModifierRangeBase>();
+            case TextModifierRangeBase::modifyToPropertyKey:
+                return object->is<TextModifierRangeBase>();
+            case TextModifierRangeBase::strengthPropertyKey:
+                return object->is<TextModifierRangeBase>();
+            case TextModifierRangeBase::falloffFromPropertyKey:
+                return object->is<TextModifierRangeBase>();
+            case TextModifierRangeBase::falloffToPropertyKey:
+                return object->is<TextModifierRangeBase>();
+            case TextModifierRangeBase::offsetPropertyKey:
+                return object->is<TextModifierRangeBase>();
+            case TextVariationModifierBase::axisValuePropertyKey:
+                return object->is<TextVariationModifierBase>();
+            case TextModifierGroupBase::originXPropertyKey:
+                return object->is<TextModifierGroupBase>();
+            case TextModifierGroupBase::originYPropertyKey:
+                return object->is<TextModifierGroupBase>();
+            case TextModifierGroupBase::opacityPropertyKey:
+                return object->is<TextModifierGroupBase>();
+            case TextModifierGroupBase::xPropertyKey:
+                return object->is<TextModifierGroupBase>();
+            case TextModifierGroupBase::yPropertyKey:
+                return object->is<TextModifierGroupBase>();
+            case TextModifierGroupBase::rotationPropertyKey:
+                return object->is<TextModifierGroupBase>();
+            case TextModifierGroupBase::scaleXPropertyKey:
+                return object->is<TextModifierGroupBase>();
+            case TextModifierGroupBase::scaleYPropertyKey:
+                return object->is<TextModifierGroupBase>();
+            case TextStyleBase::fontSizePropertyKey:
+                return object->is<TextStyleBase>();
+            case TextStyleBase::lineHeightPropertyKey:
+                return object->is<TextStyleBase>();
+            case TextStyleBase::letterSpacingPropertyKey:
+                return object->is<TextStyleBase>();
+            case TextStyleAxisBase::axisValuePropertyKey:
+                return object->is<TextStyleAxisBase>();
+            case TextBase::widthPropertyKey:
+                return object->is<TextBase>();
+            case TextBase::heightPropertyKey:
+                return object->is<TextBase>();
+            case TextBase::originXPropertyKey:
+                return object->is<TextBase>();
+            case TextBase::originYPropertyKey:
+                return object->is<TextBase>();
+            case TextBase::paragraphSpacingPropertyKey:
+                return object->is<TextBase>();
+            case DrawableAssetBase::heightPropertyKey:
+                return object->is<DrawableAssetBase>();
+            case DrawableAssetBase::widthPropertyKey:
+                return object->is<DrawableAssetBase>();
+            case ExportAudioBase::volumePropertyKey:
+                return object->is<ExportAudioBase>();
+            case TransformComponentConstraintBase::offsetPropertyKey:
+                return object->is<TransformComponentConstraintBase>();
+            case TransformComponentConstraintBase::doesCopyPropertyKey:
+                return object->is<TransformComponentConstraintBase>();
+            case TransformComponentConstraintBase::minPropertyKey:
+                return object->is<TransformComponentConstraintBase>();
+            case TransformComponentConstraintBase::maxPropertyKey:
+                return object->is<TransformComponentConstraintBase>();
+            case TransformComponentConstraintYBase::doesCopyYPropertyKey:
+                return object->is<TransformComponentConstraintYBase>();
+            case TransformComponentConstraintYBase::minYPropertyKey:
+                return object->is<TransformComponentConstraintYBase>();
+            case TransformComponentConstraintYBase::maxYPropertyKey:
+                return object->is<TransformComponentConstraintYBase>();
+            case IKConstraintBase::invertDirectionPropertyKey:
+                return object->is<IKConstraintBase>();
+            case FollowPathConstraintBase::orientPropertyKey:
+                return object->is<FollowPathConstraintBase>();
+            case FollowPathConstraintBase::offsetPropertyKey:
+                return object->is<FollowPathConstraintBase>();
+            case NestedSimpleAnimationBase::isPlayingPropertyKey:
+                return object->is<NestedSimpleAnimationBase>();
+            case KeyFrameBoolBase::valuePropertyKey:
+                return object->is<KeyFrameBoolBase>();
+            case ListenerAlignTargetBase::preserveOffsetPropertyKey:
+                return object->is<ListenerAlignTargetBase>();
+            case NestedBoolBase::nestedValuePropertyKey:
+                return object->is<NestedBoolBase>();
+            case LinearAnimationBase::enableWorkAreaPropertyKey:
+                return object->is<LinearAnimationBase>();
+            case LinearAnimationBase::quantizePropertyKey:
+                return object->is<LinearAnimationBase>();
+            case StateMachineBoolBase::valuePropertyKey:
+                return object->is<StateMachineBoolBase>();
+            case ShapePaintBase::isVisiblePropertyKey:
+                return object->is<ShapePaintBase>();
+            case StrokeBase::transformAffectsStrokePropertyKey:
+                return object->is<StrokeBase>();
+            case PointsPathBase::isClosedPropertyKey:
+                return object->is<PointsPathBase>();
+            case RectangleBase::linkCornerRadiusPropertyKey:
+                return object->is<RectangleBase>();
+            case ClippingShapeBase::isVisiblePropertyKey:
+                return object->is<ClippingShapeBase>();
+            case CustomPropertyBooleanBase::propertyValuePropertyKey:
+                return object->is<CustomPropertyBooleanBase>();
+            case ArtboardBase::clipPropertyKey:
+                return object->is<ArtboardBase>();
+            case TextModifierRangeBase::clampPropertyKey:
+                return object->is<TextModifierRangeBase>();
+            case NestedTriggerBase::firePropertyKey:
+                return object->is<NestedTriggerBase>();
+            case EventBase::triggerPropertyKey:
+                return object->is<EventBase>();
+            case KeyFrameColorBase::valuePropertyKey:
+                return object->is<KeyFrameColorBase>();
+            case SolidColorBase::colorValuePropertyKey:
+                return object->is<SolidColorBase>();
+            case GradientStopBase::colorValuePropertyKey:
+                return object->is<GradientStopBase>();
+        }
+        return false;
+    }
 };
 } // namespace rive
 
diff --git a/src/animation/keyed_object.cpp b/src/animation/keyed_object.cpp
index 3666199..bb54f88 100644
--- a/src/animation/keyed_object.cpp
+++ b/src/animation/keyed_object.cpp
@@ -18,13 +18,19 @@
 StatusCode KeyedObject::onAddedDirty(CoreContext* context)
 {
     // Make sure we're keying a valid object.
-    if (context->resolve(objectId()) == nullptr)
+    Core* coreObject = context->resolve(objectId());
+    if (coreObject == nullptr)
     {
         return StatusCode::MissingObject;
     }
 
     for (auto& property : m_keyedProperties)
     {
+        // Validate coreObject supports propertyKey
+        if (!CoreRegistry::objectSupportsProperty(coreObject, property->propertyKey()))
+        {
+            return StatusCode::InvalidObject;
+        }
         StatusCode code;
         if ((code = property->onAddedDirty(context)) != StatusCode::Ok)
         {