]> granicus.if.org Git - python/commitdiff
Merged revisions 61440-61441,61443,61445-61448,61451-61452,61455-61457,61459-61464...
authorMartin v. Löwis <martin@v.loewis.de>
Sat, 5 Apr 2008 18:58:09 +0000 (18:58 +0000)
committerMartin v. Löwis <martin@v.loewis.de>
Sat, 5 Apr 2008 18:58:09 +0000 (18:58 +0000)
svn+ssh://pythondev@svn.python.org/python/trunk

........
  r62167 | martin.v.loewis | 2008-04-05 17:45:25 +0200 (Sa, 05 Apr 2008) | 1 line

  Extend sizes of various fields, to support the CRT90 merge module.
........
  r62168 | martin.v.loewis | 2008-04-05 17:48:36 +0200 (Sa, 05 Apr 2008) | 1 line

  Add two features to distinguish between private and SxS CRT.
........
  r62169 | martin.v.loewis | 2008-04-05 17:50:58 +0200 (Sa, 05 Apr 2008) | 1 line

  Add script to merge msvcr90.
........
  r62170 | andrew.kuchling | 2008-04-05 17:57:46 +0200 (Sa, 05 Apr 2008) | 1 line

  Markup fixes; write PEP 3118 section
........
  r62173 | georg.brandl | 2008-04-05 19:45:58 +0200 (Sa, 05 Apr 2008) | 2 lines

  Mention that the tuple returned by __reduce__ is pickled as normal.
........
  r62174 | andrew.kuchling | 2008-04-05 20:15:30 +0200 (Sa, 05 Apr 2008) | 1 line

  Write PEP 3119 section
........

Doc/library/pickle.rst
Doc/whatsnew/2.6.rst
Tools/msi/merge.py [new file with mode: 0644]
Tools/msi/msi.py
Tools/msi/schema.py

index 33bd9c9b3f648255b737e252f7715d2b39046111..520c24b8eead6b7043b69b8539980555b9db809c 100644 (file)
@@ -468,8 +468,9 @@ local name relative to its module; the pickle module searches the module
 namespace to determine the object's module.
 
 When a tuple is returned, it must be between two and five elements long.
-Optional elements can either be omitted, or ``None`` can be provided  as their
-value.  The semantics of each element are:
+Optional elements can either be omitted, or ``None`` can be provided as their
+value.  The contents of this tuple are pickled as normal and used to
+reconstruct the object at unpickling time.  The semantics of each element are:
 
 * A callable object that will be called to create the initial version of the
   object.  The next element of the tuple will provide arguments for this callable,
index 26f51690e2bb5650bfceb4de65c03dd63f8c5b64..209850815ac681eb052011c8d72da8f28be25041 100644 (file)
@@ -156,15 +156,18 @@ http://svn.python.org/view/tracker/importer/.
 
 .. seealso::
 
-  http://bugs.python.org: The Python bug tracker.
+  http://bugs.python.org 
+    The Python bug tracker.
 
-  http://bugs.jython.org: The Jython bug tracker.
+  http://bugs.jython.org:
+    The Jython bug tracker.
 
-  http://roundup.sourceforge.net/: Roundup downloads and documentation.
+  http://roundup.sourceforge.net/
+    Roundup downloads and documentation.
 
 
-New Documentation Format: ReStructured Text
---------------------------------------------------
+New Documentation Format: ReStructured Text Using Sphinx
+-----------------------------------------------------------
 
 Since the Python project's inception around 1989, the documentation
 had been written using LaTeX.  At that time, most documentation was
@@ -191,16 +194,20 @@ The input format is reStructured Text,
 a markup commonly used in the Python community that supports
 custom extensions  and directives.   Sphinx concentrates 
 on HTML output, producing attractively styled 
-and modern HTML, but printed output is still supported through 
-conversion to LaTeX as an output format.
+and modern HTML, though printed output is still supported through 
+conversion to LaTeX.  Sphinx is a standalone package that
+can be used in documenting other projects.
 
 .. seealso::
 
-   `Docutils <http://docutils.sf.net>`__: The fundamental
-   reStructured Text parser and toolset.
+   :ref:`documenting-index`
+       Describes how to write for Python's documentation.
+
+   `Sphinx <http://sphinx.pocoo.org/>`__
+     Documentation and code for the Sphinx toolchain.
 
-   :ref:`documenting-index`: Describes how to write for 
-   Python's documentation.
+   `Docutils <http://docutils.sf.net>`__
+     The underlying reStructured Text parser and toolset.
 
 
 PEP 343: The 'with' statement
@@ -487,8 +494,7 @@ can now be used in scripts running from inside a package.
     .. seealso::
 
        :pep:`370` - XXX
