Fix refcount leak to re.Pattern  when using Meta(pattern=...)
          #899
        
          
      
  Add this suggestion to a batch that can be applied as a single commit.
  This suggestion is invalid because no changes were made to the code.
  Suggestions cannot be applied while the pull request is closed.
  Suggestions cannot be applied while viewing a subset of changes.
  Only one suggestion per line can be applied in a batch.
  Add this suggestion to a batch that can be applied as a single commit.
  Applying suggestions on deleted lines is not supported.
  You must change the existing code in this line in order to create a valid suggestion.
  Outdated suggestions cannot be applied.
  This suggestion has been applied or marked resolved.
  Suggestions cannot be applied from pending reviews.
  Suggestions cannot be applied on multi-line comments.
  Suggestions cannot be applied while the pull request is queued to merge.
  Suggestion cannot be applied right now. Please check back later.
  
    
  
    
When using
msgspec.Meta(pattern="something"), msgspec creates a leaky reference to anre.Pattern, by increasing its reference count too many times.This is caused by the fact that it creates the
Patternobject with a call toPyObject_CallOneArg, which returns a new strong reference. Msgspec then add this to theMetaobject, during which the Pattern's refcount is increased again. Due to this, its refcount can never fall to 0, keeping it alive indefinitely.We can show this with a simple script:
this should print
False, since there should be no suchre.Patternobjects arounds anymore, but this is not the case.I have fixed this by foregoing the
SET_FIELDmacro, and instead simply assigning the field directly, without callingPy_XINCREFon its value.