@@ -656,6 +656,35 @@ function getTypeId(typname, norecursion) {
656656 return - 1 ;
657657}
658658
659+ /** @summary Create streamer info for pair object
660+ * @private */
661+ function createPairStreamer ( typename , file ) {
662+ let si = file . findStreamerInfo ( typename ) ;
663+ if ( si )
664+ return si ;
665+ let p1 = typename . indexOf ( '<' ) ;
666+ const p2 = typename . lastIndexOf ( '>' ) ;
667+ function getNextName ( ) {
668+ let res = '' , p = p1 + 1 , cnt = 0 ;
669+ while ( ( p < p2 ) && ( cnt >= 0 ) ) {
670+ switch ( typename [ p ] ) {
671+ case '<' : cnt ++ ; break ;
672+ case ',' : if ( cnt === 0 ) cnt -- ; break ;
673+ case '>' : cnt -- ; break ;
674+ }
675+ if ( cnt >= 0 ) res += typename [ p ] ;
676+ p ++ ;
677+ }
678+ p1 = p - 1 ;
679+ return res . trim ( ) ;
680+ }
681+ si = { _typename : 'TStreamerInfo' , fClassVersion : 0 , fName : typename , fElements : create ( clTList ) } ;
682+ si . fElements . Add ( createStreamerElement ( 'first' , getNextName ( ) , file ) ) ;
683+ si . fElements . Add ( createStreamerElement ( 'second' , getNextName ( ) , file ) ) ;
684+ file . fStreamerInfos . arr . push ( si ) ;
685+ return si ;
686+ }
687+
659688/** @summary create element of the streamer
660689 * @private */
661690function createStreamerElement ( name , typename , file ) {
@@ -674,7 +703,8 @@ function createStreamerElement(name, typename, file) {
674703 typename = elem . fTypeName = BasicTypeNames [ elem . fType ] || 'int' ;
675704 }
676705
677- if ( elem . fType > 0 ) return elem ; // basic type
706+ if ( elem . fType > 0 )
707+ return elem ; // basic type
678708
679709 // check if there are STL containers
680710 const pos = typename . indexOf ( '<' ) ;
@@ -695,6 +725,9 @@ function createStreamerElement(name, typename, file) {
695725 return elem ;
696726 }
697727
728+ if ( ( pos > 0 ) && ( typename . slice ( 0 , pos ) === 'pair' ) && file )
729+ createPairStreamer ( typename , file ) ;
730+
698731 const isptr = ( typename . lastIndexOf ( '*' ) === typename . length - 1 ) ;
699732
700733 if ( isptr )
@@ -714,33 +747,8 @@ function createStreamerElement(name, typename, file) {
714747/** @summary Function creates streamer for std::pair object
715748 * @private */
716749function getPairStreamer ( si , typname , file ) {
717- if ( ! si ) {
718- if ( typname . indexOf ( 'pair' ) !== 0 ) return null ;
719-
720- si = file . findStreamerInfo ( typname ) ;
721-
722- if ( ! si ) {
723- let p1 = typname . indexOf ( '<' ) ;
724- const p2 = typname . lastIndexOf ( '>' ) ;
725- function GetNextName ( ) {
726- let res = '' , p = p1 + 1 , cnt = 0 ;
727- while ( ( p < p2 ) && ( cnt >= 0 ) ) {
728- switch ( typname [ p ] ) {
729- case '<' : cnt ++ ; break ;
730- case ',' : if ( cnt === 0 ) cnt -- ; break ;
731- case '>' : cnt -- ; break ;
732- }
733- if ( cnt >= 0 ) res += typname [ p ] ;
734- p ++ ;
735- }
736- p1 = p - 1 ;
737- return res . trim ( ) ;
738- }
739- si = { _typename : 'TStreamerInfo' , fVersion : 1 , fName : typname , fElements : create ( clTList ) } ;
740- si . fElements . Add ( createStreamerElement ( 'first' , GetNextName ( ) , file ) ) ;
741- si . fElements . Add ( createStreamerElement ( 'second' , GetNextName ( ) , file ) ) ;
742- }
743- }
750+ if ( ! si )
751+ si = createPairStreamer ( typname , file ) ;
744752
745753 const streamer = file . getStreamer ( typname , null , si ) ;
746754 if ( ! streamer ) return null ;
@@ -1144,7 +1152,7 @@ function createMemberStreamer(element, file) {
11441152 member . readelem = readVectorElement ;
11451153
11461154 if ( ! member . isptr && ( member . arrkind < 0 ) ) {
1147- const subelem = createStreamerElement ( 'temp' , member . conttype ) ;
1155+ const subelem = createStreamerElement ( 'temp' , member . conttype , file ) ;
11481156 if ( subelem . fType === kStreamer ) {
11491157 subelem . $fictional = true ;
11501158 member . submember = createMemberStreamer ( subelem , file ) ;
@@ -3296,28 +3304,34 @@ class TFile {
32963304 * @param {number } [checksum] - streamer info checksum, have to match when specified
32973305 * @private */
32983306 findStreamerInfo ( clname , clversion , checksum ) {
3299- if ( ! this . fStreamerInfos ) return null ;
3307+ if ( ! this . fStreamerInfos )
3308+ return null ;
33003309
33013310 const arr = this . fStreamerInfos . arr , len = arr . length ;
33023311
33033312 if ( checksum !== undefined ) {
33043313 let cache = this . fStreamerInfos . cache ;
33053314 if ( ! cache ) cache = this . fStreamerInfos . cache = { } ;
33063315 let si = cache [ checksum ] ;
3307- if ( si !== undefined ) return si ;
3316+ if ( si && ( ! clname || ( si . fName === clname ) ) )
3317+ return si ;
33083318
33093319 for ( let i = 0 ; i < len ; ++ i ) {
33103320 si = arr [ i ] ;
33113321 if ( si . fCheckSum === checksum ) {
33123322 cache [ checksum ] = si ;
3313- return si ;
3323+ if ( ! clname || ( si . fName === clname ) )
3324+ return si ;
33143325 }
33153326 }
33163327 cache [ checksum ] = null ; // checksum did not found, do not try again
3317- } else {
3328+ }
3329+
3330+ if ( clname ) {
33183331 for ( let i = 0 ; i < len ; ++ i ) {
33193332 const si = arr [ i ] ;
3320- if ( ( si . fName === clname ) && ( ( si . fClassVersion === clversion ) || ( clversion === undefined ) ) ) return si ;
3333+ if ( ( si . fName === clname ) && ( ( si . fClassVersion === clversion ) || ( clversion === undefined ) ) )
3334+ return si ;
33213335 }
33223336 }
33233337
@@ -3359,7 +3373,8 @@ class TFile {
33593373 }
33603374
33613375 // check element in streamer infos, one can have special cases
3362- if ( ! s_i ) s_i = this . findStreamerInfo ( clname , ver . val , ver . checksum ) ;
3376+ if ( ! s_i )
3377+ s_i = this . findStreamerInfo ( clname , ver . val , ver . checksum ) ;
33633378
33643379 if ( ! s_i ) {
33653380 delete this . fStreamers [ fullname ] ;
@@ -3554,17 +3569,13 @@ function readMapElement(buf) {
35543569
35553570 if ( this . member_wise ) {
35563571 // when member-wise streaming is used, version is written
3557- const ver = this . stl_version ;
3572+ const si = buf . fFile . findStreamerInfo ( this . pairtype , this . stl_version . val /* , this.stl_version.checksum */ ) ;
35583573
3559- if ( this . si ) {
3560- const si = buf . fFile . findStreamerInfo ( this . pairtype , ver . val , ver . checksum ) ;
3561-
3562- if ( this . si !== si ) {
3563- streamer = getPairStreamer ( si , this . pairtype , buf . fFile ) ;
3564- if ( ! streamer || streamer . length !== 2 ) {
3565- console . log ( `Fail to produce streamer for ${ this . pairtype } ` ) ;
3566- return null ;
3567- }
3574+ if ( si && ( this . si !== si ) ) {
3575+ streamer = getPairStreamer ( si , this . pairtype , buf . fFile ) ;
3576+ if ( streamer ?. length !== 2 ) {
3577+ console . log ( `Fail to produce streamer for ${ this . pairtype } ` ) ;
3578+ return null ;
35683579 }
35693580 }
35703581 }
0 commit comments