1010#include < sstream>
1111#include < string>
1212#include < vector>
13+ #include < iostream>
1314
1415#include < lldb/API/SBExpressionOptions.h>
1516
@@ -43,6 +44,7 @@ char** ParseInspectOptions(char** cmd, v8::Value::InspectOptions* options) {
4344 {" print-source" , no_argument, nullptr , ' s' },
4445 {" verbose" , no_argument, nullptr , ' v' },
4546 {" detailed" , no_argument, nullptr , ' d' },
47+ {" output-limit" , required_argument, nullptr , ' n' },
4648 {nullptr , 0 , nullptr , 0 }};
4749
4850 int argc = 1 ;
@@ -60,7 +62,7 @@ char** ParseInspectOptions(char** cmd, v8::Value::InspectOptions* options) {
6062 optind = 0 ;
6163 opterr = 1 ;
6264 do {
63- int arg = getopt_long (argc, args, " Fmsdvl :" , opts, nullptr );
65+ int arg = getopt_long (argc, args, " Fmsdvln :" , opts, nullptr );
6466 if (arg == -1 ) break ;
6567
6668 switch (arg) {
@@ -80,6 +82,10 @@ char** ParseInspectOptions(char** cmd, v8::Value::InspectOptions* options) {
8082 case ' v' :
8183 options->detailed = true ;
8284 break ;
85+ case ' n' : {
86+ int limit = strtol (optarg, nullptr , 10 );
87+ options->output_limit = limit && limit > 0 ? limit : 0 ;
88+ } break ;
8389 default :
8490 continue ;
8591 }
@@ -213,6 +219,7 @@ bool FindInstancesCmd::DoExecute(SBDebugger d, char** cmd,
213219
214220 inspect_options.detailed = detailed_;
215221
222+ // Use same options as inspect?
216223 char ** start = ParseInspectOptions (cmd, &inspect_options);
217224
218225 std::string full_cmd;
@@ -222,15 +229,57 @@ bool FindInstancesCmd::DoExecute(SBDebugger d, char** cmd,
222229
223230 TypeRecordMap::iterator instance_it =
224231 llscan_->GetMapsToInstances ().find (type_name);
232+
225233 if (instance_it != llscan_->GetMapsToInstances ().end ()) {
234+
235+
226236 TypeRecord* t = instance_it->second ;
227- for (std::set<uint64_t >::iterator it = t->GetInstances ().begin ();
228- it != t->GetInstances ().end (); ++it) {
237+
238+ // Update pagination options
239+ if (full_cmd != pagination_.command ||
240+ inspect_options.output_limit != pagination_.output_limit ) {
241+ pagination_.total_entries = t->GetInstanceCount ();
242+ pagination_.command = full_cmd;
243+ pagination_.current_page = 0 ;
244+ pagination_.output_limit = inspect_options.output_limit ;
245+ } else {
246+ if (pagination_.output_limit <= 0 ||
247+ (pagination_.current_page + 1 ) * pagination_.output_limit >
248+ pagination_.total_entries ) {
249+ pagination_.current_page = 0 ;
250+ } else {
251+ pagination_.current_page ++;
252+ }
253+ }
254+
255+ int initial_p_offset =
256+ (pagination_.current_page * inspect_options.output_limit );
257+ int final_p_offset =
258+ initial_p_offset +
259+ std::min (pagination_.output_limit ,
260+ pagination_.total_entries -
261+ pagination_.current_page * pagination_.output_limit );
262+ if (final_p_offset <= 0 ) {
263+ final_p_offset = pagination_.total_entries ;
264+ }
265+
266+ std::set<uint64_t >::iterator it =
267+ pagination_.current_page == 0
268+ ? t->GetInstances ().begin ()
269+ : std::next (t->GetInstances ().begin (), initial_p_offset);
270+ for (; it != t->GetInstances ().end () &&
271+ it != (std::next (t->GetInstances ().begin (), final_p_offset));
272+ ++it) {
229273 Error err;
230274 v8::Value v8_value (llscan_->v8 (), *it);
231275 std::string res = v8_value.Inspect (&inspect_options, err);
232276 result.Printf (" %s\n " , res.c_str ());
233277 }
278+ if (it != t->GetInstances ().end ()) {
279+ result.Printf (" ..........\n " );
280+ }
281+ result.Printf (" (Showing %d to %d of %d instances)\n " , initial_p_offset + 1 ,
282+ final_p_offset, pagination_.total_entries );
234283
235284 } else {
236285 // "No objects found with type name %s", type_name
0 commit comments