494
495 // A collection of described stack values that can print a symbolic
496 // description of the stack memory. Interpreter frame values can be
497 // in the caller frames so all the values are collected first and then
498 // sorted before being printed.
499 class FrameValues {
500 private:
501 GrowableArray<FrameValue> _values;
502
503 static int compare(FrameValue* a, FrameValue* b) {
504 if (a->location == b->location) {
505 return a->priority - b->priority;
506 }
507 return a->location - b->location;
508 }
509
510 public:
511 // Used by frame functions to describe locations.
512 void describe(int owner, intptr_t* location, const char* description, int priority = 0);
513
514 bool validate();
515 void print();
516 };
517
518 #endif
519
520 //
521 // StackFrameStream iterates through the frames of a thread starting from
522 // top most frame. It automatically takes care of updating the location of
523 // all (callee-saved) registers. Notice: If a thread is stopped at
524 // a safepoint, all registers are saved, not only the callee-saved ones.
525 //
526 // Use:
527 //
528 // for(StackFrameStream fst(thread); !fst.is_done(); fst.next()) {
529 // ...
530 // }
531 //
532 class StackFrameStream : public StackObj {
533 private:
534 frame _fr;
|
494
495 // A collection of described stack values that can print a symbolic
496 // description of the stack memory. Interpreter frame values can be
497 // in the caller frames so all the values are collected first and then
498 // sorted before being printed.
499 class FrameValues {
500 private:
501 GrowableArray<FrameValue> _values;
502
503 static int compare(FrameValue* a, FrameValue* b) {
504 if (a->location == b->location) {
505 return a->priority - b->priority;
506 }
507 return a->location - b->location;
508 }
509
510 public:
511 // Used by frame functions to describe locations.
512 void describe(int owner, intptr_t* location, const char* description, int priority = 0);
513
514 void validate();
515 void print();
516 };
517
518 #endif
519
520 //
521 // StackFrameStream iterates through the frames of a thread starting from
522 // top most frame. It automatically takes care of updating the location of
523 // all (callee-saved) registers. Notice: If a thread is stopped at
524 // a safepoint, all registers are saved, not only the callee-saved ones.
525 //
526 // Use:
527 //
528 // for(StackFrameStream fst(thread); !fst.is_done(); fst.next()) {
529 // ...
530 // }
531 //
532 class StackFrameStream : public StackObj {
533 private:
534 frame _fr;
|