@@ -133,9 +133,14 @@ void display(__node* x, int indent = 0)
133
133
{
134
134
for (int i = 0 ; i < 2 *indent; ++i)
135
135
printf (" " );
136
- char * buf = (char *)malloc (x->size ());
136
+ size_t sz = x->size ();
137
+ char * buf = (char *)calloc (sz+10 , 1 );
137
138
x->get_demangled_name (buf);
138
- printf (" %s %s, %p\n " , typeid (*x).name (), buf, x);
139
+ printf (" %s [%ld] %s, %p\n " , typeid (*x).name (), sz, buf, x);
140
+ if (strlen (buf) != sz)
141
+ {
142
+ printf (" strlen(buf) = %ld and size = %ld\n " , strlen (buf), sz);
143
+ }
139
144
free (buf);
140
145
display (x->__left_ , indent+1 );
141
146
display (x->__right_ , indent+1 );
@@ -3822,10 +3827,14 @@ class __list
3822
3827
}
3823
3828
virtual bool ends_with_template (bool parsing = false ) const
3824
3829
{
3825
- if (__right_ != NULL )
3830
+ if (__right_ && __right_->size () > 0 )
3831
+ {
3826
3832
return __right_->ends_with_template (parsing);
3827
- if (__left_ != NULL )
3833
+ }
3834
+ else if (__left_ && __left_->size () > 0 )
3835
+ {
3828
3836
return __left_->ends_with_template (parsing);
3837
+ }
3829
3838
return false ;
3830
3839
}
3831
3840
virtual bool fix_forward_references (__node** t_begin, __node** t_end)
@@ -6969,50 +6978,62 @@ __demangle_tree::__parse_unnamed_type_name(const char* first, const char* last)
6969
6978
{
6970
6979
case ' t' :
6971
6980
case ' l' :
6972
- first += 2 ;
6973
-
6981
+ {
6982
+ const char * t = first + 2 ;
6983
+ __node* params = 0 ;
6974
6984
if (type == ' l' )
6975
6985
{
6976
- __root_ = 0 ;
6977
- if (first[0 ] == ' v' )
6986
+ if (*t == ' v' )
6978
6987
{
6979
6988
// void lambda
6980
- ++first ;
6981
- if (first[ 0 ] == ' E' )
6982
- ++first ;
6989
+ ++t ;
6990
+ if (t != last && *t == ' E' )
6991
+ ++t ;
6983
6992
else
6984
6993
return first;
6985
6994
}
6986
6995
else
6987
6996
{
6988
- while (first[0 ] && first[0 ] != ' E' )
6997
+ const char * t1 = __parse_type (t, last);
6998
+ if (t1 == t || !__make<__list>(__root_))
6999
+ return first;
7000
+ params = __root_;
7001
+ __node* prev = params;
7002
+ t = t1;
7003
+ while (true )
6989
7004
{
6990
- const char *old = first;
6991
- first = __parse_type (first, last);
6992
- if (first == old)
7005
+ t1 = __parse_type (t, last);
7006
+ if (t1 == t)
6993
7007
break ;
7008
+ if (!__make<__list>(__root_))
7009
+ return first;
7010
+ t = t1;
7011
+ prev->__right_ = __root_;
7012
+ __root_->__size_ = prev->__size_ + 1 ;
7013
+ prev = __root_;
6994
7014
}
6995
- if (first[0 ] == ' E' )
6996
- ++first;
6997
- else
7015
+ if (t == last || *t != ' E' )
6998
7016
return first;
7017
+ ++t;
6999
7018
}
7000
7019
}
7001
- const char *number_start = first;
7002
- first = __parse_number (first, last);
7003
- const char *number_end = first;
7004
- if (first[0 ] == ' _' )
7005
- {
7006
- ++first;
7007
- }
7008
- else
7020
+ const char * number_start = t;
7021
+ const char * number_end = __parse_number (t, last);
7022
+ if (number_end == last || *number_end != ' _' )
7009
7023
return first;
7010
-
7024
+ t = number_end + 1 ;
7011
7025
if (type == ' l' )
7012
- __make<__lambda_node>(__root_, number_start, static_cast <size_t >(number_end - number_start));
7026
+ {
7027
+ if (!__make<__lambda_node>(params, number_start, static_cast <size_t >(number_end - number_start)))
7028
+ return first;
7029
+ }
7013
7030
else
7014
- __make<__unnamed>(number_start, static_cast <size_t >(number_end - number_start));
7015
-
7031
+ {
7032
+ if (!__make<__unnamed>(number_start, static_cast <size_t >(number_end - number_start)))
7033
+ return first;
7034
+ }
7035
+ first = t;
7036
+ }
7016
7037
break ;
7017
7038
}
7018
7039
}
0 commit comments