-
-       PEP written by XXX; implemented by Christian Heimes.
+         PEP written by XXX; implemented by Christian Heimes.
 
   
 .. ======================================================================
@@ -633,9 +639,8 @@ PEP 3105: ``print`` As a Function
 =====================================================
 
 The ``print`` statement becomes the :func:`print` function in Python 3.0.
-Making :func:`print` a function makes it easier to replace within a
-module by doing 'def print(...)' or importing a new 
-function from somewhere else. 
+Making :func:`print` a function makes it easier to change 
+by doing 'def print(...)' or importing a new function from somewhere else. 
 
 Python 2.6 has a ``__future__`` import that removes ``print`` as language 
 syntax, letting you use the functional form instead.  For example::
@@ -750,13 +755,50 @@ XXX write this.
 PEP 3118: Revised Buffer Protocol
 =====================================================
 
-The buffer protocol is a C-level API that lets Python extensions 
-XXX
+The buffer protocol is a C-level API that lets Python types
+exchange pointers into their internal representations.  A 
+memory-mapped file can be viewed as a buffer of characters, for
+example, and this lets another module such as :mod:`re`
+treat memory-mapped files as a string of characters to be searched.
+
+The primary users of the buffer protocol are numeric-processing
+packages such as NumPy, which can expose the internal representation
+of arrays so that callers can write data directly into an array instead
+of going through a slower API.  This PEP updates the buffer protocol in light of experience 
+from NumPy development, adding a number of new features
+such as indicating the shape of an array, 
+locking memory .
+
+The most important new C API function is 
+``PyObject_GetBuffer(PyObject *obj, Py_buffer *view, int flags)``, which
+takes an object and a set of flags, and fills in the
+``Py_buffer`` structure with information 
+about the object's memory representation.  Objects
+can use this operation to lock memory in place 
+while an external caller could be modifying the contents,
+so there's a corresponding 
+``PyObject_ReleaseBuffer(PyObject *obj, Py_buffer *view)`` to
+indicate that the external caller is done.
+
+The **flags** argument to :cfunc:`PyObject_GetBuffer` specifies
+constraints upon the memory returned.  Some examples are:
+
+ * :const:`PyBUF_WRITABLE` indicates that the memory must be writable.
+ * :const:`PyBUF_LOCK` requests a read-only or exclusive lock on the memory.
+
+ * :const:`PyBUF_C_CONTIGUOUS` and :const:`PyBUF_F_CONTIGUOUS`
+   requests a C-contiguous (last dimension varies the fastest) or
+   Fortran-contiguous (first dimension varies the fastest) layout.
+
+.. XXX this feature is not in 2.6 docs yet
 
 .. seealso::
 
    :pep:`3118` - Revising the buffer protocol
-      PEP written by Travis Oliphant and Carl Banks.
+      PEP written by Travis Oliphant and Carl Banks; implemented by
+      Travis Oliphant.
+      
 
 .. ======================================================================
 
@@ -765,41 +807,142 @@ XXX
 PEP 3119: Abstract Base Classes
 =====================================================
 
-XXX write this -- this section is currently just brief notes.
+Some object-oriented languages such as Java support interfaces: declarations
+that a class has a given set of methods or supports a given access protocol.
+Abstract Base Classes (or ABCs) are an equivalent feature for Python. The ABC
+support consists of an :mod:`abc` module containing a metaclass called 
+:class:`ABCMeta`, special handling
+of this metaclass by the :func:`isinstance` and :func:`issubclass` built-ins,
+and a collection of basic ABCs that the Python developers think will be widely
+useful.
+
+Let's say you have a particular class and wish to know whether it supports 
+dictionary-style access.  The phrase "dictionary-style" is vague, however.
+It probably means that accessing items with ``obj[1]`` works.  
+Does it imply that setting items with ``obj[2] = value`` works?  
+Or that the object will have :meth:`keys`, :meth:`values`, and :meth:`items`
+methods?  What about the iterative variants  such as :meth:`iterkeys`?  :meth:`copy`
+and :meth:`update`?  Iterating over the object with :func:`iter`?
+
+Python 2.6 includes a number of different ABCs in the :mod:`collections`
+module.  :class:`Iterable` indicates that a class defines :meth:`__iter__`,
+and :class:`Container` means the class supports  ``x in y`` expressions
+by defining a :meth:`__contains__` method.  The basic dictionary interface of
+getting items, setting items, and 
+:meth:`keys`, :meth:`values`, and :meth:`items`, is defined by the
+:class:`MutableMapping` ABC.
+
+You can derive your own classes from a particular ABC
+to indicate they support that ABC's interface::
+
+    import collections
+  
+    class Storage(collections.MutableMapping):
+        ...
 
-How to identify a file object?
 
