@@ -241,7 +241,6 @@ bitflags! {
241241// The kind of variable storage. In LLVM this is called storage class.
242242#[ derive( Clone , Copy , Debug , PartialEq ) ]
243243pub enum VarStorageKind {
244- None ,
245244 PrivateStatic ,
246245 ProtectedStatic ,
247246 PublicStatic ,
@@ -328,7 +327,7 @@ pub enum Operator<'a> {
328327 VBTable ,
329328 VCall ,
330329 Typeof ,
331- LocalStaticGuard ,
330+ LocalStaticGuard ( Option < u32 > ) ,
332331 String ,
333332 VBaseDtor ,
334333 VectorDeletingDtor ,
@@ -361,7 +360,7 @@ pub enum Operator<'a> {
361360
362361 DynamicInitializer ,
363362 DynamicAtexitDtor ,
364- LocalStaticThreadGuard ,
363+ LocalStaticThreadGuard ( Option < u32 > ) ,
365364}
366365
367366#[ derive( Clone , Debug , PartialEq ) ]
@@ -520,19 +519,38 @@ impl<'a> ParserState<'a> {
520519
521520 // What follows is a main symbol name. This may include
522521 // namespaces or class names.
523- let symbol = self . read_name ( true ) ?;
522+ let mut symbol = self . read_name ( true ) ?;
523+
524+ // Special case for some weird cases where extra data is tacked on
525+ // after the main symbol but belongs into the symbol.
526+ match symbol. name {
527+ Name :: Operator ( Operator :: LocalStaticGuard ( ref mut scope_index) )
528+ | Name :: Operator ( Operator :: LocalStaticThreadGuard ( ref mut scope_index) ) => {
529+ let _is_visible = if self . consume ( b"4IA" ) {
530+ false
531+ } else if self . consume ( b"5" ) {
532+ true
533+ } else {
534+ return Err ( self . fail ( "unexpected local guard marker" ) ) ;
535+ } ;
536+ if !self . remaining . is_empty ( ) {
537+ * scope_index = Some ( self . read_unsigned ( ) ?) ;
538+ } ;
539+ }
540+ _ => { }
541+ }
524542
525543 if let Ok ( c) = self . get ( ) {
526544 let symbol_type = match c {
527- b'0' ...b'5 ' => {
545+ b'0' ...b'4 ' => {
528546 // Read a variable.
529547 let kind = match c {
530548 b'0' => VarStorageKind :: PrivateStatic ,
531549 b'1' => VarStorageKind :: ProtectedStatic ,
532550 b'2' => VarStorageKind :: PublicStatic ,
533551 b'3' => VarStorageKind :: Global ,
534552 b'4' => VarStorageKind :: FunctionLocalStatic ,
535- _ => VarStorageKind :: None ,
553+ _ => unreachable ! ( ) ,
536554 } ;
537555 let ty = self . read_var_type ( StorageClass :: empty ( ) ) ?;
538556 let sc = self . read_storage_class ( ) ;
@@ -786,6 +804,14 @@ impl<'a> ParserState<'a> {
786804 Err ( self . fail ( "bad number" ) )
787805 }
788806
807+ fn read_unsigned ( & mut self ) -> Result < u32 > {
808+ let num = self . read_number ( ) ?;
809+ if num < 0 {
810+ return Err ( self . fail ( "expected unsigned" ) ) ;
811+ }
812+ Ok ( num as u32 )
813+ }
814+
789815 // Read until the next b'@'.
790816 fn read_string ( & mut self ) -> Result < & ' a [ u8 ] > {
791817 if let Some ( pos) = self . remaining . iter ( ) . position ( |& x| x == b'@' ) {
@@ -877,8 +903,7 @@ impl<'a> ParserState<'a> {
877903 }
878904 name
879905 } else if self . consume ( b"?" ) {
880- // Overloaded operator.
881- self . read_operator ( ) ?
906+ self . read_special_name ( ) ?
882907 } else {
883908 // Non-template functions or classes.
884909 let name = self . read_string ( ) ?;
@@ -926,12 +951,8 @@ impl<'a> ParserState<'a> {
926951 ) )
927952 }
928953
929- fn read_operator ( & mut self ) -> Result < Name < ' a > > {
930- Ok ( Name :: Operator ( self . read_operator_name ( ) ?) )
931- }
932-
933- fn read_operator_name ( & mut self ) -> Result < Operator < ' a > > {
934- Ok ( match self . get ( ) ? {
954+ fn read_special_name ( & mut self ) -> Result < Name < ' a > > {
955+ Ok ( Name :: Operator ( match self . get ( ) ? {
935956 b'0' => Operator :: Ctor ,
936957 b'1' => Operator :: Dtor ,
937958 b'2' => Operator :: New ,
@@ -980,7 +1001,7 @@ impl<'a> ParserState<'a> {
9801001 b'8' => Operator :: VBTable ,
9811002 b'9' => Operator :: VCall ,
9821003 b'A' => Operator :: Typeof ,
983- b'B' => Operator :: LocalStaticGuard ,
1004+ b'B' => Operator :: LocalStaticGuard ( None ) ,
9841005 b'C' => Operator :: String ,
9851006 b'D' => Operator :: VBaseDtor ,
9861007 b'E' => Operator :: VectorDeletingDtor ,
@@ -1037,7 +1058,7 @@ impl<'a> ParserState<'a> {
10371058 } else if self . consume ( b"F" ) {
10381059 Operator :: DynamicAtexitDtor
10391060 } else if self . consume ( b"J" ) {
1040- Operator :: LocalStaticThreadGuard
1061+ Operator :: LocalStaticThreadGuard ( None )
10411062 } else if self . consume ( b"K" ) {
10421063 Operator :: LiteralOperatorName // TODO: read <source-name>, that's the operator name
10431064 } else {
@@ -1051,7 +1072,7 @@ impl<'a> ParserState<'a> {
10511072 _ => {
10521073 return Err ( self . fail ( "unknown operator name" ) ) ;
10531074 }
1054- } )
1075+ } ) )
10551076 }
10561077
10571078 fn read_func_class ( & mut self , c : u8 ) -> Result < FuncClass > {
@@ -1652,9 +1673,7 @@ impl<'a> Serializer<'a> {
16521673 VarStorageKind :: PrivateStatic => write ! ( self . w, "private: static " ) ?,
16531674 VarStorageKind :: ProtectedStatic => write ! ( self . w, "protected: static " ) ?,
16541675 VarStorageKind :: PublicStatic => write ! ( self . w, "public: static " ) ?,
1655- VarStorageKind :: Global
1656- | VarStorageKind :: FunctionLocalStatic
1657- | VarStorageKind :: None => { }
1676+ VarStorageKind :: Global | VarStorageKind :: FunctionLocalStatic => { }
16581677 }
16591678 self . write_pre ( inner) ?;
16601679 sc
@@ -1994,7 +2013,13 @@ impl<'a> Serializer<'a> {
19942013 Operator :: VBTable => "`vbtable'" ,
19952014 Operator :: VCall => "`vcall'" ,
19962015 Operator :: Typeof => "`typeof'" ,
1997- Operator :: LocalStaticGuard => "`local static guard'" ,
2016+ Operator :: LocalStaticGuard ( scope) => {
2017+ write ! ( self . w, "`local static guard'" ) ?;
2018+ if let Some ( scope) = scope {
2019+ write ! ( self . w, "{{{}}}" , scope) ?;
2020+ }
2021+ return Ok ( ( ) ) ;
2022+ }
19982023 Operator :: String => "`string'" ,
19992024 Operator :: VBaseDtor => "`vbase destructor'" ,
20002025 Operator :: VectorDeletingDtor => "`vector deleting destructor'" ,
@@ -2045,7 +2070,13 @@ impl<'a> Serializer<'a> {
20452070
20462071 Operator :: DynamicInitializer => "`dynamic initializer'" ,
20472072 Operator :: DynamicAtexitDtor => "`dynamic atexit destructor'" ,
2048- Operator :: LocalStaticThreadGuard => "`local static thread guard'" ,
2073+ Operator :: LocalStaticThreadGuard ( scope) => {
2074+ write ! ( self . w, "`local static thread guard'" ) ?;
2075+ if let Some ( scope) = scope {
2076+ write ! ( self . w, "{{{}}}" , scope) ?;
2077+ }
2078+ return Ok ( ( ) ) ;
2079+ }
20492080 } ;
20502081 write ! ( self . w, "{}" , s) ?;
20512082 Ok ( ( ) )
0 commit comments