@@ -85,6 +85,39 @@ def to_string(self):
8585 def display_hint ():
8686 return "string"
8787
88+ def _enumerate_array_elements (element_ptrs ):
89+ for (i , element_ptr ) in enumerate (element_ptrs ):
90+ key = "[{}]" .format (i )
91+ element = element_ptr .dereference ()
92+
93+ try :
94+ # rust-lang/rust#64343: passing deref expr to `str` allows
95+ # catching exception on garbage pointer
96+ str (element )
97+ except RuntimeError :
98+ yield key , "inaccessible"
99+
100+ break
101+
102+ yield key , element
103+
104+ class StdSliceProvider :
105+ def __init__ (self , valobj ):
106+ self .valobj = valobj
107+ self .length = int (valobj ["length" ])
108+ self .data_ptr = valobj ["data_ptr" ]
109+
110+ def to_string (self ):
111+ return "{}(size={})" .format (self .valobj .type , self .length )
112+
113+ def children (self ):
114+ return _enumerate_array_elements (
115+ self .data_ptr + index for index in xrange (self .length )
116+ )
117+
118+ @staticmethod
119+ def display_hint ():
120+ return "array"
88121
89122class StdVecProvider :
90123 def __init__ (self , valobj ):
@@ -96,19 +129,9 @@ def to_string(self):
96129 return "Vec(size={})" .format (self .length )
97130
98131 def children (self ):
99- saw_inaccessible = False
100- for index in xrange (self .length ):
101- element_ptr = self .data_ptr + index
102- if saw_inaccessible :
103- return
104- try :
105- # rust-lang/rust#64343: passing deref expr to `str` allows
106- # catching exception on garbage pointer
107- str (element_ptr .dereference ())
108- yield "[{}]" .format (index ), element_ptr .dereference ()
109- except RuntimeError :
110- saw_inaccessible = True
111- yield str (index ), "inaccessible"
132+ return _enumerate_array_elements (
133+ self .data_ptr + index for index in xrange (self .length )
134+ )
112135
113136 @staticmethod
114137 def display_hint ():
@@ -131,9 +154,9 @@ def to_string(self):
131154 return "VecDeque(size={})" .format (self .size )
132155
133156 def children (self ):
134- for index in xrange ( 0 , self . size ):
135- value = (self .data_ptr + ((self .tail + index ) % self .cap )). dereference ( )
136- yield "[{}]" . format ( index ), value
157+ return _enumerate_array_elements (
158+ (self .data_ptr + ((self .tail + index ) % self .cap )) for index in xrange ( self . size )
159+ )
137160
138161 @staticmethod
139162 def display_hint ():
0 commit comments