-ABCs are a collection of classes describing various interfaces.
-Classes can derive from an ABC to indicate they support that ABC's
-interface.  Concrete classes should obey the semantics specified by 
-an ABC, but Python can't check this; it's up to the implementor.
+Alternatively, you could write the class without deriving from 
+the desired ABC and instead register the class by
+calling the ABC's :meth:`register` method::
 
-A metaclass lets you declare that an existing class or type
-derives from a particular ABC.  You can even 
+    import collections
+    
+    class Storage:
+        ...
+       
+    collections.MutableMapping.register(Storage)
+    
+For classes that you write, deriving from the ABC is probably clearer.
+The :meth:`register`  method is useful when you've written a new
+ABC that can describe an existing type or class, or if you want
+to declare that some third-party class implements an ABC.
+For example, if you defined a :class:`PrintableType` ABC,
+it's legal to do:
+
+  # Register Python's types
+  PrintableType.register(int)
+  PrintableType.register(float)
+  PrintableType.register(str)
+
+Classes should obey the semantics specified by an ABC, but 
+Python can't check this; it's up to the class author to  
+understand the ABC's requirements and to implement the code accordingly.
+
+To check whether an object supports a particular interface, you can
+now write::
+
+    def func(d):
+       if not isinstance(d, collections.MutableMapping):
+           raise ValueError("Mapping object expected, not %r" % d)        
+
+(Don't feel that you must now begin writing lots of checks as in the 
+above example.  Python has a strong tradition of duck-typing, where 
+explicit type-checking isn't done and code simply calls methods on 
+an object, trusting that those methods will be there and raising an
+exception if they aren't.  Be judicious in checking for ABCs
+and only do it where it helps.)
+
+You can write your own ABCs by using ``abc.ABCMeta`` as the
+metaclass in a class definition::
+
+  from abc import ABCMeta
+
+  class Drawable():
+      __metaclass__ = ABCMeta
+  
+      def draw(self, x, y, scale=1.0):
+         pass
 
-class AppendableSequence:
-    __metaclass__ = ABCMeta
+      def draw_doubled(self, x, y):
+         self.draw(x, y, scale=2.0)
 
-AppendableSequence.register(list)
-assert issubclass(list, AppendableSequence)
-assert isinstance([], AppendableSequence)
+       
+  class Square(Drawable):
+      def draw(self, x, y, scale):
+          ...
 
-@abstractmethod decorator -- you can't instantiate classes w/
-an abstract method.
+         
+In the :class:`Drawable` ABC above, the :meth:`draw_doubled` method
+renders the object at twice its size and can be implemented in terms
+of other methods described in :class:`Drawable`.  Classes implementing
+this ABC therefore don't need to provide their own implementation 
+of :meth:`draw_doubled`, though they can do so.  An implementation
+of :meth:`draw` is necessary, though; the ABC can't provide 
+a useful generic implementation.  You 
+can apply the ``@abstractmethod`` decorator to methods such as 
+:meth:`draw` that must be implemented; Python will 
+then raise an exception for classes that 
+don't define the method::
+
+    class Drawable():
+       __metaclass__ = ABCMeta
+    
+       @abstractmethod
+       def draw(self, x, y, scale):
+           pass
+
+Note that the exception is only raised when you actually 
+try to create an instance of a subclass without the method::
+
+    >>> s=Square()
+    Traceback (most recent call last):
+      File "<stdin>", line 1, in <module>
+    TypeError: Can't instantiate abstract class Square with abstract methods draw
+    >>> 
 
-::
+Abstract data attributes can be declared using the ``@abstractproperty`` decorator::
 
-    @abstractproperty decorator
     @abstractproperty
     def readonly(self):
        return self._x
 
+Subclasses must then define a :meth:`readonly` property 
 
 .. seealso::
 
    :pep:`3119` - Introducing Abstract Base Classes
       PEP written by Guido van Rossum and Talin.
-      Implemented by XXX.
+      Implemented by Guido van Rossum.
       Backported to 2.6 by Benjamin Aranguren, with Alex Martelli.
 
 .. ======================================================================
