[squeak-dev] The Trunk: Regex-Core-ul.52.mcz

Nicolas Cellier nicolas.cellier.aka.nice at gmail.com
Fri May 20 07:24:03 UTC 2016


+1

I presume copyChain is a bit more expensive than copy (I didn’t measure it
though). More expensive but allways correct.


If the inexpensive copy is used extensively, and my suggestion is a
performance killer, then let’s keep current solution: cleverly use
expensive copy exactly where we now we are going to need it. Otherwise, I
suggest renaming copyChain into copy, and hence have something much more
robust.

2016-05-20 1:03 GMT+02:00 <commits at source.squeak.org>:

> Levente Uzonyi uploaded a new version of Regex-Core to project The Trunk:
> http://source.squeak.org/trunk/Regex-Core-ul.52.mcz
>
> ==================== Summary ====================
>
> Name: Regex-Core-ul.52
> Author: ul
> Time: 20 May 2016, 1:02:48.025069 am
> UUID: 25d06172-cbd2-4454-a5e7-0dcfc27525b4
> Ancestors: Regex-Core-pre.51
>
> RxmLink changes:
> - implemented #copyChain, #copyUsing: and #postCopyUsing: to create a copy
> of the matcher chain without creating duplicates of links being referenced
> from more than one place
> - implemented missing #postCopy methods
> - removed unused variables from subclasses
>
> - use #copyChain instead of #veryDeepCopy in RxMatcher >>
> #makeQuantified:min:max: to avoid unnecessary duplication of non-link
> objects
>
> =============== Diff against Regex-Core-pre.51 ===============
>
> Item was changed:
>   ----- Method: RxMatcher>>makeQuantified:min:max: (in category 'private')
> -----
>   makeQuantified: anRxmLink min: min max: max
>         "Perform recursive poor-man's transformation of the {<min>,<max>}
> quantifiers."
>         | aMatcher |
>
>         "<atom>{,<max>}       ==>  (<atom>{1,<max>})?"
>         min = 0 ifTrue: [
>                 ^ self makeOptional: (self makeQuantified: anRxmLink min:
> 1 max: max) ].
>
>         "<atom>{<min>,}       ==>  <atom>{<min>-1, <min>-1}<atom>+"
>         max ifNil: [
> +               ^ (self makeQuantified: anRxmLink min: 1 max: min-1)
> pointTailTo: (self makePlus: anRxmLink copyChain) ].
> -               ^ (self makeQuantified: anRxmLink min: 1 max: min-1)
> pointTailTo: (self makePlus: anRxmLink veryDeepCopy) ].
>
>         "<atom>{<max>,<max>}  ==>  <atom><atom> ... <atom>"
>         min = max
>                 ifTrue: [
> +                       aMatcher := anRxmLink copyChain.
> +                       (min-1) timesRepeat: [ aMatcher pointTailTo:
> anRxmLink copyChain ].
> -                       aMatcher := anRxmLink veryDeepCopy.
> -                       (min-1) timesRepeat: [ aMatcher pointTailTo:
> anRxmLink veryDeepCopy ].
>                         ^ aMatcher ].
>
>         "<atom>{<min>,<max>}  ==>  <atom>{<min>,<min>}(<atom>{1,<max>-1})?"
> +       aMatcher := self makeOptional: anRxmLink copyChain.
> -       aMatcher := self makeOptional: anRxmLink veryDeepCopy.
>         (max - min - 1) timesRepeat: [
> +                aMatcher := self makeOptional: (anRxmLink copyChain
> pointTailTo: aMatcher) ].
> -                aMatcher := self makeOptional: (anRxmLink veryDeepCopy
> pointTailTo: aMatcher) ].
>         ^ (self makeQuantified: anRxmLink min: min max: min) pointTailTo:
> aMatcher!
>
> Item was added:
> + ----- Method: RxmBranch>>postCopyUsing: (in category 'copying') -----
> + postCopyUsing: anIdentityDictionary
> +
> +       super postCopyUsing: anIdentityDictionary.
> +       alternative ifNotNil: [
> +               alternative := alternative copyUsing: anIdentityDictionary
> ]!
>
> Item was added:
> + ----- Method: RxmLink>>copyChain (in category 'copying') -----
> + copyChain
> +       "Create a full copy of all the links in this chain, including
> branches, while letting them share and reuse non-link objects as much as
> possible."
> +
> +       ^self copyUsing: IdentityDictionary new!
>
> Item was added:
> + ----- Method: RxmLink>>copyUsing: (in category 'copying') -----
> + copyUsing: anIdentityDictionary
> +       "Copy the receiver if it's not present in the argument dictionary,
> or just return the previously made copy. The rest of the object graph will
> be copied by #postCopyUsing:."
> +
> +       ^anIdentityDictionary
> +               at: self
> +               ifAbsent: [
> +                       "It may be tempting to use #at:ifAbsentPut:
> instead, but the argument block must not modify the receiver, so that
> wouldn't work."
> +                       anIdentityDictionary
> +                               at: self
> +                               put: (self shallowCopy
> +                                       postCopyUsing:
> anIdentityDictionary;
> +                                       yourself) ]!
>
> Item was added:
> + ----- Method: RxmLink>>postCopyUsing: (in category 'copying') -----
> + postCopyUsing: anIdentityDictionary
> +       "Copy the rest of the chain the same way as it's done in
> #copyUsing:."
> +
> +       next ifNotNil: [
> +               next := next copyUsing: anIdentityDictionary ]!
>
> Item was changed:
>   RxmLink subclass: #RxmLookahead
> +       instanceVariableNames: 'lookahead'
> -       instanceVariableNames: 'lookahead positive'
>         classVariableNames: ''
>         poolDictionaries: ''
>         category: 'Regex-Core'!
>
>   !RxmLookahead commentStamp: '<historical>' prior: 0!
>   Instance holds onto a lookead which matches but does not consume
> anything.
>
>   Instance variables:
>         predicate               <RxmLink>!
>
> Item was removed:
> - ----- Method: RxmLookahead>>initialize (in category 'initialization')
> -----
> - initialize
> -       super initialize.
> -       positive := true.!
>
> Item was added:
> + ----- Method: RxmLookahead>>postCopy (in category 'copying') -----
> + postCopy
> +
> +       super postCopy.
> +       lookahead := lookahead copy!
>
> Item was added:
> + ----- Method: RxmLookahead>>postCopyUsing: (in category 'copying') -----
> + postCopyUsing: anIdentityDictionary
> +
> +       super postCopyUsing: anIdentityDictionary.
> +       lookahead := lookahead copyUsing: anIdentityDictionary!
>
> Item was changed:
>   RxmLink subclass: #RxmSubstring
> +       instanceVariableNames: 'sampleStream ignoreCase'
> -       instanceVariableNames: 'sampleStream caseSensitive ignoreCase'
>         classVariableNames: ''
>         poolDictionaries: ''
>         category: 'Regex-Core'!
>
>   !RxmSubstring commentStamp: 'Tbn 11/12/2010 23:14' prior: 0!
>   -- Regular Expression Matcher v 1.1 (C) 1996, 1999 Vassili Bykov
>   --
>   Instance holds onto a string and matches exactly this string, and
> exactly once.
>
>   Instance variables:
>         string  <String>!
>
> Item was added:
> + ----- Method: RxmSubstring>>postCopy (in category 'copying') -----
> + postCopy
> +
> +       super postCopy.
> +       sampleStream := sampleStream copy!
>
> Item was added:
> + ----- Method: RxmSubstring>>postCopyUsing: (in category 'copying') -----
> + postCopyUsing: anIdentityDictionary
> +
> +       super postCopyUsing: anIdentityDictionary.
> +       sampleStream := sampleStream copy!
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20160520/2045ff3f/attachment.htm


More information about the Squeak-dev mailing list