Ticket #198: class_definition_reverse_lookup.diff
| File class_definition_reverse_lookup.diff, 6.6 KB (added by nick, 11 months ago) |
|---|
-
pyamf/tests/test_amf3.py
728 728 self.assertFalse(is_ref) 729 729 self.assertTrue(isinstance(class_def, amf3.ClassDefinition)) 730 730 self.assertTrue(class_def.getClass(), Spam) 731 self.assertTrue(class_def.klass, Spam) 731 732 self.assertTrue(class_def.name, 'abc.xyz') 732 733 self.assertEquals(class_def.encoding, amf3.ObjectEncoding.STATIC) 733 734 734 735 self.assertTrue(class_def in self.context.classes) 736 self.assertTrue(id(class_def) in self.context.rev_classes) 735 737 736 738 self.context.classes.remove(class_def) 737 739 self.buf.write('\x0fabc.xyz') -
pyamf/amf3.py
658 658 pyamf.BaseContext.clear(self) 659 659 660 660 self.strings = [] 661 661 662 self.classes = [] 663 self.rev_classes = {} 662 664 self.class_defs = {} 665 self.rev_class_defs = {} 666 663 667 self.legacy_xml = [] 668 self.rev_legacy_xml = {} 664 669 665 670 def getString(self, ref): 666 671 """ … … 676 681 try: 677 682 return self.strings[ref] 678 683 except IndexError: 679 raise pyamf.ReferenceError ("String reference %d not found" % ref)684 raise pyamf.ReferenceError, "String reference %d not found" % ref 680 685 681 686 def getStringReference(self, s): 682 687 """ … … 691 696 try: 692 697 return self.strings.index(s) 693 698 except ValueError: 694 raise pyamf.ReferenceError ("Reference for string %r not found" % s)699 raise pyamf.ReferenceError, "Reference for string %r not found" % s 695 700 696 701 def addString(self, s): 697 702 """ … … 705 710 @rtype: C{int} 706 711 @return: The reference index. 707 712 """ 713 if not isinstance(s, basestring): 714 raise TypeError 715 708 716 if len(s) == 0: 709 717 # do not store empty string references 710 718 raise ValueError, "Cannot store a reference to an empty string" … … 728 736 try: 729 737 return self.classes[ref] 730 738 except IndexError: 731 raise pyamf.ReferenceError ("Class reference %d not found" % ref)739 raise pyamf.ReferenceError, "Class reference %d not found" % ref 732 740 733 741 def getClassDefinitionReference(self, class_def): 734 742 """ 735 743 Return class definition reference. 736 744 737 @type class_def: L{ClassDefinition} 745 @type class_def: L{ClassDefinition} or C{instance} or C{class} 738 746 @param class_def: The class definition reference to be found. 739 747 @raise ReferenceError: The reference could not be found. 740 748 @return: The reference to C{class_def}. 741 749 @rtype: C{int} 742 750 """ 743 if not isinstance(class_def, ClassDefinition) and isinstance(class_def, (type, types.ClassType)): 751 if not isinstance(class_def, ClassDefinition): 752 if isinstance(class_def, (type, types.ClassType)): 753 try: 754 return self.rev_class_defs[class_def] 755 except KeyError: 756 raise pyamf.ReferenceError("Reference for class definition for %s not found" % 757 class_def) 758 elif isinstance(class_def, (types.InstanceType, types.ObjectType)): 759 try: 760 return self.class_defs[class_def.__class__] 761 except KeyError: 762 raise pyamf.ReferenceError("Reference for class definition for %s not found" % 763 class_def.__class__) 764 765 raise TypeError, 'unable to determine class for %r' % class_def 766 else: 744 767 try: 745 return self.class_defs[class_def.__class__] 746 except KeyError: 747 raise pyamf.ReferenceError("Reference for class %s not found" % 748 class_def.__class__) 768 return self.rev_class_defs[id(class_def)] 769 except ValueError: 770 raise pyamf.ReferenceError, "Reference for class %s not found" % kl 749 771 750 try:751 return self.classes.index(class_def)752 except ValueError:753 raise pyamf.ReferenceError("Reference for class %s not found" %754 class_def.__class__)755 756 772 def addClassDefinition(self, class_def): 757 773 """ 758 774 Creates a reference to C{class_def}. 759 775 """ 760 776 try: 761 return self. classes.index(class_def)762 except ValueError:777 return self.rev_class_defs[id(class_def)] 778 except KeyError: 763 779 self.classes.append(class_def) 780 idx = len(self.classes) - 1 781 782 self.rev_classes[id(class_def)] = idx 764 783 self.class_defs[class_def.__class__] = class_def 784 self.rev_class_defs[id(class_def.__class__)] = idx 765 785 766 return len(self.classes) - 1786 return idx 767 787 768 788 def getLegacyXML(self, ref): 769 789 """ … … 793 813 @rtype: C{int} 794 814 """ 795 815 try: 796 return self. legacy_xml.index(doc)797 except ValueError:816 return self.rev_legacy_xml[id(doc)] 817 except KeyError: 798 818 raise pyamf.ReferenceError, "Reference for document %r not found" % doc 799 819 800 820 def addLegacyXML(self, doc): … … 810 830 @return: The reference to C{doc}. 811 831 """ 812 832 try: 813 return self. legacy_xml.index(doc)814 except ValueError:833 return self.rev_legacy_xml[id(doc)] 834 except KeyError: 815 835 self.legacy_xml.append(doc) 816 836 817 return len(self.legacy_xml) - 1 837 idx = len(self.legacy_xml) - 1 838 self.rev_legacy_xml[id(doc)] = idx 818 839 840 return idx 841 819 842 def __copy__(self): 820 843 return self.__class__() 821 844 … … 1161 1184 # Unsupported types go first 1162 1185 ((types.BuiltinFunctionType, types.BuiltinMethodType,), 1163 1186 "writeUnsupported"), 1164 ((lambda x: x ==pyamf.Undefined,), "writeUndefined"),1187 ((lambda x: x is pyamf.Undefined,), "writeUndefined"), 1165 1188 ((bool,), "writeBoolean"), 1166 1189 ((int,long), "writeInteger"), 1167 1190 ((float,), "writeNumber"), … … 1562 1585 1563 1586 self._writeInteger(ref | class_def.encoding << 2 | REFERENCE_BIT << 1 | REFERENCE_BIT) 1564 1587 self._writeString(class_def.name) 1588 else: 1589 class_def = self._getClassDefinition(obj) 1565 1590 1566 1591 if class_def.encoding in (ObjectEncoding.EXTERNAL, ObjectEncoding.PROXY): 1567 1592 obj.__writeamf__(DataOutput(self))