diff --git a/Tools/msi/merge.py b/Tools/msi/merge.py
new file mode 100644 (file)
index 0000000..aa26122
--- /dev/null
@@ -0,0 +1,70 @@
+import msilib,os,win32com,tempfile\r
+PCBUILD="PCBuild"\r
+from config import *\r
+\r
+Win64 = "amd64" in PCBUILD\r
+\r
+mod_dir = os.path.join(os.environ["ProgramFiles"], "Common Files", "Merge Modules")\r
+if Win64:\r
+    modules = ["Microsoft_VC90_CRT_x86.msm", "policy_8_0_Microsoft_VC80_CRT_x86_x64.msm"]\r
+    msi = "python-%s.amd64.msi" % full_current_version\r
+else:\r
+    modules = ["Microsoft_VC90_CRT_x86.msm","policy_8_0_Microsoft_VC80_CRT_x86.msm"]\r
+    msi = "python-%s.msi" % full_current_version\r
+for i, n in enumerate(modules):\r
+    modules[i] = os.path.join(mod_dir, n)\r
+\r
+def merge(msi, feature, rootdir, modules):\r
+    cab_and_filecount = []\r
+    # Step 1: Merge databases, extract cabfiles\r
+    m = msilib.MakeMerge2()\r
+    m.OpenLog("merge.log")\r
+    print "Opened Log"\r
+    m.OpenDatabase(msi)\r
+    print "Opened DB"\r
+    for module in modules:\r
+        print module\r
+        m.OpenModule(module,0)\r
+        print "Opened Module",module\r
+        m.Merge(feature, rootdir)\r
+        print "Errors:"\r
+        for e in m.Errors:\r
+            print e.Type, e.ModuleTable, e.DatabaseTable\r
+            print "   Modkeys:",\r
+            for s in e.ModuleKeys: print s,\r
+            print\r
+            print "   DBKeys:",\r
+            for s in e.DatabaseKeys: print s,\r
+            print\r
+        cabname = tempfile.mktemp(suffix=".cab")\r
+        m.ExtractCAB(cabname)\r
+        cab_and_filecount.append((cabname, len(m.ModuleFiles)))\r
+        m.CloseModule()\r
+    m.CloseDatabase(True)\r
+    m.CloseLog()\r
+\r
+    # Step 2: Add CAB files\r
+    i = msilib.MakeInstaller()\r
+    db = i.OpenDatabase(msi, win32com.client.constants.msiOpenDatabaseModeTransact)\r
+\r
+    v = db.OpenView("SELECT LastSequence FROM Media")\r
+    v.Execute(None)\r
+    maxmedia = -1\r
+    while 1:\r
+        r = v.Fetch()\r
+        if not r: break\r
+        seq = r.IntegerData(1)\r
+        if seq > maxmedia:\r
+            maxmedia = seq\r
+    print "Start of Media", maxmedia\r
+\r
+    for cabname, count in cab_and_filecount:\r
+        stream = "merged%d" % maxmedia\r
+        msilib.add_data(db, "Media",\r
+                [(maxmedia+1, maxmedia+count, None, "#"+stream, None, None)])\r
+        msilib.add_stream(db, stream,  cabname)\r
+        os.unlink(cabname)\r
+        maxmedia += count\r
+    db.Commit()\r
+\r
+merge(msi, "SharedCRT", "TARGETDIR", modules)\r
index 08b759c14901868ef948972e19a6788fad1b612e..6a228be193bc9b760f361c71b287c41be7ccd000 100644 (file)
@@ -799,6 +799,12 @@ def add_features(db):
     default_feature = Feature(db, "DefaultFeature", "Python",
                               "Python Interpreter and Libraries",
                               1, directory = "TARGETDIR")
