This resolves a frame.
| 720 | # FrameResolver |
| 721 | # ======================================================================================================================= |
| 722 | class FrameResolver: |
| 723 | """ |
| 724 | This resolves a frame. |
| 725 | """ |
| 726 | |
| 727 | def resolve(self, obj, attribute): |
| 728 | if attribute == "__internals__": |
| 729 | return defaultResolver.get_dictionary(obj) |
| 730 | |
| 731 | if attribute == "stack": |
| 732 | return self.get_frame_stack(obj) |
| 733 | |
| 734 | if attribute == "f_locals": |
| 735 | return obj.f_locals |
| 736 | |
| 737 | return None |
| 738 | |
| 739 | def get_dictionary(self, obj): |
| 740 | ret = {} |
| 741 | ret["__internals__"] = defaultResolver.get_dictionary(obj) |
| 742 | ret["stack"] = self.get_frame_stack(obj) |
| 743 | ret["f_locals"] = obj.f_locals |
| 744 | return ret |
| 745 | |
| 746 | def get_frame_stack(self, frame): |
| 747 | ret = [] |
| 748 | if frame is not None: |
| 749 | ret.append(self.get_frame_name(frame)) |
| 750 | |
| 751 | while frame.f_back: |
| 752 | frame = frame.f_back |
| 753 | ret.append(self.get_frame_name(frame)) |
| 754 | |
| 755 | return ret |
| 756 | |
| 757 | def get_frame_name(self, frame): |
| 758 | if frame is None: |
| 759 | return "None" |
| 760 | try: |
| 761 | name = basename(frame.f_code.co_filename) |
| 762 | return "frame: %s [%s:%s] id:%s" % (frame.f_code.co_name, name, frame.f_lineno, id(frame)) |
| 763 | except: |
| 764 | return "frame object" |
| 765 | |
| 766 | |
| 767 | defaultResolver = DefaultResolver() |