@@ -668,6 +668,35 @@ function getTypeId(typname, norecursion) {
668668 return - 1 ;
669669}
670670
671+ /** @summary Create streamer info for pair object
672+ * @private */
673+ function createPairStreamer ( typename , file ) {
674+ let si = file . findStreamerInfo ( typename ) ;
675+ if ( si )
676+ return si ;
677+ let p1 = typename . indexOf ( '<' ) ;
678+ const p2 = typename . lastIndexOf ( '>' ) ;
679+ function getNextName ( ) {
680+ let res = '' , p = p1 + 1 , cnt = 0 ;
681+ while ( ( p < p2 ) && ( cnt >= 0 ) ) {
682+ switch ( typename [ p ] ) {
683+ case '<' : cnt ++ ; break ;
684+ case ',' : if ( cnt === 0 ) cnt -- ; break ;
685+ case '>' : cnt -- ; break ;
686+ }
687+ if ( cnt >= 0 ) res += typename [ p ] ;
688+ p ++ ;
689+ }
690+ p1 = p - 1 ;
691+ return res . trim ( ) ;
692+ }
693+ si = { _typename : 'TStreamerInfo' , fClassVersion : 0 , fName : typename , fElements : create ( clTList ) } ;
694+ si . fElements . Add ( createStreamerElement ( 'first' , getNextName ( ) , file ) ) ;
695+ si . fElements . Add ( createStreamerElement ( 'second' , getNextName ( ) , file ) ) ;
696+ file . fStreamerInfos . arr . push ( si ) ;
697+ return si ;
698+ }
699+
671700/** @summary create element of the streamer
672701 * @private */
673702function createStreamerElement ( name , typename , file ) {
@@ -686,7 +715,8 @@ function createStreamerElement(name, typename, file) {
686715 typename = elem . fTypeName = BasicTypeNames [ elem . fType ] || 'int' ;
687716 }
688717
689- if ( elem . fType > 0 ) return elem ; // basic type
718+ if ( elem . fType > 0 )
719+ return elem ; // basic type
690720
691721 // check if there are STL containers
692722 const pos = typename . indexOf ( '<' ) ;
@@ -707,6 +737,9 @@ function createStreamerElement(name, typename, file) {
707737 return elem ;
708738 }
709739
740+ if ( ( pos > 0 ) && ( typename . slice ( 0 , pos ) === 'pair' ) && file )
741+ createPairStreamer ( typename , file ) ;
742+
710743 const isptr = ( typename . lastIndexOf ( '*' ) === typename . length - 1 ) ;
711744
712745 if ( isptr )
@@ -726,33 +759,8 @@ function createStreamerElement(name, typename, file) {
726759/** @summary Function creates streamer for std::pair object
727760 * @private */
728761function getPairStreamer ( si , typname , file ) {
729- if ( ! si ) {
730- if ( typname . indexOf ( 'pair' ) !== 0 ) return null ;
731-
732- si = file . findStreamerInfo ( typname ) ;
733-
734- if ( ! si ) {
735- let p1 = typname . indexOf ( '<' ) ;
736- const p2 = typname . lastIndexOf ( '>' ) ;
737- function GetNextName ( ) {
738- let res = '' , p = p1 + 1 , cnt = 0 ;
739- while ( ( p < p2 ) && ( cnt >= 0 ) ) {
740- switch ( typname [ p ] ) {
741- case '<' : cnt ++ ; break ;
742- case ',' : if ( cnt === 0 ) cnt -- ; break ;
743- case '>' : cnt -- ; break ;
744- }
745- if ( cnt >= 0 ) res += typname [ p ] ;
746- p ++ ;
747- }
748- p1 = p - 1 ;
749- return res . trim ( ) ;
750- }
751- si = { _typename : 'TStreamerInfo' , fVersion : 1 , fName : typname , fElements : create ( clTList ) } ;
752- si . fElements . Add ( createStreamerElement ( 'first' , GetNextName ( ) , file ) ) ;
753- si . fElements . Add ( createStreamerElement ( 'second' , GetNextName ( ) , file ) ) ;
754- }
755- }
762+ if ( ! si )
763+ si = createPairStreamer ( typname , file ) ;
756764
757765 const streamer = file . getStreamer ( typname , null , si ) ;
758766 if ( ! streamer ) return null ;
@@ -1157,7 +1165,7 @@ function createMemberStreamer(element, file) {
11571165 member . readelem = readVectorElement ;
11581166
11591167 if ( ! member . isptr && ( member . arrkind < 0 ) ) {
1160- const subelem = createStreamerElement ( 'temp' , member . conttype ) ;
1168+ const subelem = createStreamerElement ( 'temp' , member . conttype , file ) ;
11611169 if ( subelem . fType === kStreamer ) {
11621170 subelem . $fictional = true ;
11631171 member . submember = createMemberStreamer ( subelem , file ) ;
@@ -3310,28 +3318,34 @@ class TFile {
33103318 * @param {number } [checksum] - streamer info checksum, have to match when specified
33113319 * @private */
33123320 findStreamerInfo ( clname , clversion , checksum ) {
3313- if ( ! this . fStreamerInfos ) return null ;
3321+ if ( ! this . fStreamerInfos )
3322+ return null ;
33143323
33153324 const arr = this . fStreamerInfos . arr , len = arr . length ;
33163325
33173326 if ( checksum !== undefined ) {
33183327 let cache = this . fStreamerInfos . cache ;
33193328 if ( ! cache ) cache = this . fStreamerInfos . cache = { } ;
33203329 let si = cache [ checksum ] ;
3321- if ( si !== undefined ) return si ;
3330+ if ( si && ( ! clname || ( si . fName === clname ) ) )
3331+ return si ;
33223332
33233333 for ( let i = 0 ; i < len ; ++ i ) {
33243334 si = arr [ i ] ;
33253335 if ( si . fCheckSum === checksum ) {
33263336 cache [ checksum ] = si ;
3327- return si ;
3337+ if ( ! clname || ( si . fName === clname ) )
3338+ return si ;
33283339 }
33293340 }
3330- cache [ checksum ] = null ; // checksum didnot found, do not try again
3331- } else {
3341+ cache [ checksum ] = null ; // checksum did not found, do not try again
3342+ }
3343+
3344+ if ( clname ) {
33323345 for ( let i = 0 ; i < len ; ++ i ) {
33333346 const si = arr [ i ] ;
3334- if ( ( si . fName === clname ) && ( ( si . fClassVersion === clversion ) || ( clversion === undefined ) ) ) return si ;
3347+ if ( ( si . fName === clname ) && ( ( si . fClassVersion === clversion ) || ( clversion === undefined ) ) )
3348+ return si ;
33353349 }
33363350 }
33373351
@@ -3373,7 +3387,8 @@ class TFile {
33733387 }
33743388
33753389 // check element in streamer infos, one can have special cases
3376- if ( ! s_i ) s_i = this . findStreamerInfo ( clname , ver . val , ver . checksum ) ;
3390+ if ( ! s_i )
3391+ s_i = this . findStreamerInfo ( clname , ver . val , ver . checksum ) ;
33773392
33783393 if ( ! s_i ) {
33793394 delete this . fStreamers [ fullname ] ;
@@ -3568,17 +3583,13 @@ function readMapElement(buf) {
35683583
35693584 if ( this . member_wise ) {
35703585 // when member-wise streaming is used, version is written
3571- const ver = this . stl_version ;
3586+ const si = buf . fFile . findStreamerInfo ( this . pairtype , this . stl_version . val /* , this.stl_version.checksum */ ) ;
35723587
3573- if ( this . si ) {
3574- const si = buf . fFile . findStreamerInfo ( this . pairtype , ver . val , ver . checksum ) ;
3575-
3576- if ( this . si !== si ) {
3577- streamer = getPairStreamer ( si , this . pairtype , buf . fFile ) ;
3578- if ( ! streamer || streamer . length !== 2 ) {
3579- console . log ( `Fail to produce streamer for ${ this . pairtype } ` ) ;
3580- return null ;
3581- }
3588+ if ( si && ( this . si !== si ) ) {
3589+ streamer = getPairStreamer ( si , this . pairtype , buf . fFile ) ;
3590+ if ( streamer ?. length !== 2 ) {
3591+ console . log ( `Fail to produce streamer for ${ this . pairtype } ` ) ;
3592+ return null ;
35823593 }
35833594 }
35843595 }
0 commit comments