+    shared_crt = Feature(db, "SharedCRT", "MSVCRT", "C Run-Time (system-wide)", 0,
+                         level=0)
+    private_crt = Feature(db, "PrivateCRT", "MSVCRT", "C Run-Time (private)", 0,
+                          level=0)
+    add_data(db, "Condition", [("SharedCRT", 1, sys32cond),
+                               ("PrivateCRT", 1, "not "+sys32cond)])
     # We don't support advertisement of extensions
     ext_feature = Feature(db, "Extensions", "Register Extensions",
                           "Make this Python installation the default Python installation", 3,
@@ -899,7 +905,7 @@ def add_files(db):
     DLLs = PyDirectory(db, cab, root, srcdir + "/" + PCBUILD, "DLLs", "DLLS|DLLs")
     # XXX determine dependencies
     if MSVCR == "90":
-        root.start_component("msvcr90")
+        root.start_component("msvcr90", feature=private_crt)
         for file, kw in extract_msvcr90():
             root.add_file(file, **kw)
             if file.endswith("manifest"):
index 7a3e7975bf368f298d34dcb4129ea0328a7a984e..d028a112b76caea45f640364f77c7099f0ff021f 100644 (file)
@@ -18,7 +18,7 @@ ActionText.add_field(2,'Description',7936)
 ActionText.add_field(3,'Template',7936)
 
 AdminExecuteSequence = Table('AdminExecuteSequence')
-AdminExecuteSequence.add_field(1,'Action',11592)
+AdminExecuteSequence.add_field(1,'Action',0x2DFF)
 AdminExecuteSequence.add_field(2,'Condition',7679)
 AdminExecuteSequence.add_field(3,'Sequence',5378)
 
@@ -28,12 +28,12 @@ Condition.add_field(2,'Level',9474)
 Condition.add_field(3,'Condition',7679)
 
 AdminUISequence = Table('AdminUISequence')
-AdminUISequence.add_field(1,'Action',11592)
+AdminUISequence.add_field(1,'Action',0x2DFF)
 AdminUISequence.add_field(2,'Condition',7679)
 AdminUISequence.add_field(3,'Sequence',5378)
 
 AdvtExecuteSequence = Table('AdvtExecuteSequence')
-AdvtExecuteSequence.add_field(1,'Action',11592)
+AdvtExecuteSequence.add_field(1,'Action',0x2DFF)
 AdvtExecuteSequence.add_field(2,'Condition',7679)
 AdvtExecuteSequence.add_field(3,'Sequence',5378)
 
@@ -83,7 +83,7 @@ Feature.add_field(3,'Title',8000)
 Feature.add_field(4,'Description',8191)
 Feature.add_field(5,'Display',5378)
 Feature.add_field(6,'Level',1282)
-Feature.add_field(7,'Directory_',7496)
+Feature.add_field(7,'Directory_',0x1DFF)
 Feature.add_field(8,'Attributes',1282)
 
 Binary = Table('Binary')
@@ -91,15 +91,15 @@ Binary.add_field(1,'Name',11592)
 Binary.add_field(2,'Data',2304)
 
 BindImage = Table('BindImage')
-BindImage.add_field(1,'File_',11592)
+BindImage.add_field(1,'File_',0x2DFF)
 BindImage.add_field(2,'Path',7679)
 
 File = Table('File')
-File.add_field(1,'File',11592)
-File.add_field(2,'Component_',3400)
+File.add_field(1,'File',0x2DFF)
+File.add_field(2,'Component_',0xDFF)
 File.add_field(3,'FileName',4095)
 File.add_field(4,'FileSize',260)
-File.add_field(5,'Version',7496)
+File.add_field(5,'Version',0x1DFF)
 File.add_field(6,'Language',7444)
 File.add_field(7,'Attributes',5378)
 File.add_field(8,'Sequence',1282)
@@ -114,7 +114,7 @@ CheckBox.add_field(2,'Value',7488)
 Class = Table('Class')
 Class.add_field(1,'CLSID',11558)
 Class.add_field(2,'Context',11552)
-Class.add_field(3,'Component_',11592)
+Class.add_field(3,'Component_',0x2DFF)
 Class.add_field(4,'ProgId_Default',7679)
 Class.add_field(5,'Description',8191)
 Class.add_field(6,'AppId_',7462)
@@ -127,12 +127,12 @@ Class.add_field(12,'Feature_',3366)
 Class.add_field(13,'Attributes',5378)
 
 Component = Table('Component')
-Component.add_field(1,'Component',11592)
+Component.add_field(1,'Component',0x2DFF)
 Component.add_field(2,'ComponentId',7462)
-Component.add_field(3,'Directory_',3400)
+Component.add_field(3,'Directory_',0xDFF)
 Component.add_field(4,'Attributes',1282)
 Component.add_field(5,'Condition',7679)
-Component.add_field(6,'KeyPath',7496)
+Component.add_field(6,'KeyPath',0x1DFF)
 
 Icon = Table('Icon')
 Icon.add_field(1,'Name',11592)
@@ -158,12 +158,12 @@ CompLocator.add_field(2,'ComponentId',3366)
 CompLocator.add_field(3,'Type',5378)
 
 Complus = Table('Complus')
-Complus.add_field(1,'Component_',11592)
+Complus.add_field(1,'Component_',0x2DFF)
 Complus.add_field(2,'ExpType',13570)
 
 Directory = Table('Directory')
-Directory.add_field(1,'Directory',11592)
-Directory.add_field(2,'Directory_Parent',7496)
+Directory.add_field(1,'Directory',0x2DFF)
+Directory.add_field(2,'Directory_Parent',0x1DFF)
 Directory.add_field(3,'DefaultDir',4095)
 
 Control = Table('Control')
@@ -207,13 +207,13 @@ ControlEvent.add_field(5,'Condition',15871)
 ControlEvent.add_field(6,'Ordering',5378)
 
 CreateFolder = Table('CreateFolder')
-CreateFolder.add_field(1,'Directory_',11592)
-CreateFolder.add_field(2,'Component_',11592)
+CreateFolder.add_field(1,'Directory_',0x2DFF)
+CreateFolder.add_field(2,'Component_',0x2DFF)
 
 CustomAction = Table('CustomAction')
-CustomAction.add_field(1,'Action',11592)
+CustomAction.add_field(1,'Action',0x2DFF)
 CustomAction.add_field(2,'Type',1282)
-CustomAction.add_field(3,'Source',7496)
+CustomAction.add_field(3,'Source',0x1DFF)
 CustomAction.add_field(4,'Target',7679)
 
 DrLocator = Table('DrLocator')
@@ -224,8 +224,8 @@ DrLocator.add_field(4,'Depth',5378)
 
 DuplicateFile = Table('DuplicateFile')
 DuplicateFile.add_field(1,'FileKey',11592)
-DuplicateFile.add_field(2,'Component_',3400)
-DuplicateFile.add_field(3,'File_',3400)
+DuplicateFile.add_field(2,'Component_',0xDFF)
+DuplicateFile.add_field(3,'File_',0xDFF)
 DuplicateFile.add_field(4,'DestName',8191)
 DuplicateFile.add_field(5,'DestFolder',7496)
 
@@ -233,7 +233,7 @@ Environment = Table('Environment')
 Environment.add_field(1,'Environment',11592)
 Environment.add_field(2,'Name',4095)
 Environment.add_field(3,'Value',8191)
-Environment.add_field(4,'Component_',3400)
+Environment.add_field(4,'Component_',0xDFF)
 
 Error = Table('Error')
 Error.add_field(1,'Error',9474)
@@ -247,7 +247,7 @@ EventMapping.add_field(4,'Attribute',3378)
 
 Extension = Table('Extension')
 Extension.add_field(1,'Extension',11775)
-Extension.add_field(2,'Component_',11592)
+Extension.add_field(2,'Component_',0x2DFF)
 Extension.add_field(3,'ProgId_',7679)
 Extension.add_field(4,'MIME_',7488)
 Extension.add_field(5,'Feature_',3366)
@@ -259,10 +259,10 @@ MIME.add_field(3,'CLSID',7462)
 
 FeatureComponents = Table('FeatureComponents')
 FeatureComponents.add_field(1,'Feature_',11558)
-FeatureComponents.add_field(2,'Component_',11592)
+FeatureComponents.add_field(2,'Component_',0x2DFF)
 
 FileSFPCatalog = Table('FileSFPCatalog')
-FileSFPCatalog.add_field(1,'File_',11592)
+FileSFPCatalog.add_field(1,'File_',0x2DFF)
 FileSFPCatalog.add_field(2,'SFPCatalog_',11775)
 
 SFPCatalog = Table('SFPCatalog')
@@ -271,7 +271,7 @@ SFPCatalog.add_field(2,'Catalog',2304)
 SFPCatalog.add_field(3,'Dependency',7424)
 
 Font = Table('Font')
-Font.add_field(1,'File_',11592)
+Font.add_field(1,'File_',0x2DFF)
 Font.add_field(2,'FontTitle',7552)
 
 IniFile = Table('IniFile')
@@ -282,7 +282,7 @@ IniFile.add_field(4,'Section',3936)
 IniFile.add_field(5,'Key',3968)
 IniFile.add_field(6,'Value',4095)
 IniFile.add_field(7,'Action',1282)
-IniFile.add_field(8,'Component_',3400)
+IniFile.add_field(8,'Component_',0xDFF)
 
 IniLocator = Table('IniLocator')
 IniLocator.add_field(1,'Signature_',11592)
@@ -293,18 +293,18 @@ IniLocator.add_field(5,'Field',5378)
 IniLocator.add_field(6,'Type',5378)
 
 InstallExecuteSequence = Table('InstallExecuteSequence')
-InstallExecuteSequence.add_field(1,'Action',11592)
+InstallExecuteSequence.add_field(1,'Action',0x2DFF)
 InstallExecuteSequence.add_field(2,'Condition',7679)
 InstallExecuteSequence.add_field(3,'Sequence',5378)
 
 InstallUISequence = Table('InstallUISequence')
-InstallUISequence.add_field(1,'Action',11592)
+InstallUISequence.add_field(1,'Action',0x2DFF)
 InstallUISequence.add_field(2,'Condition',7679)
 InstallUISequence.add_field(3,'Sequence',5378)
 
 IsolatedComponent = Table('IsolatedComponent')
-IsolatedComponent.add_field(1,'Component_Shared',11592)
-IsolatedComponent.add_field(2,'Component_Application',11592)
+IsolatedComponent.add_field(1,'Component_Shared',0x2DFF)
+IsolatedComponent.add_field(2,'Component_Application',0x2DFF)
 
 LaunchCondition = Table('LaunchCondition')
 LaunchCondition.add_field(1,'Condition',11775)
@@ -340,7 +340,7 @@ Media.add_field(6,'Source',7496)
 
 MoveFile = Table('MoveFile')
 MoveFile.add_field(1,'FileKey',11592)
-MoveFile.add_field(2,'Component_',3400)
+MoveFile.add_field(2,'Component_',0xDFF)
 MoveFile.add_field(3,'SourceName',8191)
 MoveFile.add_field(4,'DestName',8191)
 MoveFile.add_field(5,'SourceFolder',7496)
@@ -348,14 +348,14 @@ MoveFile.add_field(6,'DestFolder',3400)
 MoveFile.add_field(7,'Options',1282)
 
 MsiAssembly = Table('MsiAssembly')
-MsiAssembly.add_field(1,'Component_',11592)
+MsiAssembly.add_field(1,'Component_',0x2DFF)
 MsiAssembly.add_field(2,'Feature_',3366)
-MsiAssembly.add_field(3,'File_Manifest',7496)
-MsiAssembly.add_field(4,'File_Application',7496)
+MsiAssembly.add_field(3,'File_Manifest',0x1DFF)
+MsiAssembly.add_field(4,'File_Application',0x1DFF)
 MsiAssembly.add_field(5,'Attributes',5378)
 
 MsiAssemblyName = Table('MsiAssemblyName')
-MsiAssemblyName.add_field(1,'Component_',11592)
+MsiAssemblyName.add_field(1,'Component_',0x2DFF)
 MsiAssemblyName.add_field(2,'Name',11775)
 MsiAssemblyName.add_field(3,'Value',3583)
 
@@ -370,7 +370,7 @@ MsiDigitalSignature.add_field(3,'DigitalCertificate_',3400)
 MsiDigitalSignature.add_field(4,'Hash',6400)
 
 MsiFileHash = Table('MsiFileHash')
-MsiFileHash.add_field(1,'File_',11592)
+MsiFileHash.add_field(1,'File_',0x2DFF)
 MsiFileHash.add_field(2,'Options',1282)
 MsiFileHash.add_field(3,'HashPart1',260)
 MsiFileHash.add_field(4,'HashPart2',260)
@@ -388,14 +388,14 @@ ODBCAttribute.add_field(3,'Value',8191)
 
 ODBCDriver = Table('ODBCDriver')
 ODBCDriver.add_field(1,'Driver',11592)
-ODBCDriver.add_field(2,'Component_',3400)
+ODBCDriver.add_field(2,'Component_',0xDFF)
 ODBCDriver.add_field(3,'Description',3583)
-ODBCDriver.add_field(4,'File_',3400)
-ODBCDriver.add_field(5,'File_Setup',7496)
+ODBCDriver.add_field(4,'File_',0xDFF)
+ODBCDriver.add_field(5,'File_Setup',0x1DFF)
 
 ODBCDataSource = Table('ODBCDataSource')
-ODBCDataSource.add_field(1,'DataSource',11592)
-ODBCDataSource.add_field(2,'Component_',3400)
+ODBCDataSource.add_field(1,'DataSource',0x2DFF)
+ODBCDataSource.add_field(2,'Component_',0xDFF)
 ODBCDataSource.add_field(3,'Description',3583)
 ODBCDataSource.add_field(4,'DriverDescription',3583)
 ODBCDataSource.add_field(5,'Registration',1282)
@@ -407,10 +407,10 @@ ODBCSourceAttribute.add_field(3,'Value',8191)
 
 ODBCTranslator = Table('ODBCTranslator')
 ODBCTranslator.add_field(1,'Translator',11592)
-ODBCTranslator.add_field(2,'Component_',3400)
+ODBCTranslator.add_field(2,'Component_',0xDFF)
 ODBCTranslator.add_field(3,'Description',3583)
-ODBCTranslator.add_field(4,'File_',3400)
-ODBCTranslator.add_field(5,'File_Setup',7496)
+ODBCTranslator.add_field(4,'File_',0xDFF)
+ODBCTranslator.add_field(5,'File_Setup',0x1DFF)
 
 Patch = Table('Patch')
 Patch.add_field(1,'File_',11592)
@@ -427,7 +427,7 @@ PatchPackage.add_field(2,'Media_',1282)
 PublishComponent = Table('PublishComponent')
 PublishComponent.add_field(1,'ComponentId',11558)
 PublishComponent.add_field(2,'Qualifier',11775)
-PublishComponent.add_field(3,'Component_',11592)
+PublishComponent.add_field(3,'Component_',0x2DFF)
 PublishComponent.add_field(4,'AppData',8191)
 PublishComponent.add_field(5,'Feature_',3366)
 
@@ -443,12 +443,12 @@ RadioButton.add_field(8,'Text',8000)
 RadioButton.add_field(9,'Help',7986)
 
 Registry = Table('Registry')
-Registry.add_field(1,'Registry',11592)
+Registry.add_field(1,'Registry',0x2DFF)
 Registry.add_field(2,'Root',1282)
 Registry.add_field(3,'Key',4095)
 Registry.add_field(4,'Name',8191)
 Registry.add_field(5,'Value',7936)
-Registry.add_field(6,'Component_',3400)
+Registry.add_field(6,'Component_',0xDFF)
 
 RegLocator = Table('RegLocator')
 RegLocator.add_field(1,'Signature_',11592)
@@ -459,7 +459,7 @@ RegLocator.add_field(5,'Type',5378)
 
 RemoveFile = Table('RemoveFile')
 RemoveFile.add_field(1,'FileKey',11592)
-RemoveFile.add_field(2,'Component_',3400)
+RemoveFile.add_field(2,'Component_',0xDFF)
 RemoveFile.add_field(3,'FileName',8191)
 RemoveFile.add_field(4,'DirProperty',3400)
 RemoveFile.add_field(5,'InstallMode',1282)
@@ -472,24 +472,24 @@ RemoveIniFile.add_field(4,'Section',3936)
 RemoveIniFile.add_field(5,'Key',3968)
 RemoveIniFile.add_field(6,'Value',8191)
 RemoveIniFile.add_field(7,'Action',1282)
-RemoveIniFile.add_field(8,'Component_',3400)
+RemoveIniFile.add_field(8,'Component_',0xDFF)
 
 RemoveRegistry = Table('RemoveRegistry')
 RemoveRegistry.add_field(1,'RemoveRegistry',11592)
 RemoveRegistry.add_field(2,'Root',1282)
 RemoveRegistry.add_field(3,'Key',4095)
 RemoveRegistry.add_field(4,'Name',8191)
-RemoveRegistry.add_field(5,'Component_',3400)
+RemoveRegistry.add_field(5,'Component_',0xDFF)
 
 ReserveCost = Table('ReserveCost')
 ReserveCost.add_field(1,'ReserveKey',11592)
-ReserveCost.add_field(2,'Component_',3400)
+ReserveCost.add_field(2,'Component_',0xDFF)
 ReserveCost.add_field(3,'ReserveFolder',7496)
 ReserveCost.add_field(4,'ReserveLocal',260)
 ReserveCost.add_field(5,'ReserveSource',260)
 
 SelfReg = Table('SelfReg')
-SelfReg.add_field(1,'File_',11592)
+SelfReg.add_field(1,'File_',0x2DFF)
 SelfReg.add_field(2,'Cost',5378)
 
 ServiceControl = Table('ServiceControl')
@@ -498,7 +498,7 @@ ServiceControl.add_field(2,'Name',4095)
 ServiceControl.add_field(3,'Event',1282)
 ServiceControl.add_field(4,'Arguments',8191)
 ServiceControl.add_field(5,'Wait',5378)
-ServiceControl.add_field(6,'Component_',3400)
+ServiceControl.add_field(6,'Component_',0xDFF)
 
 ServiceInstall = Table('ServiceInstall')
 ServiceInstall.add_field(1,'ServiceInstall',11592)
@@ -512,14 +512,14 @@ ServiceInstall.add_field(8,'Dependencies',7679)
 ServiceInstall.add_field(9,'StartName',7679)
 ServiceInstall.add_field(10,'Password',7679)
 ServiceInstall.add_field(11,'Arguments',7679)
-ServiceInstall.add_field(12,'Component_',3400)
+ServiceInstall.add_field(12,'Component_',0xDFF)
 ServiceInstall.add_field(13,'Description',8191)
 
 Shortcut = Table('Shortcut')
 Shortcut.add_field(1,'Shortcut',11592)
-Shortcut.add_field(2,'Directory_',3400)
+Shortcut.add_field(2,'Directory_',0xDFF)
 Shortcut.add_field(3,'Name',3968)
-Shortcut.add_field(4,'Component_',3400)
+Shortcut.add_field(4,'Component_',0xDFF)
 Shortcut.add_field(5,'Target',3400)
 Shortcut.add_field(6,'Arguments',7679)
 Shortcut.add_field(7,'Description',8191)
@@ -550,10 +550,10 @@ TextStyle.add_field(5,'StyleBits',5378)
 TypeLib = Table('TypeLib')
 TypeLib.add_field(1,'LibID',11558)
 TypeLib.add_field(2,'Language',9474)
-TypeLib.add_field(3,'Component_',11592)
+TypeLib.add_field(3,'Component_',0x2DFF)
 TypeLib.add_field(4,'Version',4356)
 TypeLib.add_field(5,'Description',8064)
-TypeLib.add_field(6,'Directory_',7496)
+TypeLib.add_field(6,'Directory_',0x1DFF)
 TypeLib.add_field(7,'Feature_',3366)
 TypeLib.add_field(8,'Cost',4356)