Browse Source

Merge branch 'master' of https://github.com/panda3d/panda3d

David Rose 9 years ago
parent
commit
d73d02fc27
100 changed files with 2399 additions and 1858 deletions
  1. 6 6
      direct/src/dcparser/dcLexer.cxx.prebuilt
  2. 6 6
      direct/src/dcparser/dcLexer.lxx
  3. 2 2
      direct/src/dcparser/dcNumericRange.h
  4. 16 16
      direct/src/dcparser/dcPacker.I
  5. 2 2
      direct/src/dcparser/dcPacker.cxx
  6. 12 12
      direct/src/dcparser/dcPacker.h
  7. 24 24
      direct/src/dcparser/dcPackerInterface.I
  8. 4 4
      direct/src/dcparser/dcPackerInterface.cxx
  9. 10 10
      direct/src/dcparser/dcPackerInterface.h
  10. 2 2
      direct/src/dcparser/dcParserDefs.h
  11. 82 82
      direct/src/dcparser/dcSimpleParameter.cxx
  12. 5 5
      direct/src/dcparser/dcSimpleParameter.h
  13. 4 14
      direct/src/dcparser/dcbase.h
  14. 10 10
      direct/src/directdevices/DirectDeviceManager.py
  15. 1 1
      direct/src/distributed/cDistributedSmoothNodeBase.I
  16. 1 1
      direct/src/distributed/cDistributedSmoothNodeBase.cxx
  17. 3 3
      direct/src/distributed/cDistributedSmoothNodeBase.h
  18. 348 634
      dtool/src/cppparser/cppBison.cxx.prebuilt
  19. 185 198
      dtool/src/cppparser/cppBison.h.prebuilt
  20. 158 16
      dtool/src/cppparser/cppBison.yxx
  21. 66 13
      dtool/src/cppparser/cppEnumType.cxx
  22. 9 7
      dtool/src/cppparser/cppEnumType.h
  23. 1 1
      dtool/src/cppparser/cppExpression.cxx
  24. 6 0
      dtool/src/cppparser/cppExtensionType.cxx
  25. 2 0
      dtool/src/cppparser/cppExtensionType.h
  26. 19 3
      dtool/src/cppparser/cppMakeProperty.cxx
  27. 4 0
      dtool/src/cppparser/cppMakeProperty.h
  28. 2 0
      dtool/src/cppparser/cppPreprocessor.cxx
  29. 16 29
      dtool/src/cppparser/cppScope.cxx
  30. 1 3
      dtool/src/cppparser/cppScope.h
  31. 2 3
      dtool/src/cppparser/cppTemplateScope.cxx
  32. 1 3
      dtool/src/cppparser/cppTemplateScope.h
  33. 4 4
      dtool/src/dtoolbase/addHash.I
  34. 8 8
      dtool/src/dtoolbase/addHash.cxx
  35. 2 2
      dtool/src/dtoolbase/addHash.h
  36. 1 1
      dtool/src/dtoolbase/atomicAdjustI386Impl.h
  37. 2 0
      dtool/src/dtoolbase/dtoolbase.h
  38. 179 179
      dtool/src/dtoolbase/lookup3.c
  39. 3 3
      dtool/src/dtoolbase/lookup3.h
  40. 1 24
      dtool/src/dtoolbase/numeric_types.h
  41. 4 4
      dtool/src/dtoolbase/stl_compares.I
  42. 2 0
      dtool/src/dtoolbase/typeHandle.h
  43. 4 4
      dtool/src/dtoolbase/typeRegistry.cxx
  44. 3 0
      dtool/src/dtoolbase/typeRegistry.h
  45. 1 0
      dtool/src/dtoolutil/dSearchPath.h
  46. 1 0
      dtool/src/dtoolutil/pandaSystem.h
  47. 2 2
      dtool/src/dtoolutil/string_utils.I
  48. 1 1
      dtool/src/dtoolutil/string_utils.h
  49. 3 1
      dtool/src/interrogate/interfaceMaker.cxx
  50. 2 0
      dtool/src/interrogate/interfaceMaker.h
  51. 335 282
      dtool/src/interrogate/interfaceMakerPythonNative.cxx
  52. 88 19
      dtool/src/interrogate/interrogateBuilder.cxx
  53. 1 1
      dtool/src/interrogatedb/interrogateDatabase.cxx
  54. 36 0
      dtool/src/interrogatedb/interrogateElement.I
  55. 10 1
      dtool/src/interrogatedb/interrogateElement.cxx
  56. 9 0
      dtool/src/interrogatedb/interrogateElement.h
  57. 8 0
      dtool/src/interrogatedb/interrogateType.I
  58. 2 0
      dtool/src/interrogatedb/interrogateType.h
  59. 219 0
      dtool/src/interrogatedb/py_panda.I
  60. 139 13
      dtool/src/interrogatedb/py_panda.cxx
  61. 57 49
      dtool/src/interrogatedb/py_panda.h
  62. 1 1
      dtool/src/prc/configDeclaration.I
  63. 5 5
      dtool/src/prc/configDeclaration.cxx
  64. 3 3
      dtool/src/prc/configDeclaration.h
  65. 4 0
      dtool/src/prc/configPage.h
  66. 2 2
      dtool/src/prc/configVariable.I
  67. 2 2
      dtool/src/prc/configVariable.h
  68. 15 0
      dtool/src/prc/configVariableCore.h
  69. 10 10
      dtool/src/prc/configVariableInt64.I
  70. 1 1
      dtool/src/prc/configVariableInt64.cxx
  71. 11 11
      dtool/src/prc/configVariableInt64.h
  72. 2 0
      dtool/src/prc/configVariableManager.h
  73. 1 0
      dtool/src/prc/configVariableSearchPath.h
  74. 23 0
      dtool/src/prc/encryptStream.I
  75. 14 0
      dtool/src/prc/encryptStream.h
  76. 6 6
      dtool/src/prc/encryptStreamBuf.cxx
  77. 4 4
      dtool/src/prc/nativeNumericData.I
  78. 1 0
      dtool/src/prc/notifyCategory.h
  79. 28 28
      dtool/src/prc/streamReader.I
  80. 15 14
      dtool/src/prc/streamReader.h
  81. 3 0
      dtool/src/prc/streamWrapper.h
  82. 17 17
      dtool/src/prc/streamWriter.I
  83. 15 14
      dtool/src/prc/streamWriter.h
  84. 20 10
      makepanda/makepanda.py
  85. 12 4
      makepanda/makepandacore.py
  86. 1 1
      panda/src/audiotraits/openalAudioManager.cxx
  87. 2 2
      panda/src/audiotraits/openalAudioSound.cxx
  88. 7 7
      panda/src/bullet/bulletSoftBodyMaterial.I
  89. 11 7
      panda/src/bullet/bulletSoftBodyMaterial.h
  90. 2 0
      panda/src/chan/animGroup.h
  91. 6 0
      panda/src/chan/partBundle.h
  92. 2 0
      panda/src/chan/partBundleHandle.h
  93. 3 0
      panda/src/chan/partBundleNode.h
  94. 1 0
      panda/src/chan/partGroup.h
  95. 4 1
      panda/src/collide/collisionFloorMesh.h
  96. 4 0
      panda/src/collide/collisionHandlerEvent.h
  97. 1 0
      panda/src/collide/collisionHandlerQueue.h
  98. 1 0
      panda/src/collide/collisionNode.h
  99. 1 0
      panda/src/collide/collisionPolygon.h
  100. 1 0
      panda/src/collide/collisionTraverser.h

+ 6 - 6
direct/src/dcparser/dcLexer.cxx.prebuilt

@@ -1550,7 +1550,7 @@ YY_RULE_SETUP
   dcyylval.u.uint64 = 0;
   dcyylval.u.uint64 = 0;
   const char *p = dcyytext;
   const char *p = dcyytext;
   while (*p != '\0') {
   while (*p != '\0') {
-    PN_uint64 next_value = dcyylval.u.uint64 * 10;
+    uint64_t next_value = dcyylval.u.uint64 * 10;
     if (next_value < dcyylval.u.uint64) {
     if (next_value < dcyylval.u.uint64) {
       dcyyerror("Number out of range.");
       dcyyerror("Number out of range.");
       dcyylval.u.uint64 = 1;
       dcyylval.u.uint64 = 1;
@@ -1583,9 +1583,9 @@ YY_RULE_SETUP
     ++p;
     ++p;
   }
   }
 
 
-  PN_uint64 value = 0;
+  uint64_t value = 0;
   while (*p != '\0') {
   while (*p != '\0') {
-    PN_uint64 next_value = value * 10;
+    uint64_t next_value = value * 10;
     if (next_value < value) {
     if (next_value < value) {
       dcyyerror("Number out of range.");
       dcyyerror("Number out of range.");
       dcyylval.u.int64 = 1;
       dcyylval.u.int64 = 1;
@@ -1597,13 +1597,13 @@ YY_RULE_SETUP
   }
   }
 
 
   if (neg) {
   if (neg) {
-    dcyylval.u.int64 = -(PN_int64)value;
+    dcyylval.u.int64 = -(int64_t)value;
     if (dcyylval.u.int64 > 0) {
     if (dcyylval.u.int64 > 0) {
       dcyyerror("Number out of range.");
       dcyyerror("Number out of range.");
       dcyylval.u.int64 = 1;
       dcyylval.u.int64 = 1;
     }
     }
   } else {
   } else {
-    dcyylval.u.int64 = (PN_int64)value;
+    dcyylval.u.int64 = (int64_t)value;
     if (dcyylval.u.int64 < 0) {
     if (dcyylval.u.int64 < 0) {
       dcyyerror("Number out of range.");
       dcyyerror("Number out of range.");
       dcyylval.u.int64 = 1;
       dcyylval.u.int64 = 1;
@@ -1625,7 +1625,7 @@ YY_RULE_SETUP
   dcyylval.u.uint64 = 0;
   dcyylval.u.uint64 = 0;
   const char *p = dcyytext + 2;
   const char *p = dcyytext + 2;
   while (*p != '\0') {
   while (*p != '\0') {
-    PN_uint64 next_value = dcyylval.u.uint64 * 16;
+    uint64_t next_value = dcyylval.u.uint64 * 16;
     if (next_value < dcyylval.u.uint64) {
     if (next_value < dcyylval.u.uint64) {
       dcyyerror("Number out of range.");
       dcyyerror("Number out of range.");
       dcyylval.u.uint64 = 1;
       dcyylval.u.uint64 = 1;

+ 6 - 6
direct/src/dcparser/dcLexer.lxx

@@ -612,7 +612,7 @@ REALNUM              ([+-]?(([0-9]+[.])|([0-9]*[.][0-9]+))([eE][+-]?[0-9]+)?)
   dcyylval.u.uint64 = 0;
   dcyylval.u.uint64 = 0;
   const char *p = dcyytext;
   const char *p = dcyytext;
   while (*p != '\0') {
   while (*p != '\0') {
-    PN_uint64 next_value = dcyylval.u.uint64 * 10;
+    uint64_t next_value = dcyylval.u.uint64 * 10;
     if (next_value < dcyylval.u.uint64) {
     if (next_value < dcyylval.u.uint64) {
       dcyyerror("Number out of range.");
       dcyyerror("Number out of range.");
       dcyylval.u.uint64 = 1;
       dcyylval.u.uint64 = 1;
@@ -642,9 +642,9 @@ REALNUM              ([+-]?(([0-9]+[.])|([0-9]*[.][0-9]+))([eE][+-]?[0-9]+)?)
     ++p;
     ++p;
   }
   }
 
 
-  PN_uint64 value = 0;
+  uint64_t value = 0;
   while (*p != '\0') {
   while (*p != '\0') {
-    PN_uint64 next_value = value * 10;
+    uint64_t next_value = value * 10;
     if (next_value < value) {
     if (next_value < value) {
       dcyyerror("Number out of range.");
       dcyyerror("Number out of range.");
       dcyylval.u.int64 = 1;
       dcyylval.u.int64 = 1;
@@ -656,13 +656,13 @@ REALNUM              ([+-]?(([0-9]+[.])|([0-9]*[.][0-9]+))([eE][+-]?[0-9]+)?)
   }
   }
 
 
   if (neg) {
   if (neg) {
-    dcyylval.u.int64 = -(PN_int64)value;
+    dcyylval.u.int64 = -(int64_t)value;
     if (dcyylval.u.int64 > 0) {
     if (dcyylval.u.int64 > 0) {
       dcyyerror("Number out of range.");
       dcyyerror("Number out of range.");
       dcyylval.u.int64 = 1;
       dcyylval.u.int64 = 1;
     }
     }
   } else {
   } else {
-    dcyylval.u.int64 = (PN_int64)value;
+    dcyylval.u.int64 = (int64_t)value;
     if (dcyylval.u.int64 < 0) {
     if (dcyylval.u.int64 < 0) {
       dcyyerror("Number out of range.");
       dcyyerror("Number out of range.");
       dcyylval.u.int64 = 1;
       dcyylval.u.int64 = 1;
@@ -681,7 +681,7 @@ REALNUM              ([+-]?(([0-9]+[.])|([0-9]*[.][0-9]+))([eE][+-]?[0-9]+)?)
   dcyylval.u.uint64 = 0;
   dcyylval.u.uint64 = 0;
   const char *p = dcyytext + 2;
   const char *p = dcyytext + 2;
   while (*p != '\0') {
   while (*p != '\0') {
-    PN_uint64 next_value = dcyylval.u.uint64 * 16;
+    uint64_t next_value = dcyylval.u.uint64 * 16;
     if (next_value < dcyylval.u.uint64) {
     if (next_value < dcyylval.u.uint64) {
       dcyyerror("Number out of range.");
       dcyyerror("Number out of range.");
       dcyylval.u.uint64 = 1;
       dcyylval.u.uint64 = 1;

+ 2 - 2
direct/src/dcparser/dcNumericRange.h

@@ -71,8 +71,8 @@ private:
 
 
 typedef DCNumericRange<int> DCIntRange;
 typedef DCNumericRange<int> DCIntRange;
 typedef DCNumericRange<unsigned int> DCUnsignedIntRange;
 typedef DCNumericRange<unsigned int> DCUnsignedIntRange;
-typedef DCNumericRange<PN_int64> DCInt64Range;
-typedef DCNumericRange<PN_uint64> DCUnsignedInt64Range;
+typedef DCNumericRange<int64_t> DCInt64Range;
+typedef DCNumericRange<uint64_t> DCUnsignedInt64Range;
 typedef DCNumericRange<double> DCDoubleRange;
 typedef DCNumericRange<double> DCDoubleRange;
 
 
 #endif
 #endif

+ 16 - 16
direct/src/dcparser/dcPacker.I

@@ -178,7 +178,7 @@ pack_uint(unsigned int value) {
  * Packs the indicated numeric or string value into the stream.
  * Packs the indicated numeric or string value into the stream.
  */
  */
 INLINE void DCPacker::
 INLINE void DCPacker::
-pack_int64(PN_int64 value) {
+pack_int64(int64_t value) {
   nassertv(_mode == M_pack || _mode == M_repack);
   nassertv(_mode == M_pack || _mode == M_repack);
   if (_current_field == NULL) {
   if (_current_field == NULL) {
     _pack_error = true;
     _pack_error = true;
@@ -192,7 +192,7 @@ pack_int64(PN_int64 value) {
  * Packs the indicated numeric or string value into the stream.
  * Packs the indicated numeric or string value into the stream.
  */
  */
 INLINE void DCPacker::
 INLINE void DCPacker::
-pack_uint64(PN_uint64 value) {
+pack_uint64(uint64_t value) {
   nassertv(_mode == M_pack || _mode == M_repack);
   nassertv(_mode == M_pack || _mode == M_repack);
   if (_current_field == NULL) {
   if (_current_field == NULL) {
     _pack_error = true;
     _pack_error = true;
@@ -291,9 +291,9 @@ unpack_uint() {
 /**
 /**
  * Unpacks the current numeric or string value from the stream.
  * Unpacks the current numeric or string value from the stream.
  */
  */
-INLINE PN_int64 DCPacker::
+INLINE int64_t DCPacker::
 unpack_int64() {
 unpack_int64() {
-  PN_int64 value = 0;
+  int64_t value = 0;
   nassertr(_mode == M_unpack, value);
   nassertr(_mode == M_unpack, value);
   if (_current_field == NULL) {
   if (_current_field == NULL) {
     _pack_error = true;
     _pack_error = true;
@@ -310,9 +310,9 @@ unpack_int64() {
 /**
 /**
  * Unpacks the current numeric or string value from the stream.
  * Unpacks the current numeric or string value from the stream.
  */
  */
-INLINE PN_uint64 DCPacker::
+INLINE uint64_t DCPacker::
 unpack_uint64() {
 unpack_uint64() {
-  PN_uint64 value = 0;
+  uint64_t value = 0;
   nassertr(_mode == M_unpack, value);
   nassertr(_mode == M_unpack, value);
   if (_current_field == NULL) {
   if (_current_field == NULL) {
     _pack_error = true;
     _pack_error = true;
@@ -409,7 +409,7 @@ unpack_uint(unsigned int &value) {
  * Unpacks the current numeric or string value from the stream.
  * Unpacks the current numeric or string value from the stream.
  */
  */
 INLINE void DCPacker::
 INLINE void DCPacker::
-unpack_int64(PN_int64 &value) {
+unpack_int64(int64_t &value) {
   nassertv(_mode == M_unpack);
   nassertv(_mode == M_unpack);
   if (_current_field == NULL) {
   if (_current_field == NULL) {
     _pack_error = true;
     _pack_error = true;
@@ -425,7 +425,7 @@ unpack_int64(PN_int64 &value) {
  * Unpacks the current numeric or string value from the stream.
  * Unpacks the current numeric or string value from the stream.
  */
  */
 INLINE void DCPacker::
 INLINE void DCPacker::
-unpack_uint64(PN_uint64 &value) {
+unpack_uint64(uint64_t &value) {
   nassertv(_mode == M_unpack);
   nassertv(_mode == M_unpack);
   if (_current_field == NULL) {
   if (_current_field == NULL) {
     _pack_error = true;
     _pack_error = true;
@@ -668,7 +668,7 @@ raw_pack_int32(int value) {
  * Packs the data into the buffer between packing sessions.
  * Packs the data into the buffer between packing sessions.
  */
  */
 INLINE void DCPacker::
 INLINE void DCPacker::
-raw_pack_int64(PN_int64 value) {
+raw_pack_int64(int64_t value) {
   nassertv(_mode == M_idle);
   nassertv(_mode == M_idle);
   DCPackerInterface::do_pack_int64(_pack_data.get_write_pointer(8), value);
   DCPackerInterface::do_pack_int64(_pack_data.get_write_pointer(8), value);
 }
 }
@@ -704,7 +704,7 @@ raw_pack_uint32(unsigned int value) {
  * Packs the data into the buffer between packing sessions.
  * Packs the data into the buffer between packing sessions.
  */
  */
 INLINE void DCPacker::
 INLINE void DCPacker::
-raw_pack_uint64(PN_uint64 value) {
+raw_pack_uint64(uint64_t value) {
   nassertv(_mode == M_idle);
   nassertv(_mode == M_idle);
   DCPackerInterface::do_pack_uint64(_pack_data.get_write_pointer(8), value);
   DCPackerInterface::do_pack_uint64(_pack_data.get_write_pointer(8), value);
 }
 }
@@ -761,9 +761,9 @@ raw_unpack_int32() {
 /**
 /**
  * Unpacks the data from the buffer between unpacking sessions.
  * Unpacks the data from the buffer between unpacking sessions.
  */
  */
-INLINE PN_int64 DCPacker::
+INLINE int64_t DCPacker::
 raw_unpack_int64() {
 raw_unpack_int64() {
-  PN_int64 value = 0;
+  int64_t value = 0;
   raw_unpack_int64(value);
   raw_unpack_int64(value);
   return value;
   return value;
 }
 }
@@ -843,9 +843,9 @@ raw_unpack_uint32() {
 /**
 /**
  * Unpacks the data from the buffer between unpacking sessions.
  * Unpacks the data from the buffer between unpacking sessions.
  */
  */
-INLINE PN_uint64 DCPacker::
+INLINE uint64_t DCPacker::
 raw_unpack_uint64() {
 raw_unpack_uint64() {
-  PN_uint64 value = 0;
+  uint64_t value = 0;
   raw_unpack_uint64(value);
   raw_unpack_uint64(value);
   return value;
   return value;
 }
 }
@@ -874,7 +874,7 @@ raw_unpack_string() {
  * Unpacks the data from the buffer between unpacking sessions.
  * Unpacks the data from the buffer between unpacking sessions.
  */
  */
 INLINE void DCPacker::
 INLINE void DCPacker::
-raw_unpack_int64(PN_int64 &value) {
+raw_unpack_int64(int64_t &value) {
   nassertv(_mode == M_idle && _unpack_data != NULL);
   nassertv(_mode == M_idle && _unpack_data != NULL);
   if (_unpack_p + 8 > _unpack_length) {
   if (_unpack_p + 8 > _unpack_length) {
     _pack_error = true;
     _pack_error = true;
@@ -930,7 +930,7 @@ raw_unpack_uint32(unsigned int &value) {
  * Unpacks the data from the buffer between unpacking sessions.
  * Unpacks the data from the buffer between unpacking sessions.
  */
  */
 INLINE void DCPacker::
 INLINE void DCPacker::
-raw_unpack_uint64(PN_uint64 &value) {
+raw_unpack_uint64(uint64_t &value) {
   nassertv(_mode == M_idle && _unpack_data != NULL);
   nassertv(_mode == M_idle && _unpack_data != NULL);
   if (_unpack_p + 8 > _unpack_length) {
   if (_unpack_p + 8 > _unpack_length) {
     _pack_error = true;
     _pack_error = true;

+ 2 - 2
direct/src/dcparser/dcPacker.cxx

@@ -858,14 +858,14 @@ unpack_object() {
 
 
   case PT_int64:
   case PT_int64:
     {
     {
-      PN_int64 value = unpack_int64();
+      int64_t value = unpack_int64();
       object = PyLong_FromLongLong(value);
       object = PyLong_FromLongLong(value);
     }
     }
     break;
     break;
 
 
   case PT_uint64:
   case PT_uint64:
     {
     {
-      PN_uint64 value = unpack_uint64();
+      uint64_t value = unpack_uint64();
       object = PyLong_FromUnsignedLongLong(value);
       object = PyLong_FromUnsignedLongLong(value);
     }
     }
     break;
     break;

+ 12 - 12
direct/src/dcparser/dcPacker.h

@@ -72,8 +72,8 @@ PUBLISHED:
   INLINE void pack_double(double value);
   INLINE void pack_double(double value);
   INLINE void pack_int(int value);
   INLINE void pack_int(int value);
   INLINE void pack_uint(unsigned int value);
   INLINE void pack_uint(unsigned int value);
-  INLINE void pack_int64(PN_int64 value);
-  INLINE void pack_uint64(PN_uint64 value);
+  INLINE void pack_int64(int64_t value);
+  INLINE void pack_uint64(uint64_t value);
   INLINE void pack_string(const string &value);
   INLINE void pack_string(const string &value);
   INLINE void pack_literal_value(const string &value);
   INLINE void pack_literal_value(const string &value);
   void pack_default_value();
   void pack_default_value();
@@ -81,8 +81,8 @@ PUBLISHED:
   INLINE double unpack_double();
   INLINE double unpack_double();
   INLINE int unpack_int();
   INLINE int unpack_int();
   INLINE unsigned int unpack_uint();
   INLINE unsigned int unpack_uint();
-  INLINE PN_int64 unpack_int64();
-  INLINE PN_uint64 unpack_uint64();
+  INLINE int64_t unpack_int64();
+  INLINE uint64_t unpack_uint64();
   INLINE string unpack_string();
   INLINE string unpack_string();
   INLINE string unpack_literal_value();
   INLINE string unpack_literal_value();
   void unpack_validate();
   void unpack_validate();
@@ -94,8 +94,8 @@ public:
   INLINE void unpack_double(double &value);
   INLINE void unpack_double(double &value);
   INLINE void unpack_int(int &value);
   INLINE void unpack_int(int &value);
   INLINE void unpack_uint(unsigned int &value);
   INLINE void unpack_uint(unsigned int &value);
-  INLINE void unpack_int64(PN_int64 &value);
-  INLINE void unpack_uint64(PN_uint64 &value);
+  INLINE void unpack_int64(int64_t &value);
+  INLINE void unpack_uint64(uint64_t &value);
   INLINE void unpack_string(string &value);
   INLINE void unpack_string(string &value);
   INLINE void unpack_literal_value(string &value);
   INLINE void unpack_literal_value(string &value);
 
 
@@ -141,11 +141,11 @@ PUBLISHED:
   INLINE void raw_pack_int8(int value);
   INLINE void raw_pack_int8(int value);
   INLINE void raw_pack_int16(int value);
   INLINE void raw_pack_int16(int value);
   INLINE void raw_pack_int32(int value);
   INLINE void raw_pack_int32(int value);
-  INLINE void raw_pack_int64(PN_int64 value);
+  INLINE void raw_pack_int64(int64_t value);
   INLINE void raw_pack_uint8(unsigned int value);
   INLINE void raw_pack_uint8(unsigned int value);
   INLINE void raw_pack_uint16(unsigned int value);
   INLINE void raw_pack_uint16(unsigned int value);
   INLINE void raw_pack_uint32(unsigned int value);
   INLINE void raw_pack_uint32(unsigned int value);
-  INLINE void raw_pack_uint64(PN_uint64 value);
+  INLINE void raw_pack_uint64(uint64_t value);
   INLINE void raw_pack_float64(double value);
   INLINE void raw_pack_float64(double value);
   INLINE void raw_pack_string(const string &value);
   INLINE void raw_pack_string(const string &value);
 
 
@@ -158,11 +158,11 @@ PUBLISHED:
   INLINE int raw_unpack_int8();
   INLINE int raw_unpack_int8();
   INLINE int raw_unpack_int16();
   INLINE int raw_unpack_int16();
   INLINE int raw_unpack_int32();
   INLINE int raw_unpack_int32();
-  INLINE PN_int64 raw_unpack_int64();
+  INLINE int64_t raw_unpack_int64();
   INLINE unsigned int raw_unpack_uint8();
   INLINE unsigned int raw_unpack_uint8();
   INLINE unsigned int raw_unpack_uint16();
   INLINE unsigned int raw_unpack_uint16();
   INLINE unsigned int raw_unpack_uint32();
   INLINE unsigned int raw_unpack_uint32();
-  INLINE PN_uint64 raw_unpack_uint64();
+  INLINE uint64_t raw_unpack_uint64();
   INLINE double raw_unpack_float64();
   INLINE double raw_unpack_float64();
   INLINE string raw_unpack_string();
   INLINE string raw_unpack_string();
 
 
@@ -170,11 +170,11 @@ public:
   INLINE void raw_unpack_int8(int &value);
   INLINE void raw_unpack_int8(int &value);
   INLINE void raw_unpack_int16(int &value);
   INLINE void raw_unpack_int16(int &value);
   INLINE void raw_unpack_int32(int &value);
   INLINE void raw_unpack_int32(int &value);
-  INLINE void raw_unpack_int64(PN_int64 &value);
+  INLINE void raw_unpack_int64(int64_t &value);
   INLINE void raw_unpack_uint8(unsigned int &value);
   INLINE void raw_unpack_uint8(unsigned int &value);
   INLINE void raw_unpack_uint16(unsigned int &value);
   INLINE void raw_unpack_uint16(unsigned int &value);
   INLINE void raw_unpack_uint32(unsigned int &value);
   INLINE void raw_unpack_uint32(unsigned int &value);
-  INLINE void raw_unpack_uint64(PN_uint64 &value);
+  INLINE void raw_unpack_uint64(uint64_t &value);
   INLINE void raw_unpack_float64(double &value);
   INLINE void raw_unpack_float64(double &value);
   INLINE void raw_unpack_string(string &value);
   INLINE void raw_unpack_string(string &value);
 
 

+ 24 - 24
direct/src/dcparser/dcPackerInterface.I

@@ -142,7 +142,7 @@ do_pack_int32(char *buffer, int value) {
  *
  *
  */
  */
 INLINE void DCPackerInterface::
 INLINE void DCPackerInterface::
-do_pack_int64(char *buffer, PN_int64 value) {
+do_pack_int64(char *buffer, int64_t value) {
   buffer[0] = (char)(value & 0xff);
   buffer[0] = (char)(value & 0xff);
   buffer[1] = (char)((value >> 8) & 0xff);
   buffer[1] = (char)((value >> 8) & 0xff);
   buffer[2] = (char)((value >> 16) & 0xff);
   buffer[2] = (char)((value >> 16) & 0xff);
@@ -185,7 +185,7 @@ do_pack_uint32(char *buffer, unsigned int value) {
  *
  *
  */
  */
 INLINE void DCPackerInterface::
 INLINE void DCPackerInterface::
-do_pack_uint64(char *buffer, PN_uint64 value) {
+do_pack_uint64(char *buffer, uint64_t value) {
   buffer[0] = (char)(value & 0xff);
   buffer[0] = (char)(value & 0xff);
   buffer[1] = (char)((value >> 8) & 0xff);
   buffer[1] = (char)((value >> 8) & 0xff);
   buffer[2] = (char)((value >> 16) & 0xff);
   buffer[2] = (char)((value >> 16) & 0xff);
@@ -244,16 +244,16 @@ do_unpack_int32(const char *buffer) {
 /**
 /**
  *
  *
  */
  */
-INLINE PN_int64 DCPackerInterface::
+INLINE int64_t DCPackerInterface::
 do_unpack_int64(const char *buffer) {
 do_unpack_int64(const char *buffer) {
-  return (PN_int64)((PN_uint64)(unsigned char)buffer[0] |
-                    ((PN_uint64)(unsigned char)buffer[1] << 8) |
-                    ((PN_uint64)(unsigned char)buffer[2] << 16) |
-                    ((PN_uint64)(unsigned char)buffer[3] << 24) |
-                    ((PN_uint64)(unsigned char)buffer[4] << 32) |
-                    ((PN_uint64)(unsigned char)buffer[5] << 40) |
-                    ((PN_uint64)(unsigned char)buffer[6] << 48) |
-                    ((PN_int64)(signed char)buffer[7] << 54));
+  return (int64_t)((uint64_t)(unsigned char)buffer[0] |
+                    ((uint64_t)(unsigned char)buffer[1] << 8) |
+                    ((uint64_t)(unsigned char)buffer[2] << 16) |
+                    ((uint64_t)(unsigned char)buffer[3] << 24) |
+                    ((uint64_t)(unsigned char)buffer[4] << 32) |
+                    ((uint64_t)(unsigned char)buffer[5] << 40) |
+                    ((uint64_t)(unsigned char)buffer[6] << 48) |
+                    ((int64_t)(signed char)buffer[7] << 54));
 }
 }
 /**
 /**
  *
  *
@@ -286,16 +286,16 @@ do_unpack_uint32(const char *buffer) {
 /**
 /**
  *
  *
  */
  */
-INLINE PN_uint64 DCPackerInterface::
+INLINE uint64_t DCPackerInterface::
 do_unpack_uint64(const char *buffer) {
 do_unpack_uint64(const char *buffer) {
-  return ((PN_uint64)(unsigned char)buffer[0] |
-          ((PN_uint64)(unsigned char)buffer[1] << 8) |
-          ((PN_uint64)(unsigned char)buffer[2] << 16) |
-          ((PN_uint64)(unsigned char)buffer[3] << 24) |
-          ((PN_uint64)(unsigned char)buffer[4] << 32) |
-          ((PN_uint64)(unsigned char)buffer[5] << 40) |
-          ((PN_uint64)(unsigned char)buffer[6] << 48) |
-          ((PN_int64)(signed char)buffer[7] << 54));
+  return ((uint64_t)(unsigned char)buffer[0] |
+          ((uint64_t)(unsigned char)buffer[1] << 8) |
+          ((uint64_t)(unsigned char)buffer[2] << 16) |
+          ((uint64_t)(unsigned char)buffer[3] << 24) |
+          ((uint64_t)(unsigned char)buffer[4] << 32) |
+          ((uint64_t)(unsigned char)buffer[5] << 40) |
+          ((uint64_t)(unsigned char)buffer[6] << 48) |
+          ((int64_t)(signed char)buffer[7] << 54));
 }
 }
 
 
 
 
@@ -342,8 +342,8 @@ validate_int_limits(int value, int num_bits, bool &range_error) {
  * true if it does not.
  * true if it does not.
  */
  */
 INLINE void DCPackerInterface::
 INLINE void DCPackerInterface::
-validate_int64_limits(PN_int64 value, int num_bits, bool &range_error) {
-  PN_int64 mask = ((PN_int64)1 << (num_bits - 1)) - 1;
+validate_int64_limits(int64_t value, int num_bits, bool &range_error) {
+  int64_t mask = ((int64_t)1 << (num_bits - 1)) - 1;
   value |= mask;
   value |= mask;
 
 
   if (value != mask && value != -1) {
   if (value != mask && value != -1) {
@@ -373,8 +373,8 @@ validate_uint_limits(unsigned int value, int num_bits, bool &range_error) {
  * range_error true if it does not.
  * range_error true if it does not.
  */
  */
 INLINE void DCPackerInterface::
 INLINE void DCPackerInterface::
-validate_uint64_limits(PN_uint64 value, int num_bits, bool &range_error) {
-  PN_uint64 mask = ((PN_uint64)1 << num_bits) - 1;
+validate_uint64_limits(uint64_t value, int num_bits, bool &range_error) {
+  uint64_t mask = ((uint64_t)1 << num_bits) - 1;
   value &= ~mask;
   value &= ~mask;
 
 
   if (value != 0) {
   if (value != 0) {

+ 4 - 4
direct/src/dcparser/dcPackerInterface.cxx

@@ -226,7 +226,7 @@ pack_uint(DCPackData &, unsigned int, bool &pack_error, bool &) const {
  * Packs the indicated numeric or string value into the stream.
  * Packs the indicated numeric or string value into the stream.
  */
  */
 void DCPackerInterface::
 void DCPackerInterface::
-pack_int64(DCPackData &, PN_int64, bool &pack_error, bool &) const {
+pack_int64(DCPackData &, int64_t, bool &pack_error, bool &) const {
   pack_error = true;
   pack_error = true;
 }
 }
 
 
@@ -234,7 +234,7 @@ pack_int64(DCPackData &, PN_int64, bool &pack_error, bool &) const {
  * Packs the indicated numeric or string value into the stream.
  * Packs the indicated numeric or string value into the stream.
  */
  */
 void DCPackerInterface::
 void DCPackerInterface::
-pack_uint64(DCPackData &, PN_uint64, bool &pack_error, bool &) const {
+pack_uint64(DCPackData &, uint64_t, bool &pack_error, bool &) const {
   pack_error = true;
   pack_error = true;
 }
 }
 
 
@@ -284,7 +284,7 @@ unpack_uint(const char *, size_t, size_t &, unsigned int &, bool &pack_error, bo
  * Unpacks the current numeric or string value from the stream.
  * Unpacks the current numeric or string value from the stream.
  */
  */
 void DCPackerInterface::
 void DCPackerInterface::
-unpack_int64(const char *, size_t, size_t &, PN_int64 &, bool &pack_error, bool &) const {
+unpack_int64(const char *, size_t, size_t &, int64_t &, bool &pack_error, bool &) const {
   pack_error = true;
   pack_error = true;
 }
 }
 
 
@@ -292,7 +292,7 @@ unpack_int64(const char *, size_t, size_t &, PN_int64 &, bool &pack_error, bool
  * Unpacks the current numeric or string value from the stream.
  * Unpacks the current numeric or string value from the stream.
  */
  */
 void DCPackerInterface::
 void DCPackerInterface::
-unpack_uint64(const char *, size_t, size_t &, PN_uint64 &, bool &pack_error, bool &) const {
+unpack_uint64(const char *, size_t, size_t &, uint64_t &, bool &pack_error, bool &) const {
   pack_error = true;
   pack_error = true;
 }
 }
 
 

+ 10 - 10
direct/src/dcparser/dcPackerInterface.h

@@ -107,9 +107,9 @@ public:
                         bool &pack_error, bool &range_error) const;
                         bool &pack_error, bool &range_error) const;
   virtual void pack_uint(DCPackData &pack_data, unsigned int value,
   virtual void pack_uint(DCPackData &pack_data, unsigned int value,
                          bool &pack_error, bool &range_error) const;
                          bool &pack_error, bool &range_error) const;
-  virtual void pack_int64(DCPackData &pack_data, PN_int64 value,
+  virtual void pack_int64(DCPackData &pack_data, int64_t value,
                           bool &pack_error, bool &range_error) const;
                           bool &pack_error, bool &range_error) const;
-  virtual void pack_uint64(DCPackData &pack_data, PN_uint64 value,
+  virtual void pack_uint64(DCPackData &pack_data, uint64_t value,
                            bool &pack_error, bool &range_error) const;
                            bool &pack_error, bool &range_error) const;
   virtual void pack_string(DCPackData &pack_data, const string &value,
   virtual void pack_string(DCPackData &pack_data, const string &value,
                            bool &pack_error, bool &range_error) const;
                            bool &pack_error, bool &range_error) const;
@@ -122,9 +122,9 @@ public:
   virtual void unpack_uint(const char *data, size_t length, size_t &p,
   virtual void unpack_uint(const char *data, size_t length, size_t &p,
                            unsigned int &value, bool &pack_error, bool &range_error) const;
                            unsigned int &value, bool &pack_error, bool &range_error) const;
   virtual void unpack_int64(const char *data, size_t length, size_t &p,
   virtual void unpack_int64(const char *data, size_t length, size_t &p,
-                            PN_int64 &value, bool &pack_error, bool &range_error) const;
+                            int64_t &value, bool &pack_error, bool &range_error) const;
   virtual void unpack_uint64(const char *data, size_t length, size_t &p,
   virtual void unpack_uint64(const char *data, size_t length, size_t &p,
-                             PN_uint64 &value, bool &pack_error, bool &range_error) const;
+                             uint64_t &value, bool &pack_error, bool &range_error) const;
   virtual void unpack_string(const char *data, size_t length, size_t &p,
   virtual void unpack_string(const char *data, size_t length, size_t &p,
                              string &value, bool &pack_error, bool &range_error) const;
                              string &value, bool &pack_error, bool &range_error) const;
   virtual bool unpack_validate(const char *data, size_t length, size_t &p,
   virtual bool unpack_validate(const char *data, size_t length, size_t &p,
@@ -138,30 +138,30 @@ public:
   INLINE static void do_pack_int8(char *buffer, int value);
   INLINE static void do_pack_int8(char *buffer, int value);
   INLINE static void do_pack_int16(char *buffer, int value);
   INLINE static void do_pack_int16(char *buffer, int value);
   INLINE static void do_pack_int32(char *buffer, int value);
   INLINE static void do_pack_int32(char *buffer, int value);
-  INLINE static void do_pack_int64(char *buffer, PN_int64 value);
+  INLINE static void do_pack_int64(char *buffer, int64_t value);
   INLINE static void do_pack_uint8(char *buffer, unsigned int value);
   INLINE static void do_pack_uint8(char *buffer, unsigned int value);
   INLINE static void do_pack_uint16(char *buffer, unsigned int value);
   INLINE static void do_pack_uint16(char *buffer, unsigned int value);
   INLINE static void do_pack_uint32(char *buffer, unsigned int value);
   INLINE static void do_pack_uint32(char *buffer, unsigned int value);
-  INLINE static void do_pack_uint64(char *buffer, PN_uint64 value);
+  INLINE static void do_pack_uint64(char *buffer, uint64_t value);
   INLINE static void do_pack_float64(char *buffer, double value);
   INLINE static void do_pack_float64(char *buffer, double value);
 
 
   INLINE static int do_unpack_int8(const char *buffer);
   INLINE static int do_unpack_int8(const char *buffer);
   INLINE static int do_unpack_int16(const char *buffer);
   INLINE static int do_unpack_int16(const char *buffer);
   INLINE static int do_unpack_int32(const char *buffer);
   INLINE static int do_unpack_int32(const char *buffer);
-  INLINE static PN_int64 do_unpack_int64(const char *buffer);
+  INLINE static int64_t do_unpack_int64(const char *buffer);
   INLINE static unsigned int do_unpack_uint8(const char *buffer);
   INLINE static unsigned int do_unpack_uint8(const char *buffer);
   INLINE static unsigned int do_unpack_uint16(const char *buffer);
   INLINE static unsigned int do_unpack_uint16(const char *buffer);
   INLINE static unsigned int do_unpack_uint32(const char *buffer);
   INLINE static unsigned int do_unpack_uint32(const char *buffer);
-  INLINE static PN_uint64 do_unpack_uint64(const char *buffer);
+  INLINE static uint64_t do_unpack_uint64(const char *buffer);
   INLINE static double do_unpack_float64(const char *buffer);
   INLINE static double do_unpack_float64(const char *buffer);
 
 
   INLINE static void validate_int_limits(int value, int num_bits,
   INLINE static void validate_int_limits(int value, int num_bits,
                                          bool &range_error);
                                          bool &range_error);
-  INLINE static void validate_int64_limits(PN_int64 value, int num_bits,
+  INLINE static void validate_int64_limits(int64_t value, int num_bits,
                                            bool &range_error);
                                            bool &range_error);
   INLINE static void validate_uint_limits(unsigned int value, int num_bits,
   INLINE static void validate_uint_limits(unsigned int value, int num_bits,
                                           bool &range_error);
                                           bool &range_error);
-  INLINE static void validate_uint64_limits(PN_uint64 value, int num_bits,
+  INLINE static void validate_uint64_limits(uint64_t value, int num_bits,
                                             bool &range_error);
                                             bool &range_error);
 
 
   const DCPackerCatalog *get_catalog() const;
   const DCPackerCatalog *get_catalog() const;

+ 2 - 2
direct/src/dcparser/dcParserDefs.h

@@ -48,8 +48,8 @@ public:
   union U {
   union U {
     int s_int;
     int s_int;
     unsigned int s_uint;
     unsigned int s_uint;
-    PN_int64 int64;
-    PN_uint64 uint64;
+    int64_t int64;
+    uint64_t uint64;
     double real;
     double real;
     bool flag;
     bool flag;
     DCClass *dclass;
     DCClass *dclass;

+ 82 - 82
direct/src/dcparser/dcSimpleParameter.cxx

@@ -313,7 +313,7 @@ set_modulus(double modulus) {
 
 
   bool range_error = false;
   bool range_error = false;
   _double_modulus = modulus * _divisor;
   _double_modulus = modulus * _divisor;
-  _uint64_modulus = (PN_uint64)floor(_double_modulus + 0.5);
+  _uint64_modulus = (uint64_t)floor(_double_modulus + 0.5);
   _uint_modulus = (unsigned int)_uint64_modulus;
   _uint_modulus = (unsigned int)_uint64_modulus;
 
 
   // Check the range.  The legitimate range for a modulus value is 1 through
   // Check the range.  The legitimate range for a modulus value is 1 through
@@ -413,8 +413,8 @@ set_range(const DCDoubleRange &range) {
   case ST_int8array:
   case ST_int8array:
     _int_range.clear();
     _int_range.clear();
     for (i = 0; i < num_ranges; i++) {
     for (i = 0; i < num_ranges; i++) {
-      PN_int64 min = (PN_int64)floor(range.get_min(i) * _divisor + 0.5);
-      PN_int64 max = (PN_int64)floor(range.get_max(i) * _divisor + 0.5);
+      int64_t min = (int64_t)floor(range.get_min(i) * _divisor + 0.5);
+      int64_t max = (int64_t)floor(range.get_max(i) * _divisor + 0.5);
       validate_int64_limits(min, 8, range_error);
       validate_int64_limits(min, 8, range_error);
       validate_int64_limits(max, 8, range_error);
       validate_int64_limits(max, 8, range_error);
       _int_range.add_range((int)min, (int)max);
       _int_range.add_range((int)min, (int)max);
@@ -425,8 +425,8 @@ set_range(const DCDoubleRange &range) {
   case ST_int16array:
   case ST_int16array:
     _int_range.clear();
     _int_range.clear();
     for (i = 0; i < num_ranges; i++) {
     for (i = 0; i < num_ranges; i++) {
-      PN_int64 min = (PN_int64)floor(range.get_min(i) * _divisor + 0.5);
-      PN_int64 max = (PN_int64)floor(range.get_max(i) * _divisor + 0.5);
+      int64_t min = (int64_t)floor(range.get_min(i) * _divisor + 0.5);
+      int64_t max = (int64_t)floor(range.get_max(i) * _divisor + 0.5);
       validate_int64_limits(min, 16, range_error);
       validate_int64_limits(min, 16, range_error);
       validate_int64_limits(max, 16, range_error);
       validate_int64_limits(max, 16, range_error);
       _int_range.add_range((int)min, (int)max);
       _int_range.add_range((int)min, (int)max);
@@ -437,8 +437,8 @@ set_range(const DCDoubleRange &range) {
   case ST_int32array:
   case ST_int32array:
     _int_range.clear();
     _int_range.clear();
     for (i = 0; i < num_ranges; i++) {
     for (i = 0; i < num_ranges; i++) {
-      PN_int64 min = (PN_int64)floor(range.get_min(i) * _divisor + 0.5);
-      PN_int64 max = (PN_int64)floor(range.get_max(i) * _divisor + 0.5);
+      int64_t min = (int64_t)floor(range.get_min(i) * _divisor + 0.5);
+      int64_t max = (int64_t)floor(range.get_max(i) * _divisor + 0.5);
       validate_int64_limits(min, 32, range_error);
       validate_int64_limits(min, 32, range_error);
       validate_int64_limits(max, 32, range_error);
       validate_int64_limits(max, 32, range_error);
       _int_range.add_range((int)min, (int)max);
       _int_range.add_range((int)min, (int)max);
@@ -448,8 +448,8 @@ set_range(const DCDoubleRange &range) {
   case ST_int64:
   case ST_int64:
     _int64_range.clear();
     _int64_range.clear();
     for (i = 0; i < num_ranges; i++) {
     for (i = 0; i < num_ranges; i++) {
-      PN_int64 min = (PN_int64)floor(range.get_min(i) * _divisor + 0.5);
-      PN_int64 max = (PN_int64)floor(range.get_max(i) * _divisor + 0.5);
+      int64_t min = (int64_t)floor(range.get_min(i) * _divisor + 0.5);
+      int64_t max = (int64_t)floor(range.get_max(i) * _divisor + 0.5);
       _int64_range.add_range(min, max);
       _int64_range.add_range(min, max);
     }
     }
     break;
     break;
@@ -459,8 +459,8 @@ set_range(const DCDoubleRange &range) {
   case ST_uint8array:
   case ST_uint8array:
     _uint_range.clear();
     _uint_range.clear();
     for (i = 0; i < num_ranges; i++) {
     for (i = 0; i < num_ranges; i++) {
-      PN_uint64 min = (PN_uint64)floor(range.get_min(i) * _divisor + 0.5);
-      PN_uint64 max = (PN_uint64)floor(range.get_max(i) * _divisor + 0.5);
+      uint64_t min = (uint64_t)floor(range.get_min(i) * _divisor + 0.5);
+      uint64_t max = (uint64_t)floor(range.get_max(i) * _divisor + 0.5);
       validate_uint64_limits(min, 8, range_error);
       validate_uint64_limits(min, 8, range_error);
       validate_uint64_limits(max, 8, range_error);
       validate_uint64_limits(max, 8, range_error);
       _uint_range.add_range((unsigned int)min, (unsigned int)max);
       _uint_range.add_range((unsigned int)min, (unsigned int)max);
@@ -471,8 +471,8 @@ set_range(const DCDoubleRange &range) {
   case ST_uint16array:
   case ST_uint16array:
     _uint_range.clear();
     _uint_range.clear();
     for (i = 0; i < num_ranges; i++) {
     for (i = 0; i < num_ranges; i++) {
-      PN_uint64 min = (PN_uint64)floor(range.get_min(i) * _divisor + 0.5);
-      PN_uint64 max = (PN_uint64)floor(range.get_max(i) * _divisor + 0.5);
+      uint64_t min = (uint64_t)floor(range.get_min(i) * _divisor + 0.5);
+      uint64_t max = (uint64_t)floor(range.get_max(i) * _divisor + 0.5);
       validate_uint64_limits(min, 16, range_error);
       validate_uint64_limits(min, 16, range_error);
       validate_uint64_limits(max, 16, range_error);
       validate_uint64_limits(max, 16, range_error);
       _uint_range.add_range((unsigned int)min, (unsigned int)max);
       _uint_range.add_range((unsigned int)min, (unsigned int)max);
@@ -483,8 +483,8 @@ set_range(const DCDoubleRange &range) {
   case ST_uint32array:
   case ST_uint32array:
     _uint_range.clear();
     _uint_range.clear();
     for (i = 0; i < num_ranges; i++) {
     for (i = 0; i < num_ranges; i++) {
-      PN_uint64 min = (PN_uint64)floor(range.get_min(i) * _divisor + 0.5);
-      PN_uint64 max = (PN_uint64)floor(range.get_max(i) * _divisor + 0.5);
+      uint64_t min = (uint64_t)floor(range.get_min(i) * _divisor + 0.5);
+      uint64_t max = (uint64_t)floor(range.get_max(i) * _divisor + 0.5);
       validate_uint64_limits(min, 32, range_error);
       validate_uint64_limits(min, 32, range_error);
       validate_uint64_limits(max, 32, range_error);
       validate_uint64_limits(max, 32, range_error);
       _uint_range.add_range((unsigned int)min, (unsigned int)max);
       _uint_range.add_range((unsigned int)min, (unsigned int)max);
@@ -494,8 +494,8 @@ set_range(const DCDoubleRange &range) {
   case ST_uint64:
   case ST_uint64:
     _uint64_range.clear();
     _uint64_range.clear();
     for (i = 0; i < num_ranges; i++) {
     for (i = 0; i < num_ranges; i++) {
-      PN_uint64 min = (PN_uint64)floor(range.get_min(i) * _divisor + 0.5);
-      PN_uint64 max = (PN_uint64)floor(range.get_max(i) * _divisor + 0.5);
+      uint64_t min = (uint64_t)floor(range.get_min(i) * _divisor + 0.5);
+      uint64_t max = (uint64_t)floor(range.get_max(i) * _divisor + 0.5);
       _uint64_range.add_range(min, max);
       _uint64_range.add_range(min, max);
     }
     }
     break;
     break;
@@ -513,8 +513,8 @@ set_range(const DCDoubleRange &range) {
   case ST_blob:
   case ST_blob:
     _uint_range.clear();
     _uint_range.clear();
     for (i = 0; i < num_ranges; i++) {
     for (i = 0; i < num_ranges; i++) {
-      PN_uint64 min = (PN_uint64)floor(range.get_min(i) * _divisor + 0.5);
-      PN_uint64 max = (PN_uint64)floor(range.get_max(i) * _divisor + 0.5);
+      uint64_t min = (uint64_t)floor(range.get_min(i) * _divisor + 0.5);
+      uint64_t max = (uint64_t)floor(range.get_max(i) * _divisor + 0.5);
       validate_uint64_limits(min, 16, range_error);
       validate_uint64_limits(min, 16, range_error);
       validate_uint64_limits(max, 16, range_error);
       validate_uint64_limits(max, 16, range_error);
       _uint_range.add_range((unsigned int)min, (unsigned int)max);
       _uint_range.add_range((unsigned int)min, (unsigned int)max);
@@ -536,8 +536,8 @@ set_range(const DCDoubleRange &range) {
   case ST_blob32:
   case ST_blob32:
     _uint_range.clear();
     _uint_range.clear();
     for (i = 0; i < num_ranges; i++) {
     for (i = 0; i < num_ranges; i++) {
-      PN_uint64 min = (PN_uint64)floor(range.get_min(i) * _divisor + 0.5);
-      PN_uint64 max = (PN_uint64)floor(range.get_max(i) * _divisor + 0.5);
+      uint64_t min = (uint64_t)floor(range.get_min(i) * _divisor + 0.5);
+      uint64_t max = (uint64_t)floor(range.get_max(i) * _divisor + 0.5);
       validate_uint64_limits(min, 32, range_error);
       validate_uint64_limits(min, 32, range_error);
       validate_uint64_limits(max, 32, range_error);
       validate_uint64_limits(max, 32, range_error);
       _uint_range.add_range((unsigned int)min, (unsigned int)max);
       _uint_range.add_range((unsigned int)min, (unsigned int)max);
@@ -634,7 +634,7 @@ pack_double(DCPackData &pack_data, double value,
 
 
   case ST_int64:
   case ST_int64:
     {
     {
-      PN_int64 int64_value = (PN_int64)floor(real_value + 0.5);
+      int64_t int64_value = (int64_t)floor(real_value + 0.5);
       _int64_range.validate(int64_value, range_error);
       _int64_range.validate(int64_value, range_error);
       do_pack_int64(pack_data.get_write_pointer(8), int64_value);
       do_pack_int64(pack_data.get_write_pointer(8), int64_value);
     }
     }
@@ -669,7 +669,7 @@ pack_double(DCPackData &pack_data, double value,
 
 
   case ST_uint64:
   case ST_uint64:
     {
     {
-      PN_uint64 int64_value = (PN_uint64)floor(real_value + 0.5);
+      uint64_t int64_value = (uint64_t)floor(real_value + 0.5);
       _uint64_range.validate(int64_value, range_error);
       _uint64_range.validate(int64_value, range_error);
       do_pack_uint64(pack_data.get_write_pointer(8), int64_value);
       do_pack_uint64(pack_data.get_write_pointer(8), int64_value);
     }
     }
@@ -696,7 +696,7 @@ pack_int(DCPackData &pack_data, int value,
   if (value != 0 && (int_value / value) != (int)_divisor) {
   if (value != 0 && (int_value / value) != (int)_divisor) {
     // If we've experienced overflow after applying the divisor, pack it as an
     // If we've experienced overflow after applying the divisor, pack it as an
     // int64 instead.
     // int64 instead.
-    pack_int64(pack_data, (PN_int64)value, pack_error, range_error);
+    pack_int64(pack_data, (int64_t)value, pack_error, range_error);
     return;
     return;
   }
   }
 
 
@@ -859,9 +859,9 @@ pack_uint(DCPackData &pack_data, unsigned int value,
  * Packs the indicated numeric or string value into the stream.
  * Packs the indicated numeric or string value into the stream.
  */
  */
 void DCSimpleParameter::
 void DCSimpleParameter::
-pack_int64(DCPackData &pack_data, PN_int64 value,
+pack_int64(DCPackData &pack_data, int64_t value,
             bool &pack_error, bool &range_error) const {
             bool &pack_error, bool &range_error) const {
-  PN_int64 int_value = value * _divisor;
+  int64_t int_value = value * _divisor;
   if (_has_modulus && _uint64_modulus != 0) {
   if (_has_modulus && _uint64_modulus != 0) {
     if (int_value < 0) {
     if (int_value < 0) {
       int_value = _uint64_modulus - 1 - (-int_value - 1) % _uint64_modulus;
       int_value = _uint64_modulus - 1 - (-int_value - 1) % _uint64_modulus;
@@ -899,35 +899,35 @@ pack_int64(DCPackData &pack_data, PN_int64 value,
     if (int_value < 0) {
     if (int_value < 0) {
       range_error = true;
       range_error = true;
     }
     }
-    _uint_range.validate((unsigned int)(PN_uint64)int_value, range_error);
-    validate_uint64_limits((PN_uint64)int_value, 8, range_error);
-    do_pack_uint8(pack_data.get_write_pointer(1), (unsigned int)(PN_uint64)int_value);
+    _uint_range.validate((unsigned int)(uint64_t)int_value, range_error);
+    validate_uint64_limits((uint64_t)int_value, 8, range_error);
+    do_pack_uint8(pack_data.get_write_pointer(1), (unsigned int)(uint64_t)int_value);
     break;
     break;
 
 
   case ST_uint16:
   case ST_uint16:
     if (int_value < 0) {
     if (int_value < 0) {
       range_error = true;
       range_error = true;
     }
     }
-    _uint_range.validate((unsigned int)(PN_uint64)int_value, range_error);
-    validate_uint64_limits((PN_uint64)int_value, 16, range_error);
-    do_pack_uint16(pack_data.get_write_pointer(2), (unsigned int)(PN_uint64)int_value);
+    _uint_range.validate((unsigned int)(uint64_t)int_value, range_error);
+    validate_uint64_limits((uint64_t)int_value, 16, range_error);
+    do_pack_uint16(pack_data.get_write_pointer(2), (unsigned int)(uint64_t)int_value);
     break;
     break;
 
 
   case ST_uint32:
   case ST_uint32:
     if (int_value < 0) {
     if (int_value < 0) {
       range_error = true;
       range_error = true;
     }
     }
-    _uint_range.validate((unsigned int)(PN_uint64)int_value, range_error);
-    validate_uint64_limits((PN_uint64)int_value, 32, range_error);
-    do_pack_uint32(pack_data.get_write_pointer(4), (unsigned int)(PN_uint64)int_value);
+    _uint_range.validate((unsigned int)(uint64_t)int_value, range_error);
+    validate_uint64_limits((uint64_t)int_value, 32, range_error);
+    do_pack_uint32(pack_data.get_write_pointer(4), (unsigned int)(uint64_t)int_value);
     break;
     break;
 
 
   case ST_uint64:
   case ST_uint64:
     if (int_value < 0) {
     if (int_value < 0) {
       range_error = true;
       range_error = true;
     }
     }
-    _uint64_range.validate((PN_uint64)int_value, range_error);
-    do_pack_uint64(pack_data.get_write_pointer(8), (PN_uint64)int_value);
+    _uint64_range.validate((uint64_t)int_value, range_error);
+    do_pack_uint64(pack_data.get_write_pointer(8), (uint64_t)int_value);
     break;
     break;
 
 
   case ST_float64:
   case ST_float64:
@@ -944,47 +944,47 @@ pack_int64(DCPackData &pack_data, PN_int64 value,
  * Packs the indicated numeric or string value into the stream.
  * Packs the indicated numeric or string value into the stream.
  */
  */
 void DCSimpleParameter::
 void DCSimpleParameter::
-pack_uint64(DCPackData &pack_data, PN_uint64 value,
+pack_uint64(DCPackData &pack_data, uint64_t value,
             bool &pack_error, bool &range_error) const {
             bool &pack_error, bool &range_error) const {
-  PN_uint64 int_value = value * _divisor;
+  uint64_t int_value = value * _divisor;
   if (_has_modulus && _uint64_modulus != 0) {
   if (_has_modulus && _uint64_modulus != 0) {
     int_value = int_value % _uint64_modulus;
     int_value = int_value % _uint64_modulus;
   }
   }
 
 
   switch (_type) {
   switch (_type) {
   case ST_int8:
   case ST_int8:
-    if ((PN_int64)int_value < 0) {
+    if ((int64_t)int_value < 0) {
       range_error = true;
       range_error = true;
     }
     }
-    _int_range.validate((int)(PN_int64)int_value, range_error);
-    validate_int64_limits((PN_int64)int_value, 8, range_error);
-    do_pack_int8(pack_data.get_write_pointer(1), (int)(PN_int64)int_value);
+    _int_range.validate((int)(int64_t)int_value, range_error);
+    validate_int64_limits((int64_t)int_value, 8, range_error);
+    do_pack_int8(pack_data.get_write_pointer(1), (int)(int64_t)int_value);
     break;
     break;
 
 
   case ST_int16:
   case ST_int16:
-    if ((PN_int64)int_value < 0) {
+    if ((int64_t)int_value < 0) {
       range_error = true;
       range_error = true;
     }
     }
-    _int_range.validate((int)(PN_int64)int_value, range_error);
-    validate_int64_limits((PN_int64)int_value, 16, range_error);
-    do_pack_int16(pack_data.get_write_pointer(2), (int)(PN_int64)int_value);
+    _int_range.validate((int)(int64_t)int_value, range_error);
+    validate_int64_limits((int64_t)int_value, 16, range_error);
+    do_pack_int16(pack_data.get_write_pointer(2), (int)(int64_t)int_value);
     break;
     break;
 
 
   case ST_int32:
   case ST_int32:
-    if ((PN_int64)int_value < 0) {
+    if ((int64_t)int_value < 0) {
       range_error = true;
       range_error = true;
     }
     }
-    _int_range.validate((int)(PN_int64)int_value, range_error);
-    validate_int64_limits((PN_int64)int_value, 32, range_error);
-    do_pack_int32(pack_data.get_write_pointer(4), (int)(PN_int64)int_value);
+    _int_range.validate((int)(int64_t)int_value, range_error);
+    validate_int64_limits((int64_t)int_value, 32, range_error);
+    do_pack_int32(pack_data.get_write_pointer(4), (int)(int64_t)int_value);
     break;
     break;
 
 
   case ST_int64:
   case ST_int64:
-    if ((PN_int64)int_value < 0) {
+    if ((int64_t)int_value < 0) {
       range_error = true;
       range_error = true;
     }
     }
-    _int64_range.validate((PN_int64)int_value, range_error);
-    do_pack_int64(pack_data.get_write_pointer(8), (PN_int64)int_value);
+    _int64_range.validate((int64_t)int_value, range_error);
+    do_pack_int64(pack_data.get_write_pointer(8), (int64_t)int_value);
     break;
     break;
 
 
   case ST_char:
   case ST_char:
@@ -1213,7 +1213,7 @@ unpack_double(const char *data, size_t length, size_t &p, double &value,
         pack_error = true;
         pack_error = true;
         return;
         return;
       }
       }
-      PN_int64 int_value = do_unpack_int64(data + p);
+      int64_t int_value = do_unpack_int64(data + p);
       _int64_range.validate(int_value, range_error);
       _int64_range.validate(int_value, range_error);
       value = (double)int_value;
       value = (double)int_value;
       p += 8;
       p += 8;
@@ -1266,7 +1266,7 @@ unpack_double(const char *data, size_t length, size_t &p, double &value,
         pack_error = true;
         pack_error = true;
         return;
         return;
       }
       }
-      PN_uint64 uint_value = do_unpack_uint64(data + p);
+      uint64_t uint_value = do_unpack_uint64(data + p);
       _uint64_range.validate(uint_value, range_error);
       _uint64_range.validate(uint_value, range_error);
       value = (double)uint_value;
       value = (double)uint_value;
       p += 8;
       p += 8;
@@ -1340,7 +1340,7 @@ unpack_int(const char *data, size_t length, size_t &p, int &value,
         pack_error = true;
         pack_error = true;
         return;
         return;
       }
       }
-      PN_int64 int_value = do_unpack_uint64(data + p);
+      int64_t int_value = do_unpack_uint64(data + p);
       _int64_range.validate(int_value, range_error);
       _int64_range.validate(int_value, range_error);
       value = (int)int_value;
       value = (int)int_value;
       if (value != int_value) {
       if (value != int_value) {
@@ -1400,7 +1400,7 @@ unpack_int(const char *data, size_t length, size_t &p, int &value,
         pack_error = true;
         pack_error = true;
         return;
         return;
       }
       }
-      PN_uint64 uint_value = do_unpack_uint64(data + p);
+      uint64_t uint_value = do_unpack_uint64(data + p);
       _uint64_range.validate(uint_value, range_error);
       _uint64_range.validate(uint_value, range_error);
       value = (int)(unsigned int)uint_value;
       value = (int)(unsigned int)uint_value;
       if ((unsigned int)value != uint_value || value < 0) {
       if ((unsigned int)value != uint_value || value < 0) {
@@ -1496,7 +1496,7 @@ unpack_uint(const char *data, size_t length, size_t &p, unsigned int &value,
         pack_error = true;
         pack_error = true;
         return;
         return;
       }
       }
-      PN_int64 int_value = do_unpack_int64(data + p);
+      int64_t int_value = do_unpack_int64(data + p);
       _int64_range.validate(int_value, range_error);
       _int64_range.validate(int_value, range_error);
       if (int_value < 0) {
       if (int_value < 0) {
         pack_error = true;
         pack_error = true;
@@ -1546,7 +1546,7 @@ unpack_uint(const char *data, size_t length, size_t &p, unsigned int &value,
         pack_error = true;
         pack_error = true;
         return;
         return;
       }
       }
-      PN_uint64 uint_value = do_unpack_uint64(data + p);
+      uint64_t uint_value = do_unpack_uint64(data + p);
       _uint64_range.validate(uint_value, range_error);
       _uint64_range.validate(uint_value, range_error);
       value = (unsigned int)uint_value;
       value = (unsigned int)uint_value;
       if (value != uint_value) {
       if (value != uint_value) {
@@ -1585,7 +1585,7 @@ unpack_uint(const char *data, size_t length, size_t &p, unsigned int &value,
  * Unpacks the current numeric or string value from the stream.
  * Unpacks the current numeric or string value from the stream.
  */
  */
 void DCSimpleParameter::
 void DCSimpleParameter::
-unpack_int64(const char *data, size_t length, size_t &p, PN_int64 &value,
+unpack_int64(const char *data, size_t length, size_t &p, int64_t &value,
               bool &pack_error, bool &range_error) const {
               bool &pack_error, bool &range_error) const {
   switch (_type) {
   switch (_type) {
   case ST_int8:
   case ST_int8:
@@ -1596,7 +1596,7 @@ unpack_int64(const char *data, size_t length, size_t &p, PN_int64 &value,
       }
       }
       int int_value = do_unpack_int8(data + p);
       int int_value = do_unpack_int8(data + p);
       _int_range.validate(int_value, range_error);
       _int_range.validate(int_value, range_error);
-      value = (PN_int64)int_value;
+      value = (int64_t)int_value;
       p++;
       p++;
     }
     }
     break;
     break;
@@ -1609,7 +1609,7 @@ unpack_int64(const char *data, size_t length, size_t &p, PN_int64 &value,
       }
       }
       int int_value = do_unpack_int16(data + p);
       int int_value = do_unpack_int16(data + p);
       _int_range.validate(int_value, range_error);
       _int_range.validate(int_value, range_error);
-      value = (PN_int64)int_value;
+      value = (int64_t)int_value;
       p += 2;
       p += 2;
     }
     }
     break;
     break;
@@ -1622,7 +1622,7 @@ unpack_int64(const char *data, size_t length, size_t &p, PN_int64 &value,
       }
       }
       int int_value = do_unpack_int32(data + p);
       int int_value = do_unpack_int32(data + p);
       _int_range.validate(int_value, range_error);
       _int_range.validate(int_value, range_error);
-      value = (PN_int64)int_value;
+      value = (int64_t)int_value;
       p += 4;
       p += 4;
     }
     }
     break;
     break;
@@ -1646,7 +1646,7 @@ unpack_int64(const char *data, size_t length, size_t &p, PN_int64 &value,
       }
       }
       unsigned int uint_value = do_unpack_uint8(data + p);
       unsigned int uint_value = do_unpack_uint8(data + p);
       _uint_range.validate(uint_value, range_error);
       _uint_range.validate(uint_value, range_error);
-      value = (PN_int64)(int)uint_value;
+      value = (int64_t)(int)uint_value;
       p++;
       p++;
     }
     }
     break;
     break;
@@ -1659,7 +1659,7 @@ unpack_int64(const char *data, size_t length, size_t &p, PN_int64 &value,
       }
       }
       unsigned int uint_value = do_unpack_uint16(data + p);
       unsigned int uint_value = do_unpack_uint16(data + p);
       _uint_range.validate(uint_value, range_error);
       _uint_range.validate(uint_value, range_error);
-      value = (PN_int64)(int)uint_value;
+      value = (int64_t)(int)uint_value;
       p += 2;
       p += 2;
     }
     }
     break;
     break;
@@ -1672,7 +1672,7 @@ unpack_int64(const char *data, size_t length, size_t &p, PN_int64 &value,
       }
       }
       unsigned int uint_value = do_unpack_uint32(data + p);
       unsigned int uint_value = do_unpack_uint32(data + p);
       _uint_range.validate(uint_value, range_error);
       _uint_range.validate(uint_value, range_error);
-      value = (PN_int64)(int)uint_value;
+      value = (int64_t)(int)uint_value;
       p += 4;
       p += 4;
     }
     }
     break;
     break;
@@ -1683,9 +1683,9 @@ unpack_int64(const char *data, size_t length, size_t &p, PN_int64 &value,
         pack_error = true;
         pack_error = true;
         return;
         return;
       }
       }
-      PN_uint64 uint_value = do_unpack_uint64(data + p);
+      uint64_t uint_value = do_unpack_uint64(data + p);
       _uint64_range.validate(uint_value, range_error);
       _uint64_range.validate(uint_value, range_error);
-      value = (PN_int64)uint_value;
+      value = (int64_t)uint_value;
       if (value < 0) {
       if (value < 0) {
         pack_error = true;
         pack_error = true;
       }
       }
@@ -1701,7 +1701,7 @@ unpack_int64(const char *data, size_t length, size_t &p, PN_int64 &value,
       }
       }
       double real_value = do_unpack_float64(data + p);
       double real_value = do_unpack_float64(data + p);
       _double_range.validate(real_value, range_error);
       _double_range.validate(real_value, range_error);
-      value = (PN_int64)real_value;
+      value = (int64_t)real_value;
       p += 8;
       p += 8;
     }
     }
     break;
     break;
@@ -1722,7 +1722,7 @@ unpack_int64(const char *data, size_t length, size_t &p, PN_int64 &value,
  * Unpacks the current numeric or string value from the stream.
  * Unpacks the current numeric or string value from the stream.
  */
  */
 void DCSimpleParameter::
 void DCSimpleParameter::
-unpack_uint64(const char *data, size_t length, size_t &p, PN_uint64 &value,
+unpack_uint64(const char *data, size_t length, size_t &p, uint64_t &value,
               bool &pack_error, bool &range_error) const {
               bool &pack_error, bool &range_error) const {
   switch (_type) {
   switch (_type) {
   case ST_int8:
   case ST_int8:
@@ -1736,7 +1736,7 @@ unpack_uint64(const char *data, size_t length, size_t &p, PN_uint64 &value,
       if (int_value < 0) {
       if (int_value < 0) {
         pack_error = true;
         pack_error = true;
       }
       }
-      value = (PN_uint64)(unsigned int)int_value;
+      value = (uint64_t)(unsigned int)int_value;
       p++;
       p++;
     }
     }
     break;
     break;
@@ -1752,7 +1752,7 @@ unpack_uint64(const char *data, size_t length, size_t &p, PN_uint64 &value,
       if (int_value < 0) {
       if (int_value < 0) {
         pack_error = true;
         pack_error = true;
       }
       }
-      value = (PN_uint64)(unsigned int)int_value;
+      value = (uint64_t)(unsigned int)int_value;
       p += 2;
       p += 2;
     }
     }
     break;
     break;
@@ -1768,7 +1768,7 @@ unpack_uint64(const char *data, size_t length, size_t &p, PN_uint64 &value,
       if (int_value < 0) {
       if (int_value < 0) {
         pack_error = true;
         pack_error = true;
       }
       }
-      value = (PN_uint64)(unsigned int)int_value;
+      value = (uint64_t)(unsigned int)int_value;
       p += 4;
       p += 4;
     }
     }
     break;
     break;
@@ -1779,12 +1779,12 @@ unpack_uint64(const char *data, size_t length, size_t &p, PN_uint64 &value,
         pack_error = true;
         pack_error = true;
         return;
         return;
       }
       }
-      PN_int64 int_value = do_unpack_int64(data + p);
+      int64_t int_value = do_unpack_int64(data + p);
       _int64_range.validate(int_value, range_error);
       _int64_range.validate(int_value, range_error);
       if (int_value < 0) {
       if (int_value < 0) {
         pack_error = true;
         pack_error = true;
       }
       }
-      value = (PN_uint64)int_value;
+      value = (uint64_t)int_value;
       p += 8;
       p += 8;
     }
     }
     break;
     break;
@@ -1798,7 +1798,7 @@ unpack_uint64(const char *data, size_t length, size_t &p, PN_uint64 &value,
       }
       }
       unsigned int uint_value = do_unpack_uint8(data + p);
       unsigned int uint_value = do_unpack_uint8(data + p);
       _uint_range.validate(uint_value, range_error);
       _uint_range.validate(uint_value, range_error);
-      value = (PN_uint64)uint_value;
+      value = (uint64_t)uint_value;
       p++;
       p++;
     }
     }
     break;
     break;
@@ -1811,7 +1811,7 @@ unpack_uint64(const char *data, size_t length, size_t &p, PN_uint64 &value,
       }
       }
       unsigned int uint_value = do_unpack_uint16(data + p);
       unsigned int uint_value = do_unpack_uint16(data + p);
       _uint_range.validate(uint_value, range_error);
       _uint_range.validate(uint_value, range_error);
-      value = (PN_uint64)uint_value;
+      value = (uint64_t)uint_value;
       p += 2;
       p += 2;
     }
     }
     break;
     break;
@@ -1824,7 +1824,7 @@ unpack_uint64(const char *data, size_t length, size_t &p, PN_uint64 &value,
       }
       }
       unsigned int uint_value = do_unpack_uint32(data + p);
       unsigned int uint_value = do_unpack_uint32(data + p);
       _uint_range.validate(uint_value, range_error);
       _uint_range.validate(uint_value, range_error);
-      value = (PN_uint64)uint_value;
+      value = (uint64_t)uint_value;
       p += 4;
       p += 4;
     }
     }
     break;
     break;
@@ -1847,7 +1847,7 @@ unpack_uint64(const char *data, size_t length, size_t &p, PN_uint64 &value,
       }
       }
       double real_value = do_unpack_float64(data + p);
       double real_value = do_unpack_float64(data + p);
       _double_range.validate(real_value, range_error);
       _double_range.validate(real_value, range_error);
-      value = (PN_uint64)real_value;
+      value = (uint64_t)real_value;
       p += 8;
       p += 8;
     }
     }
     break;
     break;
@@ -1990,7 +1990,7 @@ unpack_validate(const char *data, size_t length, size_t &p,
         pack_error = true;
         pack_error = true;
         return true;
         return true;
       }
       }
-      PN_int64 int_value = do_unpack_int64(data + p);
+      int64_t int_value = do_unpack_int64(data + p);
       _int64_range.validate(int_value, range_error);
       _int64_range.validate(int_value, range_error);
       p += 8;
       p += 8;
     }
     }
@@ -2039,7 +2039,7 @@ unpack_validate(const char *data, size_t length, size_t &p,
         pack_error = true;
         pack_error = true;
         return true;
         return true;
       }
       }
-      PN_uint64 uint_value = do_unpack_uint64(data + p);
+      uint64_t uint_value = do_unpack_uint64(data + p);
       _uint64_range.validate(uint_value, range_error);
       _uint64_range.validate(uint_value, range_error);
       p += 8;
       p += 8;
     }
     }

+ 5 - 5
direct/src/dcparser/dcSimpleParameter.h

@@ -56,9 +56,9 @@ public:
                         bool &pack_error, bool &range_error) const;
                         bool &pack_error, bool &range_error) const;
   virtual void pack_uint(DCPackData &pack_data, unsigned int value,
   virtual void pack_uint(DCPackData &pack_data, unsigned int value,
                          bool &pack_error, bool &range_error) const;
                          bool &pack_error, bool &range_error) const;
-  virtual void pack_int64(DCPackData &pack_data, PN_int64 value,
+  virtual void pack_int64(DCPackData &pack_data, int64_t value,
                           bool &pack_error, bool &range_error) const;
                           bool &pack_error, bool &range_error) const;
-  virtual void pack_uint64(DCPackData &pack_data, PN_uint64 value,
+  virtual void pack_uint64(DCPackData &pack_data, uint64_t value,
                            bool &pack_error, bool &range_error) const;
                            bool &pack_error, bool &range_error) const;
   virtual void pack_string(DCPackData &pack_data, const string &value,
   virtual void pack_string(DCPackData &pack_data, const string &value,
                            bool &pack_error, bool &range_error) const;
                            bool &pack_error, bool &range_error) const;
@@ -71,9 +71,9 @@ public:
   virtual void unpack_uint(const char *data, size_t length, size_t &p,
   virtual void unpack_uint(const char *data, size_t length, size_t &p,
                            unsigned int &value, bool &pack_error, bool &range_error) const;
                            unsigned int &value, bool &pack_error, bool &range_error) const;
   virtual void unpack_int64(const char *data, size_t length, size_t &p,
   virtual void unpack_int64(const char *data, size_t length, size_t &p,
-                            PN_int64 &value, bool &pack_error, bool &range_error) const;
+                            int64_t &value, bool &pack_error, bool &range_error) const;
   virtual void unpack_uint64(const char *data, size_t length, size_t &p,
   virtual void unpack_uint64(const char *data, size_t length, size_t &p,
-                             PN_uint64 &value, bool &pack_error, bool &range_error) const;
+                             uint64_t &value, bool &pack_error, bool &range_error) const;
   virtual void unpack_string(const char *data, size_t length, size_t &p,
   virtual void unpack_string(const char *data, size_t length, size_t &p,
                              string &value, bool &pack_error, bool &range_error) const;
                              string &value, bool &pack_error, bool &range_error) const;
   virtual bool unpack_validate(const char *data, size_t length, size_t &p,
   virtual bool unpack_validate(const char *data, size_t length, size_t &p,
@@ -125,7 +125,7 @@ private:
 
 
   // All of these modulus values will be filled in, regardless of the type.
   // All of these modulus values will be filled in, regardless of the type.
   unsigned int _uint_modulus;
   unsigned int _uint_modulus;
-  PN_uint64 _uint64_modulus;
+  uint64_t _uint64_modulus;
   double _double_modulus;
   double _double_modulus;
 
 
   static DCClassParameter *_uint32uint8_type;
   static DCClassParameter *_uint32uint8_type;

+ 4 - 14
direct/src/dcparser/dcbase.h

@@ -102,17 +102,7 @@ typedef string Filename;
 #define pmap map
 #define pmap map
 #define pset set
 #define pset set
 
 
-#ifdef WIN32
-typedef __int64 PN_int64;
-typedef unsigned __int64 PN_uint64;
-#else
-typedef long long PN_int64;
-typedef unsigned long long PN_uint64;
-#endif
-
-typedef unsigned char PN_uint8;
-typedef unsigned short PN_uint16;
-typedef unsigned int PN_uint32;
+#include <stdint.h>
 
 
 typedef ifstream pifstream;
 typedef ifstream pifstream;
 typedef ofstream pofstream;
 typedef ofstream pofstream;
@@ -121,8 +111,8 @@ typedef fstream pfstream;
 #endif  // WITHIN_PANDA
 #endif  // WITHIN_PANDA
 
 
 // typedef       unsigned long   CHANNEL_TYPE;
 // typedef       unsigned long   CHANNEL_TYPE;
-typedef       PN_uint64   CHANNEL_TYPE;
-typedef       PN_uint32   DOID_TYPE;
-typedef       PN_uint32   ZONEID_TYPE;
+typedef       uint64_t   CHANNEL_TYPE;
+typedef       uint32_t   DOID_TYPE;
+typedef       uint32_t   ZONEID_TYPE;
 
 
 #endif  // DCBASE_H
 #endif  // DCBASE_H

+ 10 - 10
direct/src/directdevices/DirectDeviceManager.py

@@ -48,10 +48,10 @@ class DirectButtons(ButtonNode, DirectObject):
     def __init__(self, vrpnClient, device):
     def __init__(self, vrpnClient, device):
         # Keep track of number of buttons created
         # Keep track of number of buttons created
         DirectButtons.buttonCount += 1
         DirectButtons.buttonCount += 1
-        # Create a unique name for this button object
-        self.name = 'DirectButtons-' + repr(DirectButtons.buttonCount)
         # Create a new button node for the given device
         # Create a new button node for the given device
         ButtonNode.__init__(self, vrpnClient, device)
         ButtonNode.__init__(self, vrpnClient, device)
+        # Create a unique name for this button object
+        self.name = 'DirectButtons-' + repr(DirectButtons.buttonCount)
         # Attach node to data graph
         # Attach node to data graph
         self.nodePath = myBase.dataRoot.attachNewNode(self)
         self.nodePath = myBase.dataRoot.attachNewNode(self)
 
 
@@ -86,10 +86,10 @@ class DirectAnalogs(AnalogNode, DirectObject):
     def __init__(self, vrpnClient, device):
     def __init__(self, vrpnClient, device):
         # Keep track of number of analogs created
         # Keep track of number of analogs created
         DirectAnalogs.analogCount += 1
         DirectAnalogs.analogCount += 1
-        # Create a unique name for this analog object
-        self.name = 'DirectAnalogs-' + repr(DirectAnalogs.analogCount)
         # Create a new analog node for the given device
         # Create a new analog node for the given device
         AnalogNode.__init__(self, vrpnClient, device)
         AnalogNode.__init__(self, vrpnClient, device)
+        # Create a unique name for this analog object
+        self.name = 'DirectAnalogs-' + repr(DirectAnalogs.analogCount)
         # Attach node to data graph
         # Attach node to data graph
         self.nodePath = myBase.dataRoot.attachNewNode(self)
         self.nodePath = myBase.dataRoot.attachNewNode(self)
         # See if any of the general analog parameters are dconfig'd
         # See if any of the general analog parameters are dconfig'd
@@ -182,10 +182,10 @@ class DirectTracker(TrackerNode, DirectObject):
     def __init__(self, vrpnClient, device):
     def __init__(self, vrpnClient, device):
         # Keep track of number of trackers created
         # Keep track of number of trackers created
         DirectTracker.trackerCount += 1
         DirectTracker.trackerCount += 1
-        # Create a unique name for this tracker object
-        self.name = 'DirectTracker-' + repr(DirectTracker.trackerCount)
         # Create a new tracker node for the given device
         # Create a new tracker node for the given device
         TrackerNode.__init__(self, vrpnClient, device)
         TrackerNode.__init__(self, vrpnClient, device)
+        # Create a unique name for this tracker object
+        self.name = 'DirectTracker-' + repr(DirectTracker.trackerCount)
         # Attach node to data graph
         # Attach node to data graph
         self.nodePath = myBase.dataRoot.attachNewNode(self)
         self.nodePath = myBase.dataRoot.attachNewNode(self)
 
 
@@ -209,10 +209,10 @@ class DirectDials(DialNode, DirectObject):
     def __init__(self, vrpnClient, device):
     def __init__(self, vrpnClient, device):
         # Keep track of number of dials created
         # Keep track of number of dials created
         DirectDials.dialCount += 1
         DirectDials.dialCount += 1
-        # Create a unique name for this dial object
-        self.name = 'DirectDials-' + repr(DirectDials.dialCount)
         # Create a new dial node for the given device
         # Create a new dial node for the given device
         DialNode.__init__(self, vrpnClient, device)
         DialNode.__init__(self, vrpnClient, device)
+        # Create a unique name for this dial object
+        self.name = 'DirectDials-' + repr(DirectDials.dialCount)
         # Attach node to data graph
         # Attach node to data graph
         self.nodePath = myBase.dataRoot.attachNewNode(self)
         self.nodePath = myBase.dataRoot.attachNewNode(self)
 
 
@@ -249,6 +249,8 @@ class DirectTimecodeReader(AnalogNode, DirectObject):
     def __init__(self, vrpnClient, device):
     def __init__(self, vrpnClient, device):
         # Keep track of number of timecodeReader created
         # Keep track of number of timecodeReader created
         DirectTimecodeReader.timecodeReaderCount += 1
         DirectTimecodeReader.timecodeReaderCount += 1
+        # Create a new dial node for the given device
+        AnalogNode.__init__(self, vrpnClient, device)
         # Create a unique name for this dial object
         # Create a unique name for this dial object
         self.name = ('DirectTimecodeReader-' +
         self.name = ('DirectTimecodeReader-' +
                      repr(DirectTimecodeReader.timecodeReaderCount))
                      repr(DirectTimecodeReader.timecodeReaderCount))
@@ -257,8 +259,6 @@ class DirectTimecodeReader(AnalogNode, DirectObject):
         self.seconds = 0
         self.seconds = 0
         self.minutes = 0
         self.minutes = 0
         self.hours = 0
         self.hours = 0
-        # Create a new dial node for the given device
-        AnalogNode.__init__(self, vrpnClient, device)
         # Attach node to data graph
         # Attach node to data graph
         self.nodePath = myBase.dataRoot.attachNewNode(self)
         self.nodePath = myBase.dataRoot.attachNewNode(self)
 
 

+ 1 - 1
direct/src/distributed/cDistributedSmoothNodeBase.I

@@ -184,7 +184,7 @@ d_setSmPosHpr(PN_stdfloat x, PN_stdfloat y, PN_stdfloat z, PN_stdfloat h, PN_std
  *
  *
  */
  */
 INLINE void CDistributedSmoothNodeBase::
 INLINE void CDistributedSmoothNodeBase::
-d_setSmPosHprL(PN_stdfloat x, PN_stdfloat y, PN_stdfloat z, PN_stdfloat h, PN_stdfloat p, PN_stdfloat r, PN_uint64 l) {
+d_setSmPosHprL(PN_stdfloat x, PN_stdfloat y, PN_stdfloat z, PN_stdfloat h, PN_stdfloat p, PN_stdfloat r, uint64_t l) {
   // cout << "d_setSmPosHprL: " << x << ", " << y << ", " << z << ", " << h <<
   // cout << "d_setSmPosHprL: " << x << ", " << y << ", " << z << ", " << h <<
   // ", " << p << ", " << r << l << endl;
   // ", " << p << ", " << r << l << endl;
   DCPacker packer;
   DCPacker packer;

+ 1 - 1
direct/src/distributed/cDistributedSmoothNodeBase.cxx

@@ -358,7 +358,7 @@ finish_send_update(DCPacker &packer) {
  * Appends the timestamp and sends the update.
  * Appends the timestamp and sends the update.
  */
  */
 void CDistributedSmoothNodeBase::
 void CDistributedSmoothNodeBase::
-set_curr_l(PN_uint64 l) {
+set_curr_l(uint64_t l) {
   _currL[1] = l;
   _currL[1] = l;
 }
 }
 
 

+ 3 - 3
direct/src/distributed/cDistributedSmoothNodeBase.h

@@ -51,7 +51,7 @@ PUBLISHED:
   void broadcast_pos_hpr_xyh();
   void broadcast_pos_hpr_xyh();
   void broadcast_pos_hpr_xy();
   void broadcast_pos_hpr_xy();
 
 
-  void set_curr_l(PN_uint64 l);
+  void set_curr_l(uint64_t l);
   void print_curr_l();
   void print_curr_l();
 
 
 private:
 private:
@@ -67,7 +67,7 @@ private:
   INLINE void d_setSmXYH(PN_stdfloat x, PN_stdfloat y, PN_stdfloat h);
   INLINE void d_setSmXYH(PN_stdfloat x, PN_stdfloat y, PN_stdfloat h);
   INLINE void d_setSmXYZH(PN_stdfloat x, PN_stdfloat y, PN_stdfloat z, PN_stdfloat h);
   INLINE void d_setSmXYZH(PN_stdfloat x, PN_stdfloat y, PN_stdfloat z, PN_stdfloat h);
   INLINE void d_setSmPosHpr(PN_stdfloat x, PN_stdfloat y, PN_stdfloat z, PN_stdfloat h, PN_stdfloat p, PN_stdfloat r);
   INLINE void d_setSmPosHpr(PN_stdfloat x, PN_stdfloat y, PN_stdfloat z, PN_stdfloat h, PN_stdfloat p, PN_stdfloat r);
-  INLINE void d_setSmPosHprL(PN_stdfloat x, PN_stdfloat y, PN_stdfloat z, PN_stdfloat h, PN_stdfloat p, PN_stdfloat r, PN_uint64 l);
+  INLINE void d_setSmPosHprL(PN_stdfloat x, PN_stdfloat y, PN_stdfloat z, PN_stdfloat h, PN_stdfloat p, PN_stdfloat r, uint64_t l);
 
 
   void begin_send_update(DCPacker &packer, const string &field_name);
   void begin_send_update(DCPacker &packer, const string &field_name);
   void finish_send_update(DCPacker &packer);
   void finish_send_update(DCPacker &packer);
@@ -97,7 +97,7 @@ private:
   bool _store_stop;
   bool _store_stop;
   // contains most recently sent location info as index 0, index 1 contains
   // contains most recently sent location info as index 0, index 1 contains
   // most recently set location info
   // most recently set location info
-  PN_uint64 _currL[2];
+  uint64_t _currL[2];
 };
 };
 
 
 #include "cDistributedSmoothNodeBase.I"
 #include "cDistributedSmoothNodeBase.I"

File diff suppressed because it is too large
+ 348 - 634
dtool/src/cppparser/cppBison.cxx.prebuilt


+ 185 - 198
dtool/src/cppparser/cppBison.h.prebuilt

@@ -1,19 +1,19 @@
-/* A Bison parser, made by GNU Bison 2.7.  */
+/* A Bison parser, made by GNU Bison 3.0.4.  */
 
 
 /* Bison interface for Yacc-like parsers in C
 /* Bison interface for Yacc-like parsers in C
-   
-      Copyright (C) 1984, 1989-1990, 2000-2012 Free Software Foundation, Inc.
-   
+
+   Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc.
+
    This program is free software: you can redistribute it and/or modify
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.
    (at your option) any later version.
-   
+
    This program is distributed in the hope that it will be useful,
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
    GNU General Public License for more details.
-   
+
    You should have received a copy of the GNU General Public License
    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 
@@ -26,13 +26,13 @@
    special exception, which will cause the skeleton and the resulting
    special exception, which will cause the skeleton and the resulting
    Bison output files to be licensed under the GNU General Public
    Bison output files to be licensed under the GNU General Public
    License without this special exception.
    License without this special exception.
-   
+
    This special exception was added by the Free Software Foundation in
    This special exception was added by the Free Software Foundation in
    version 2.2 of Bison.  */
    version 2.2 of Bison.  */
 
 
 #ifndef YY_CPPYY_BUILT_TMP_CPPBISON_YXX_H_INCLUDED
 #ifndef YY_CPPYY_BUILT_TMP_CPPBISON_YXX_H_INCLUDED
 # define YY_CPPYY_BUILT_TMP_CPPBISON_YXX_H_INCLUDED
 # define YY_CPPYY_BUILT_TMP_CPPBISON_YXX_H_INCLUDED
-/* Enabling traces.  */
+/* Debug traces.  */
 #ifndef YYDEBUG
 #ifndef YYDEBUG
 # define YYDEBUG 0
 # define YYDEBUG 0
 #endif
 #endif
@@ -40,134 +40,135 @@
 extern int cppyydebug;
 extern int cppyydebug;
 #endif
 #endif
 
 
-/* Tokens.  */
+/* Token type.  */
 #ifndef YYTOKENTYPE
 #ifndef YYTOKENTYPE
 # define YYTOKENTYPE
 # define YYTOKENTYPE
-   /* Put the tokens into the symbol table, so that GDB and other debuggers
-      know about them.  */
-   enum yytokentype {
-     REAL = 258,
-     INTEGER = 259,
-     CHAR_TOK = 260,
-     SIMPLE_STRING = 261,
-     SIMPLE_IDENTIFIER = 262,
-     STRING_LITERAL = 263,
-     CUSTOM_LITERAL = 264,
-     IDENTIFIER = 265,
-     TYPENAME_IDENTIFIER = 266,
-     SCOPING = 267,
-     TYPEDEFNAME = 268,
-     ELLIPSIS = 269,
-     OROR = 270,
-     ANDAND = 271,
-     EQCOMPARE = 272,
-     NECOMPARE = 273,
-     LECOMPARE = 274,
-     GECOMPARE = 275,
-     LSHIFT = 276,
-     RSHIFT = 277,
-     POINTSAT_STAR = 278,
-     DOT_STAR = 279,
-     UNARY = 280,
-     UNARY_NOT = 281,
-     UNARY_NEGATE = 282,
-     UNARY_MINUS = 283,
-     UNARY_PLUS = 284,
-     UNARY_STAR = 285,
-     UNARY_REF = 286,
-     POINTSAT = 287,
-     SCOPE = 288,
-     PLUSPLUS = 289,
-     MINUSMINUS = 290,
-     TIMESEQUAL = 291,
-     DIVIDEEQUAL = 292,
-     MODEQUAL = 293,
-     PLUSEQUAL = 294,
-     MINUSEQUAL = 295,
-     OREQUAL = 296,
-     ANDEQUAL = 297,
-     XOREQUAL = 298,
-     LSHIFTEQUAL = 299,
-     RSHIFTEQUAL = 300,
-     KW_ALIGNAS = 301,
-     KW_ALIGNOF = 302,
-     KW_AUTO = 303,
-     KW_BEGIN_PUBLISH = 304,
-     KW_BLOCKING = 305,
-     KW_BOOL = 306,
-     KW_CATCH = 307,
-     KW_CHAR = 308,
-     KW_CHAR16_T = 309,
-     KW_CHAR32_T = 310,
-     KW_CLASS = 311,
-     KW_CONST = 312,
-     KW_CONSTEXPR = 313,
-     KW_CONST_CAST = 314,
-     KW_DECLTYPE = 315,
-     KW_DEFAULT = 316,
-     KW_DELETE = 317,
-     KW_DOUBLE = 318,
-     KW_DYNAMIC_CAST = 319,
-     KW_ELSE = 320,
-     KW_END_PUBLISH = 321,
-     KW_ENUM = 322,
-     KW_EXTENSION = 323,
-     KW_EXTERN = 324,
-     KW_EXPLICIT = 325,
-     KW_PUBLISHED = 326,
-     KW_FALSE = 327,
-     KW_FINAL = 328,
-     KW_FLOAT = 329,
-     KW_FRIEND = 330,
-     KW_FOR = 331,
-     KW_GOTO = 332,
-     KW_IF = 333,
-     KW_INLINE = 334,
-     KW_INT = 335,
-     KW_LONG = 336,
-     KW_MAKE_PROPERTY = 337,
-     KW_MAKE_PROPERTY2 = 338,
-     KW_MAKE_SEQ = 339,
-     KW_MUTABLE = 340,
-     KW_NAMESPACE = 341,
-     KW_NEW = 342,
-     KW_NOEXCEPT = 343,
-     KW_NULLPTR = 344,
-     KW_OPERATOR = 345,
-     KW_OVERRIDE = 346,
-     KW_PRIVATE = 347,
-     KW_PROTECTED = 348,
-     KW_PUBLIC = 349,
-     KW_REGISTER = 350,
-     KW_REINTERPRET_CAST = 351,
-     KW_RETURN = 352,
-     KW_SHORT = 353,
-     KW_SIGNED = 354,
-     KW_SIZEOF = 355,
-     KW_STATIC = 356,
-     KW_STATIC_ASSERT = 357,
-     KW_STATIC_CAST = 358,
-     KW_STRUCT = 359,
-     KW_TEMPLATE = 360,
-     KW_THREAD_LOCAL = 361,
-     KW_THROW = 362,
-     KW_TRUE = 363,
-     KW_TRY = 364,
-     KW_TYPEDEF = 365,
-     KW_TYPEID = 366,
-     KW_TYPENAME = 367,
-     KW_UNION = 368,
-     KW_UNSIGNED = 369,
-     KW_USING = 370,
-     KW_VIRTUAL = 371,
-     KW_VOID = 372,
-     KW_VOLATILE = 373,
-     KW_WCHAR_T = 374,
-     KW_WHILE = 375,
-     START_CPP = 376,
-     START_CONST_EXPR = 377,
-     START_TYPE = 378
-   };
+  enum yytokentype
+  {
+    REAL = 258,
+    INTEGER = 259,
+    CHAR_TOK = 260,
+    SIMPLE_STRING = 261,
+    SIMPLE_IDENTIFIER = 262,
+    STRING_LITERAL = 263,
+    CUSTOM_LITERAL = 264,
+    IDENTIFIER = 265,
+    TYPENAME_IDENTIFIER = 266,
+    SCOPING = 267,
+    TYPEDEFNAME = 268,
+    ELLIPSIS = 269,
+    OROR = 270,
+    ANDAND = 271,
+    EQCOMPARE = 272,
+    NECOMPARE = 273,
+    LECOMPARE = 274,
+    GECOMPARE = 275,
+    LSHIFT = 276,
+    RSHIFT = 277,
+    POINTSAT_STAR = 278,
+    DOT_STAR = 279,
+    UNARY = 280,
+    UNARY_NOT = 281,
+    UNARY_NEGATE = 282,
+    UNARY_MINUS = 283,
+    UNARY_PLUS = 284,
+    UNARY_STAR = 285,
+    UNARY_REF = 286,
+    POINTSAT = 287,
+    SCOPE = 288,
+    PLUSPLUS = 289,
+    MINUSMINUS = 290,
+    TIMESEQUAL = 291,
+    DIVIDEEQUAL = 292,
+    MODEQUAL = 293,
+    PLUSEQUAL = 294,
+    MINUSEQUAL = 295,
+    OREQUAL = 296,
+    ANDEQUAL = 297,
+    XOREQUAL = 298,
+    LSHIFTEQUAL = 299,
+    RSHIFTEQUAL = 300,
+    KW_ALIGNAS = 301,
+    KW_ALIGNOF = 302,
+    KW_AUTO = 303,
+    KW_BEGIN_PUBLISH = 304,
+    KW_BLOCKING = 305,
+    KW_BOOL = 306,
+    KW_CATCH = 307,
+    KW_CHAR = 308,
+    KW_CHAR16_T = 309,
+    KW_CHAR32_T = 310,
+    KW_CLASS = 311,
+    KW_CONST = 312,
+    KW_CONSTEXPR = 313,
+    KW_CONST_CAST = 314,
+    KW_DECLTYPE = 315,
+    KW_DEFAULT = 316,
+    KW_DELETE = 317,
+    KW_DOUBLE = 318,
+    KW_DYNAMIC_CAST = 319,
+    KW_ELSE = 320,
+    KW_END_PUBLISH = 321,
+    KW_ENUM = 322,
+    KW_EXTENSION = 323,
+    KW_EXTERN = 324,
+    KW_EXPLICIT = 325,
+    KW_PUBLISHED = 326,
+    KW_FALSE = 327,
+    KW_FINAL = 328,
+    KW_FLOAT = 329,
+    KW_FRIEND = 330,
+    KW_FOR = 331,
+    KW_GOTO = 332,
+    KW_IF = 333,
+    KW_INLINE = 334,
+    KW_INT = 335,
+    KW_LONG = 336,
+    KW_MAKE_MAP_PROPERTY = 337,
+    KW_MAKE_PROPERTY = 338,
+    KW_MAKE_PROPERTY2 = 339,
+    KW_MAKE_SEQ = 340,
+    KW_MAKE_SEQ_PROPERTY = 341,
+    KW_MUTABLE = 342,
+    KW_NAMESPACE = 343,
+    KW_NEW = 344,
+    KW_NOEXCEPT = 345,
+    KW_NULLPTR = 346,
+    KW_OPERATOR = 347,
+    KW_OVERRIDE = 348,
+    KW_PRIVATE = 349,
+    KW_PROTECTED = 350,
+    KW_PUBLIC = 351,
+    KW_REGISTER = 352,
+    KW_REINTERPRET_CAST = 353,
+    KW_RETURN = 354,
+    KW_SHORT = 355,
+    KW_SIGNED = 356,
+    KW_SIZEOF = 357,
+    KW_STATIC = 358,
+    KW_STATIC_ASSERT = 359,
+    KW_STATIC_CAST = 360,
+    KW_STRUCT = 361,
+    KW_TEMPLATE = 362,
+    KW_THREAD_LOCAL = 363,
+    KW_THROW = 364,
+    KW_TRUE = 365,
+    KW_TRY = 366,
+    KW_TYPEDEF = 367,
+    KW_TYPEID = 368,
+    KW_TYPENAME = 369,
+    KW_UNION = 370,
+    KW_UNSIGNED = 371,
+    KW_USING = 372,
+    KW_VIRTUAL = 373,
+    KW_VOID = 374,
+    KW_VOLATILE = 375,
+    KW_WCHAR_T = 376,
+    KW_WHILE = 377,
+    START_CPP = 378,
+    START_CONST_EXPR = 379,
+    START_TYPE = 380
+  };
 #endif
 #endif
 /* Tokens.  */
 /* Tokens.  */
 #define REAL 258
 #define REAL 258
@@ -249,83 +250,69 @@ extern int cppyydebug;
 #define KW_INLINE 334
 #define KW_INLINE 334
 #define KW_INT 335
 #define KW_INT 335
 #define KW_LONG 336
 #define KW_LONG 336
-#define KW_MAKE_PROPERTY 337
-#define KW_MAKE_PROPERTY2 338
-#define KW_MAKE_SEQ 339
-#define KW_MUTABLE 340
-#define KW_NAMESPACE 341
-#define KW_NEW 342
-#define KW_NOEXCEPT 343
-#define KW_NULLPTR 344
-#define KW_OPERATOR 345
-#define KW_OVERRIDE 346
-#define KW_PRIVATE 347
-#define KW_PROTECTED 348
-#define KW_PUBLIC 349
-#define KW_REGISTER 350
-#define KW_REINTERPRET_CAST 351
-#define KW_RETURN 352
-#define KW_SHORT 353
-#define KW_SIGNED 354
-#define KW_SIZEOF 355
-#define KW_STATIC 356
-#define KW_STATIC_ASSERT 357
-#define KW_STATIC_CAST 358
-#define KW_STRUCT 359
-#define KW_TEMPLATE 360
-#define KW_THREAD_LOCAL 361
-#define KW_THROW 362
-#define KW_TRUE 363
-#define KW_TRY 364
-#define KW_TYPEDEF 365
-#define KW_TYPEID 366
-#define KW_TYPENAME 367
-#define KW_UNION 368
-#define KW_UNSIGNED 369
-#define KW_USING 370
-#define KW_VIRTUAL 371
-#define KW_VOID 372
-#define KW_VOLATILE 373
-#define KW_WCHAR_T 374
-#define KW_WHILE 375
-#define START_CPP 376
-#define START_CONST_EXPR 377
-#define START_TYPE 378
-
+#define KW_MAKE_MAP_PROPERTY 337
+#define KW_MAKE_PROPERTY 338
+#define KW_MAKE_PROPERTY2 339
+#define KW_MAKE_SEQ 340
+#define KW_MAKE_SEQ_PROPERTY 341
+#define KW_MUTABLE 342
+#define KW_NAMESPACE 343
+#define KW_NEW 344
+#define KW_NOEXCEPT 345
+#define KW_NULLPTR 346
+#define KW_OPERATOR 347
+#define KW_OVERRIDE 348
+#define KW_PRIVATE 349
+#define KW_PROTECTED 350
+#define KW_PUBLIC 351
+#define KW_REGISTER 352
+#define KW_REINTERPRET_CAST 353
+#define KW_RETURN 354
+#define KW_SHORT 355
+#define KW_SIGNED 356
+#define KW_SIZEOF 357
+#define KW_STATIC 358
+#define KW_STATIC_ASSERT 359
+#define KW_STATIC_CAST 360
+#define KW_STRUCT 361
+#define KW_TEMPLATE 362
+#define KW_THREAD_LOCAL 363
+#define KW_THROW 364
+#define KW_TRUE 365
+#define KW_TRY 366
+#define KW_TYPEDEF 367
+#define KW_TYPEID 368
+#define KW_TYPENAME 369
+#define KW_UNION 370
+#define KW_UNSIGNED 371
+#define KW_USING 372
+#define KW_VIRTUAL 373
+#define KW_VOID 374
+#define KW_VOLATILE 375
+#define KW_WCHAR_T 376
+#define KW_WHILE 377
+#define START_CPP 378
+#define START_CONST_EXPR 379
+#define START_TYPE 380
 
 
+/* Value type.  */
 
 
-#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
-
-# define yystype YYSTYPE /* obsolescent; will be withdrawn */
-# define YYSTYPE_IS_DECLARED 1
-#endif
-
+/* Location type.  */
 #if ! defined YYLTYPE && ! defined YYLTYPE_IS_DECLARED
 #if ! defined YYLTYPE && ! defined YYLTYPE_IS_DECLARED
-typedef struct YYLTYPE
+typedef struct YYLTYPE YYLTYPE;
+struct YYLTYPE
 {
 {
   int first_line;
   int first_line;
   int first_column;
   int first_column;
   int last_line;
   int last_line;
   int last_column;
   int last_column;
-} YYLTYPE;
-# define yyltype YYLTYPE /* obsolescent; will be withdrawn */
+};
 # define YYLTYPE_IS_DECLARED 1
 # define YYLTYPE_IS_DECLARED 1
 # define YYLTYPE_IS_TRIVIAL 1
 # define YYLTYPE_IS_TRIVIAL 1
 #endif
 #endif
 
 
 
 
-#ifdef YYPARSE_PARAM
-#if defined __STDC__ || defined __cplusplus
-int cppyyparse (void *YYPARSE_PARAM);
-#else
-int cppyyparse ();
-#endif
-#else /* ! YYPARSE_PARAM */
-#if defined __STDC__ || defined __cplusplus
+
 int cppyyparse (void);
 int cppyyparse (void);
-#else
-int cppyyparse ();
-#endif
-#endif /* ! YYPARSE_PARAM */
 
 
 #endif /* !YY_CPPYY_BUILT_TMP_CPPBISON_YXX_H_INCLUDED  */
 #endif /* !YY_CPPYY_BUILT_TMP_CPPBISON_YXX_H_INCLUDED  */

+ 158 - 16
dtool/src/cppparser/cppBison.yxx

@@ -284,9 +284,11 @@ pop_struct() {
 %token KW_INLINE
 %token KW_INLINE
 %token KW_INT
 %token KW_INT
 %token KW_LONG
 %token KW_LONG
+%token KW_MAKE_MAP_PROPERTY
 %token KW_MAKE_PROPERTY
 %token KW_MAKE_PROPERTY
 %token KW_MAKE_PROPERTY2
 %token KW_MAKE_PROPERTY2
 %token KW_MAKE_SEQ
 %token KW_MAKE_SEQ
+%token KW_MAKE_SEQ_PROPERTY
 %token KW_MUTABLE
 %token KW_MUTABLE
 %token KW_NAMESPACE
 %token KW_NAMESPACE
 %token KW_NEW
 %token KW_NEW
@@ -550,6 +552,118 @@ declaration:
                                                          setter_func, current_scope, @1.file);
                                                          setter_func, current_scope, @1.file);
     current_scope->add_declaration(make_property, global_scope, current_lexer, @1);
     current_scope->add_declaration(make_property, global_scope, current_lexer, @1);
   }
   }
+}
+        | KW_MAKE_PROPERTY '(' name ',' IDENTIFIER ',' IDENTIFIER ',' IDENTIFIER ')' ';'
+{
+  CPPDeclaration *getter = $5->find_symbol(current_scope, global_scope, current_lexer);
+  if (getter == (CPPDeclaration *)NULL || getter->get_subtype() != CPPDeclaration::ST_function_group) {
+    yyerror("Reference to non-existent or invalid getter: " + $5->get_fully_scoped_name(), @5);
+
+  } else {
+    CPPDeclaration *setter = $7->find_symbol(current_scope, global_scope, current_lexer);
+    CPPFunctionGroup *setter_func = NULL;
+
+    if (setter == (CPPDeclaration *)NULL || setter->get_subtype() != CPPDeclaration::ST_function_group) {
+      yyerror("Reference to non-existent or invalid setter: " + $7->get_fully_scoped_name(), @7);
+    } else {
+      setter_func = setter->as_function_group();
+    }
+
+    CPPDeclaration *deleter = $9->find_symbol(current_scope, global_scope, current_lexer);
+    if (deleter == (CPPDeclaration *)NULL || deleter->get_subtype() != CPPDeclaration::ST_function_group) {
+      yyerror("reference to non-existent or invalid delete method: " + $9->get_fully_scoped_name(), @9);
+      deleter = NULL;
+    }
+
+    CPPMakeProperty *make_property = new CPPMakeProperty($3, getter->as_function_group(),
+                                                         setter_func, current_scope, @1.file);
+    if (deleter) {
+      make_property->_del_function = deleter->as_function_group();
+    }
+    current_scope->add_declaration(make_property, global_scope, current_lexer, @1);
+  }
+}
+        | KW_MAKE_SEQ_PROPERTY '(' name ',' IDENTIFIER ',' IDENTIFIER ')' ';'
+{
+  CPPDeclaration *length_getter = $5->find_symbol(current_scope, global_scope, current_lexer);
+  if (length_getter == (CPPDeclaration *)NULL || length_getter->get_subtype() != CPPDeclaration::ST_function_group) {
+    yyerror("reference to non-existent or invalid length method: " + $5->get_fully_scoped_name(), @5);
+    length_getter = NULL;
+  }
+
+  CPPDeclaration *getter = $7->find_symbol(current_scope, global_scope, current_lexer);
+  if (getter == (CPPDeclaration *)NULL || getter->get_subtype() != CPPDeclaration::ST_function_group) {
+    yyerror("Reference to non-existent or invalid getter: " + $7->get_fully_scoped_name(), @7);
+  }
+
+  CPPMakeProperty *make_property = new CPPMakeProperty($3, getter->as_function_group(), NULL, current_scope, @1.file);
+  make_property->_length_function = length_getter->as_function_group();
+  current_scope->add_declaration(make_property, global_scope, current_lexer, @1);
+}
+        | KW_MAKE_SEQ_PROPERTY '(' name ',' IDENTIFIER ',' IDENTIFIER ',' IDENTIFIER ')' ';'
+{
+  CPPDeclaration *length_getter = $5->find_symbol(current_scope, global_scope, current_lexer);
+  if (length_getter == (CPPDeclaration *)NULL || length_getter->get_subtype() != CPPDeclaration::ST_function_group) {
+    yyerror("reference to non-existent or invalid length method: " + $5->get_fully_scoped_name(), @5);
+    length_getter = NULL;
+  }
+
+  CPPDeclaration *getter = $7->find_symbol(current_scope, global_scope, current_lexer);
+  if (getter == (CPPDeclaration *)NULL || getter->get_subtype() != CPPDeclaration::ST_function_group) {
+    yyerror("Reference to non-existent or invalid getter: " + $7->get_fully_scoped_name(), @7);
+
+  } else {
+    CPPDeclaration *setter = $9->find_symbol(current_scope, global_scope, current_lexer);
+    CPPFunctionGroup *setter_func = NULL;
+
+    if (setter == (CPPDeclaration *)NULL || setter->get_subtype() != CPPDeclaration::ST_function_group) {
+      yyerror("Reference to non-existent or invalid setter: " + $9->get_fully_scoped_name(), @9);
+    } else {
+      setter_func = setter->as_function_group();
+    }
+
+    CPPMakeProperty *make_property = new CPPMakeProperty($3, getter->as_function_group(),
+                                                         setter_func, current_scope, @1.file);
+    make_property->_length_function = length_getter->as_function_group();
+    current_scope->add_declaration(make_property, global_scope, current_lexer, @1);
+  }
+}
+        | KW_MAKE_SEQ_PROPERTY '(' name ',' IDENTIFIER ',' IDENTIFIER ',' IDENTIFIER ',' IDENTIFIER ')' ';'
+{
+  CPPDeclaration *length_getter = $5->find_symbol(current_scope, global_scope, current_lexer);
+  if (length_getter == (CPPDeclaration *)NULL || length_getter->get_subtype() != CPPDeclaration::ST_function_group) {
+    yyerror("reference to non-existent or invalid length method: " + $5->get_fully_scoped_name(), @5);
+    length_getter = NULL;
+  }
+
+  CPPDeclaration *getter = $7->find_symbol(current_scope, global_scope, current_lexer);
+  if (getter == (CPPDeclaration *)NULL || getter->get_subtype() != CPPDeclaration::ST_function_group) {
+    yyerror("Reference to non-existent or invalid getter: " + $7->get_fully_scoped_name(), @7);
+
+  } else {
+    CPPDeclaration *setter = $9->find_symbol(current_scope, global_scope, current_lexer);
+    CPPFunctionGroup *setter_func = NULL;
+
+    if (setter == (CPPDeclaration *)NULL || setter->get_subtype() != CPPDeclaration::ST_function_group) {
+      yyerror("Reference to non-existent or invalid setter: " + $9->get_fully_scoped_name(), @9);
+    } else {
+      setter_func = setter->as_function_group();
+    }
+
+    CPPDeclaration *deleter = $11->find_symbol(current_scope, global_scope, current_lexer);
+    if (deleter == (CPPDeclaration *)NULL || deleter->get_subtype() != CPPDeclaration::ST_function_group) {
+      yyerror("reference to non-existent or invalid delete method: " + $11->get_fully_scoped_name(), @11);
+      deleter = NULL;
+    }
+
+    CPPMakeProperty *make_property = new CPPMakeProperty($3, getter->as_function_group(),
+                                                         setter_func, current_scope, @1.file);
+    make_property->_length_function = length_getter->as_function_group();
+    if (deleter) {
+      make_property->_del_function = deleter->as_function_group();
+    }
+    current_scope->add_declaration(make_property, global_scope, current_lexer, @1);
+  }
 }
 }
         | KW_MAKE_PROPERTY2 '(' name ',' IDENTIFIER ',' IDENTIFIER ')' ';'
         | KW_MAKE_PROPERTY2 '(' name ',' IDENTIFIER ',' IDENTIFIER ')' ';'
 {
 {
@@ -2349,21 +2463,23 @@ enum:
         ;
         ;
 
 
 enum_decl:
 enum_decl:
-        enum_keyword name_no_final ':' enum_element_type
+        enum_keyword ':' enum_element_type
 {
 {
-  current_enum = new CPPEnumType($2, $4, current_scope, @1.file);
+  current_enum = new CPPEnumType($1, NULL, $3, current_scope, NULL, @1.file);
 }
 }
-        | enum_keyword name_no_final
+        | enum_keyword
 {
 {
-  current_enum = new CPPEnumType($2, current_scope, @1.file);
+  current_enum = new CPPEnumType($1, NULL, current_scope, NULL, @1.file);
 }
 }
-        | enum_keyword ':' enum_element_type
+        | enum_keyword name_no_final ':' enum_element_type
 {
 {
-  current_enum = new CPPEnumType(NULL, $3, current_scope, @1.file);
+  CPPScope *new_scope = new CPPScope(current_scope, $2->_names.back(), V_public);
+  current_enum = new CPPEnumType($1, $2, $4, current_scope, new_scope, @1.file);
 }
 }
-        | enum_keyword
+        | enum_keyword name_no_final
 {
 {
-  current_enum = new CPPEnumType(NULL, current_scope, @1.file);
+  CPPScope *new_scope = new CPPScope(current_scope, $2->_names.back(), V_public);
+  current_enum = new CPPEnumType($1, $2, current_scope, new_scope, @1.file);
 }
 }
         ;
         ;
 
 
@@ -2383,14 +2499,12 @@ enum_body_trailing_comma:
         | enum_body_trailing_comma name ','
         | enum_body_trailing_comma name ','
 {
 {
   assert(current_enum != NULL);
   assert(current_enum != NULL);
-  CPPInstance *inst = current_enum->add_element($2->get_simple_name());
-  current_scope->add_enum_value(inst, current_lexer, @2);
+  current_enum->add_element($2->get_simple_name(), NULL, current_lexer, @2);
 }
 }
         | enum_body_trailing_comma name '=' const_expr ','
         | enum_body_trailing_comma name '=' const_expr ','
 {
 {
   assert(current_enum != NULL);
   assert(current_enum != NULL);
-  CPPInstance *inst = current_enum->add_element($2->get_simple_name(), $4);
-  current_scope->add_enum_value(inst, current_lexer, @2);
+  current_enum->add_element($2->get_simple_name(), $4, current_lexer, @2);
 };
 };
 
 
 enum_body:
 enum_body:
@@ -2398,14 +2512,12 @@ enum_body:
         | enum_body_trailing_comma name
         | enum_body_trailing_comma name
 {
 {
   assert(current_enum != NULL);
   assert(current_enum != NULL);
-  CPPInstance *inst = current_enum->add_element($2->get_simple_name());
-  current_scope->add_enum_value(inst, current_lexer, @2);
+  current_enum->add_element($2->get_simple_name(), NULL, current_lexer, @2);
 }
 }
         | enum_body_trailing_comma name '=' const_expr
         | enum_body_trailing_comma name '=' const_expr
 {
 {
   assert(current_enum != NULL);
   assert(current_enum != NULL);
-  CPPInstance *inst = current_enum->add_element($2->get_simple_name(), $4);
-  current_scope->add_enum_value(inst, current_lexer, @2);
+  current_enum->add_element($2->get_simple_name(), $4, current_lexer, @2);
 }
 }
         ;
         ;
 
 
@@ -2413,6 +2525,14 @@ enum_keyword:
         KW_ENUM
         KW_ENUM
 {
 {
   $$ = CPPExtensionType::T_enum;
   $$ = CPPExtensionType::T_enum;
+}
+        | KW_ENUM KW_CLASS
+{
+  $$ = CPPExtensionType::T_enum_class;
+}
+        | KW_ENUM KW_STRUCT
+{
+  $$ = CPPExtensionType::T_enum_struct;
 }
 }
         ;
         ;
 
 
@@ -3495,6 +3615,28 @@ name:
         | KW_OVERRIDE
         | KW_OVERRIDE
 {
 {
   $$ = new CPPIdentifier("override", @1);
   $$ = new CPPIdentifier("override", @1);
+}
+        | KW_SIGNED
+{
+  // This is not a keyword in Python, so it is useful to be able to use this
+  // in MAKE_PROPERTY definitions, etc.
+  $$ = new CPPIdentifier("signed", @1);
+}
+        | KW_FLOAT
+{
+  $$ = new CPPIdentifier("float", @1);
+}
+        | KW_PUBLIC
+{
+  $$ = new CPPIdentifier("public", @1);
+}
+        | KW_PRIVATE
+{
+  $$ = new CPPIdentifier("private", @1);
+}
+        | KW_STATIC
+{
+  $$ = new CPPIdentifier("static", @1);
 }
 }
         ;
         ;
 
 

+ 66 - 13
dtool/src/cppparser/cppEnumType.cxx

@@ -22,42 +22,53 @@
 #include "indent.h"
 #include "indent.h"
 
 
 /**
 /**
- * Creates an untyped, unscoped enum.
+ * Creates an untyped enum.
  */
  */
 CPPEnumType::
 CPPEnumType::
-CPPEnumType(CPPIdentifier *ident, CPPScope *current_scope,
-            const CPPFile &file) :
-  CPPExtensionType(T_enum, ident, current_scope, file),
-  _parent_scope(current_scope),
+CPPEnumType(Type type, CPPIdentifier *ident, CPPScope *current_scope,
+            CPPScope *scope, const CPPFile &file) :
+  CPPExtensionType(type, ident, current_scope, file),
+  _scope(scope),
   _element_type(NULL),
   _element_type(NULL),
   _last_value(NULL)
   _last_value(NULL)
 {
 {
+  _parent_scope = (type == T_enum) ? current_scope : scope;
+
   if (ident != NULL) {
   if (ident != NULL) {
     ident->_native_scope = current_scope;
     ident->_native_scope = current_scope;
   }
   }
 }
 }
 
 
 /**
 /**
- * Creates a typed but unscoped enum.
+ * Creates a typed enum.
  */
  */
 CPPEnumType::
 CPPEnumType::
-CPPEnumType(CPPIdentifier *ident, CPPType *element_type,
-            CPPScope *current_scope, const CPPFile &file) :
-  CPPExtensionType(T_enum, ident, current_scope, file),
-  _parent_scope(current_scope),
+CPPEnumType(Type type, CPPIdentifier *ident, CPPType *element_type,
+            CPPScope *current_scope, CPPScope *scope, const CPPFile &file) :
+  CPPExtensionType(type, ident, current_scope, file),
+  _scope(scope),
   _element_type(element_type),
   _element_type(element_type),
   _last_value(NULL)
   _last_value(NULL)
 {
 {
+  _parent_scope = (type == T_enum) ? current_scope : scope;
   if (ident != NULL) {
   if (ident != NULL) {
     ident->_native_scope = current_scope;
     ident->_native_scope = current_scope;
   }
   }
 }
 }
 
 
+/**
+ * Returns true if this is a scoped enum.
+ */
+bool CPPEnumType::
+is_scoped() const {
+  return (_type != T_enum);
+}
+
 /**
 /**
  * Returns the integral type used to store enum values.
  * Returns the integral type used to store enum values.
  */
  */
 CPPType *CPPEnumType::
 CPPType *CPPEnumType::
-get_element_type() {
+get_underlying_type() {
   if (_element_type == NULL) {
   if (_element_type == NULL) {
     // This enum is untyped.  Use a suitable default, ie.  'int'. In the
     // This enum is untyped.  Use a suitable default, ie.  'int'. In the
     // future, we might want to check whether it fits in an int.
     // future, we might want to check whether it fits in an int.
@@ -78,11 +89,18 @@ get_element_type() {
  *
  *
  */
  */
 CPPInstance *CPPEnumType::
 CPPInstance *CPPEnumType::
-add_element(const string &name, CPPExpression *value) {
+add_element(const string &name, CPPExpression *value, CPPPreprocessor *preprocessor, const cppyyltype &pos) {
   CPPIdentifier *ident = new CPPIdentifier(name);
   CPPIdentifier *ident = new CPPIdentifier(name);
   ident->_native_scope = _parent_scope;
   ident->_native_scope = _parent_scope;
 
 
-  CPPInstance *inst = new CPPInstance(get_element_type(), ident);
+  CPPInstance *inst;
+  if (_type == T_enum) {
+    // Weakly typed enum.
+    inst = new CPPInstance(get_underlying_type(), ident);
+  } else {
+    // C++11-style strongly typed enum.
+    inst = new CPPInstance(this, ident);
+  }
   inst->_storage_class |= CPPInstance::SC_constexpr;
   inst->_storage_class |= CPPInstance::SC_constexpr;
   _elements.push_back(inst);
   _elements.push_back(inst);
 
 
@@ -104,6 +122,41 @@ add_element(const string &name, CPPExpression *value) {
   }
   }
   inst->_initializer = value;
   inst->_initializer = value;
   _last_value = value;
   _last_value = value;
+
+  if (preprocessor != (CPPPreprocessor *)NULL) {
+    // Same-line comment?
+    CPPCommentBlock *comment =
+      preprocessor->get_comment_on(pos.first_line, pos.file);
+
+    if (comment == (CPPCommentBlock *)NULL) {
+      // Nope.  Check for a comment before this line.
+      comment =
+        preprocessor->get_comment_before(pos.first_line, pos.file);
+
+      if (comment != NULL) {
+        // This is a bit of a hack, but it prevents us from picking up a same-
+        // line comment from the previous line.
+        if (comment->_line_number != pos.first_line - 1 ||
+            comment->_col_number <= pos.first_column) {
+
+          inst->_leading_comment = comment;
+        }
+      }
+    } else {
+      inst->_leading_comment = comment;
+    }
+  }
+
+  // Add the value to the enum scope (as per C++11), assuming it's not anonymous.
+  if (_scope != NULL) {
+    _scope->add_enum_value(inst);
+  }
+
+  // Now add it to the containing scope as well if it's not an "enum class".
+  if (!is_scoped() && _parent_scope != NULL) {
+    _parent_scope->add_enum_value(inst);
+  }
+
   return inst;
   return inst;
 }
 }
 
 

+ 9 - 7
dtool/src/cppparser/cppEnumType.h

@@ -30,15 +30,16 @@ class CPPScope;
  */
  */
 class CPPEnumType : public CPPExtensionType {
 class CPPEnumType : public CPPExtensionType {
 public:
 public:
-  CPPEnumType(CPPIdentifier *ident, CPPScope *current_scope,
-              const CPPFile &file);
-  CPPEnumType(CPPIdentifier *ident, CPPType *element_type,
-              CPPScope *current_scope, const CPPFile &file);
+  CPPEnumType(Type type, CPPIdentifier *ident, CPPScope *current_scope,
+              CPPScope *scope, const CPPFile &file);
+  CPPEnumType(Type type, CPPIdentifier *ident, CPPType *element_type,
+              CPPScope *current_scope, CPPScope *scope, const CPPFile &file);
 
 
-  CPPType *get_element_type();
+  bool is_scoped() const;
+  CPPType *get_underlying_type();
 
 
-  CPPInstance *add_element(const string &name,
-                           CPPExpression *value = (CPPExpression *)NULL);
+  CPPInstance *add_element(const string &name, CPPExpression *value,
+                           CPPPreprocessor *preprocessor, const cppyyltype &pos);
 
 
   virtual bool is_incomplete() const;
   virtual bool is_incomplete() const;
 
 
@@ -54,6 +55,7 @@ public:
   virtual CPPEnumType *as_enum_type();
   virtual CPPEnumType *as_enum_type();
 
 
   CPPScope *_parent_scope;
   CPPScope *_parent_scope;
+  CPPScope *_scope;
   CPPType *_element_type;
   CPPType *_element_type;
 
 
   typedef vector<CPPInstance *> Elements;
   typedef vector<CPPInstance *> Elements;

+ 1 - 1
dtool/src/cppparser/cppExpression.cxx

@@ -949,7 +949,7 @@ determine_type() const {
 
 
         case CPPDeclaration::ST_enum:
         case CPPDeclaration::ST_enum:
           // Convert into integral type.
           // Convert into integral type.
-          return t1->as_enum_type()->get_element_type();
+          return t1->as_enum_type()->get_underlying_type();
 
 
         case CPPDeclaration::ST_simple:
         case CPPDeclaration::ST_simple:
           {
           {

+ 6 - 0
dtool/src/cppparser/cppExtensionType.cxx

@@ -229,6 +229,12 @@ operator << (ostream &out, CPPExtensionType::Type type) {
   case CPPExtensionType::T_union:
   case CPPExtensionType::T_union:
     return out << "union";
     return out << "union";
 
 
+  case CPPExtensionType::T_enum_class:
+    return out << "enum class";
+
+  case CPPExtensionType::T_enum_struct:
+    return out << "enum struct";
+
   default:
   default:
     return out << "***invalid extension type***";
     return out << "***invalid extension type***";
   }
   }

+ 2 - 0
dtool/src/cppparser/cppExtensionType.h

@@ -34,6 +34,8 @@ public:
     T_class,
     T_class,
     T_struct,
     T_struct,
     T_union,
     T_union,
+    T_enum_class,
+    T_enum_struct,
   };
   };
 
 
   CPPExtensionType(Type type, CPPIdentifier *ident, CPPScope *current_scope,
   CPPExtensionType(Type type, CPPIdentifier *ident, CPPScope *current_scope,

+ 19 - 3
dtool/src/cppparser/cppMakeProperty.cxx

@@ -23,10 +23,12 @@ CPPMakeProperty(CPPIdentifier *ident,
                 CPPScope *current_scope, const CPPFile &file) :
                 CPPScope *current_scope, const CPPFile &file) :
   CPPDeclaration(file),
   CPPDeclaration(file),
   _ident(ident),
   _ident(ident),
+  _length_function(NULL),
   _has_function(NULL),
   _has_function(NULL),
   _get_function(getter),
   _get_function(getter),
   _set_function(setter),
   _set_function(setter),
-  _clear_function(NULL)
+  _clear_function(NULL),
+  _del_function(NULL)
 {
 {
   _ident->_native_scope = current_scope;
   _ident->_native_scope = current_scope;
 }
 }
@@ -41,10 +43,12 @@ CPPMakeProperty(CPPIdentifier *ident,
                 CPPScope *current_scope, const CPPFile &file) :
                 CPPScope *current_scope, const CPPFile &file) :
   CPPDeclaration(file),
   CPPDeclaration(file),
   _ident(ident),
   _ident(ident),
+  _length_function(NULL),
   _has_function(hasser),
   _has_function(hasser),
   _get_function(getter),
   _get_function(getter),
   _set_function(setter),
   _set_function(setter),
-  _clear_function(clearer)
+  _clear_function(clearer),
+  _del_function(NULL)
 {
 {
   _ident->_native_scope = current_scope;
   _ident->_native_scope = current_scope;
 }
 }
@@ -78,7 +82,11 @@ get_fully_scoped_name() const {
  */
  */
 void CPPMakeProperty::
 void CPPMakeProperty::
 output(ostream &out, int indent_level, CPPScope *scope, bool complete) const {
 output(ostream &out, int indent_level, CPPScope *scope, bool complete) const {
-  out << "__make_property";
+  if (_length_function != NULL) {
+    out << "__make_seq_property";
+  } else {
+    out << "__make_property";
+  }
 
 
   if (_has_function != NULL) {
   if (_has_function != NULL) {
     out.put('2');
     out.put('2');
@@ -86,6 +94,10 @@ output(ostream &out, int indent_level, CPPScope *scope, bool complete) const {
 
 
   out << "(" << _ident->get_local_name(scope);
   out << "(" << _ident->get_local_name(scope);
 
 
+  if (_length_function != NULL) {
+    out << ", " << _length_function->_name;
+  }
+
   if (_has_function != NULL) {
   if (_has_function != NULL) {
     out << ", " << _has_function->_name;
     out << ", " << _has_function->_name;
   }
   }
@@ -100,6 +112,10 @@ output(ostream &out, int indent_level, CPPScope *scope, bool complete) const {
     out << ", " << _clear_function->_name;
     out << ", " << _clear_function->_name;
   }
   }
 
 
+  if (_del_function != NULL) {
+    out << ", " << _del_function->_name;
+  }
+
   out << ");";
   out << ");";
 }
 }
 
 

+ 4 - 0
dtool/src/cppparser/cppMakeProperty.h

@@ -46,10 +46,14 @@ public:
   virtual CPPMakeProperty *as_make_property();
   virtual CPPMakeProperty *as_make_property();
 
 
   CPPIdentifier *_ident;
   CPPIdentifier *_ident;
+  // If length_function is not NULL, this is actually a sequence property,
+  // and the other functions take an additional index argument.
+  CPPFunctionGroup *_length_function;
   CPPFunctionGroup *_has_function;
   CPPFunctionGroup *_has_function;
   CPPFunctionGroup *_get_function;
   CPPFunctionGroup *_get_function;
   CPPFunctionGroup *_set_function;
   CPPFunctionGroup *_set_function;
   CPPFunctionGroup *_clear_function;
   CPPFunctionGroup *_clear_function;
+  CPPFunctionGroup *_del_function;
 };
 };
 
 
 #endif
 #endif

+ 2 - 0
dtool/src/cppparser/cppPreprocessor.cxx

@@ -2458,9 +2458,11 @@ check_keyword(const string &name) {
   if (name == "__inline__") return KW_INLINE;
   if (name == "__inline__") return KW_INLINE;
   if (name == "int") return KW_INT;
   if (name == "int") return KW_INT;
   if (name == "long") return KW_LONG;
   if (name == "long") return KW_LONG;
+  if (name == "__make_map_property") return KW_MAKE_MAP_PROPERTY;
   if (name == "__make_property") return KW_MAKE_PROPERTY;
   if (name == "__make_property") return KW_MAKE_PROPERTY;
   if (name == "__make_property2") return KW_MAKE_PROPERTY2;
   if (name == "__make_property2") return KW_MAKE_PROPERTY2;
   if (name == "__make_seq") return KW_MAKE_SEQ;
   if (name == "__make_seq") return KW_MAKE_SEQ;
+  if (name == "__make_seq_property") return KW_MAKE_SEQ_PROPERTY;
   if (name == "mutable") return KW_MUTABLE;
   if (name == "mutable") return KW_MUTABLE;
   if (name == "namespace") return KW_NAMESPACE;
   if (name == "namespace") return KW_NAMESPACE;
   if (name == "noexcept") return KW_NOEXCEPT;
   if (name == "noexcept") return KW_NOEXCEPT;

+ 16 - 29
dtool/src/cppparser/cppScope.cxx

@@ -124,34 +124,9 @@ add_declaration(CPPDeclaration *decl, CPPScope *global_scope,
  *
  *
  */
  */
 void CPPScope::
 void CPPScope::
-add_enum_value(CPPInstance *inst, CPPPreprocessor *preprocessor,
-               const cppyyltype &pos) {
+add_enum_value(CPPInstance *inst) {
   inst->_vis = _current_vis;
   inst->_vis = _current_vis;
 
 
-  if (inst->_leading_comment == (CPPCommentBlock *)NULL) {
-    // Same-line comment?
-    CPPCommentBlock *comment =
-      preprocessor->get_comment_on(pos.first_line, pos.file);
-
-    if (comment == (CPPCommentBlock *)NULL) {
-      // Nope.  Check for a comment before this line.
-      comment =
-        preprocessor->get_comment_before(pos.first_line, pos.file);
-
-      if (comment != NULL) {
-        // This is a bit of a hack, but it prevents us from picking up a same-
-        // line comment from the previous line.
-        if (comment->_line_number != pos.first_line - 1 ||
-            comment->_col_number <= pos.first_column) {
-
-          inst->_leading_comment = comment;
-        }
-      }
-    } else {
-      inst->_leading_comment = comment;
-    }
-  }
-
   string name = inst->get_simple_name();
   string name = inst->get_simple_name();
   if (!name.empty()) {
   if (!name.empty()) {
     _enum_values[name] = inst;
     _enum_values[name] = inst;
@@ -183,6 +158,8 @@ define_extension_type(CPPExtensionType *type, CPPPreprocessor *error_sink) {
     break;
     break;
 
 
   case CPPExtensionType::T_enum:
   case CPPExtensionType::T_enum:
+  case CPPExtensionType::T_enum_struct:
+  case CPPExtensionType::T_enum_class:
     _enums[name] = type;
     _enums[name] = type;
     break;
     break;
   }
   }
@@ -606,6 +583,11 @@ find_scope(const string &name, bool recurse) const {
     if (st != NULL) {
     if (st != NULL) {
       return st->_scope;
       return st->_scope;
     }
     }
+
+    CPPEnumType *et = type->as_enum_type();
+    if (et != NULL) {
+      return et->_scope;
+    }
   }
   }
 
 
   Using::const_iterator ui;
   Using::const_iterator ui;
@@ -645,11 +627,16 @@ find_scope(const string &name, CPPDeclaration::SubstDecl &subst,
   }
   }
 
 
   CPPStructType *st = type->as_struct_type();
   CPPStructType *st = type->as_struct_type();
-  if (st == NULL) {
-    return NULL;
+  if (st != NULL) {
+    return st->_scope;
   }
   }
 
 
-  return st->_scope;
+  CPPEnumType *et = type->as_enum_type();
+  if (et != NULL) {
+    return et->_scope;
+  }
+
+  return NULL;
 }
 }
 
 
 /**
 /**

+ 1 - 3
dtool/src/cppparser/cppScope.h

@@ -61,9 +61,7 @@ public:
   virtual void add_declaration(CPPDeclaration *decl, CPPScope *global_scope,
   virtual void add_declaration(CPPDeclaration *decl, CPPScope *global_scope,
                                CPPPreprocessor *preprocessor,
                                CPPPreprocessor *preprocessor,
                                const cppyyltype &pos);
                                const cppyyltype &pos);
-  virtual void add_enum_value(CPPInstance *inst,
-                              CPPPreprocessor *preprocessor,
-                              const cppyyltype &pos);
+  virtual void add_enum_value(CPPInstance *inst);
   virtual void define_extension_type(CPPExtensionType *type,
   virtual void define_extension_type(CPPExtensionType *type,
                                      CPPPreprocessor *error_sink = NULL);
                                      CPPPreprocessor *error_sink = NULL);
   virtual void define_namespace(CPPNamespace *scope);
   virtual void define_namespace(CPPNamespace *scope);

+ 2 - 3
dtool/src/cppparser/cppTemplateScope.cxx

@@ -43,11 +43,10 @@ add_declaration(CPPDeclaration *decl, CPPScope *global_scope,
  *
  *
  */
  */
 void CPPTemplateScope::
 void CPPTemplateScope::
-add_enum_value(CPPInstance *inst, CPPPreprocessor *preprocessor,
-               const cppyyltype &pos) {
+add_enum_value(CPPInstance *inst) {
   inst->_template_scope = this;
   inst->_template_scope = this;
   assert(_parent_scope != NULL);
   assert(_parent_scope != NULL);
-  _parent_scope->add_enum_value(inst, preprocessor, pos);
+  _parent_scope->add_enum_value(inst);
 }
 }
 
 
 /**
 /**

+ 1 - 3
dtool/src/cppparser/cppTemplateScope.h

@@ -33,9 +33,7 @@ public:
   virtual void add_declaration(CPPDeclaration *decl, CPPScope *global_scope,
   virtual void add_declaration(CPPDeclaration *decl, CPPScope *global_scope,
                                CPPPreprocessor *preprocessor,
                                CPPPreprocessor *preprocessor,
                                const cppyyltype &pos);
                                const cppyyltype &pos);
-  virtual void add_enum_value(CPPInstance *inst,
-                              CPPPreprocessor *preprocessor,
-                              const cppyyltype &pos);
+  virtual void add_enum_value(CPPInstance *inst);
   virtual void define_extension_type(CPPExtensionType *type,
   virtual void define_extension_type(CPPExtensionType *type,
                                      CPPPreprocessor *error_sink = NULL);
                                      CPPPreprocessor *error_sink = NULL);
   virtual void define_namespace(CPPNamespace *scope);
   virtual void define_namespace(CPPNamespace *scope);

+ 4 - 4
dtool/src/dtoolbase/addHash.I

@@ -15,8 +15,8 @@
  * Adds a linear sequence of uint32 words to the hash.
  * Adds a linear sequence of uint32 words to the hash.
  */
  */
 INLINE size_t AddHash::
 INLINE size_t AddHash::
-add_hash(size_t start, const PN_uint32 *words, size_t num_words) {
-  return (size_t)hashword(words, num_words, (PN_uint32)start);
+add_hash(size_t start, const uint32_t *words, size_t num_words) {
+  return (size_t)hashword(words, num_words, (uint32_t)start);
 }
 }
 
 
 /**
 /**
@@ -24,7 +24,7 @@ add_hash(size_t start, const PN_uint32 *words, size_t num_words) {
  */
  */
 INLINE size_t AddHash::
 INLINE size_t AddHash::
 add_hash(size_t start, const PN_float32 *floats, size_t num_floats) {
 add_hash(size_t start, const PN_float32 *floats, size_t num_floats) {
-  return add_hash(start, (const PN_uint32 *)floats, num_floats);
+  return add_hash(start, (const uint32_t *)floats, num_floats);
 }
 }
 
 
 /**
 /**
@@ -32,5 +32,5 @@ add_hash(size_t start, const PN_float32 *floats, size_t num_floats) {
  */
  */
 INLINE size_t AddHash::
 INLINE size_t AddHash::
 add_hash(size_t start, const PN_float64 *floats, size_t num_floats) {
 add_hash(size_t start, const PN_float64 *floats, size_t num_floats) {
-  return add_hash(start, (const PN_uint32 *)floats, num_floats * 2);
+  return add_hash(start, (const uint32_t *)floats, num_floats * 2);
 }
 }

+ 8 - 8
dtool/src/dtoolbase/addHash.cxx

@@ -17,33 +17,33 @@
  * Adds a linear sequence of bytes to the hash.
  * Adds a linear sequence of bytes to the hash.
  */
  */
 size_t AddHash::
 size_t AddHash::
-add_hash(size_t start, const PN_uint8 *bytes, size_t num_bytes) {
+add_hash(size_t start, const uint8_t *bytes, size_t num_bytes) {
   size_t num_words = num_bytes >> 2;
   size_t num_words = num_bytes >> 2;
   size_t remaining_bytes = num_bytes - (num_words << 2);
   size_t remaining_bytes = num_bytes - (num_words << 2);
-  size_t hash = (size_t)hashword((const PN_uint32 *)bytes, num_words, (PN_uint32)start);
+  size_t hash = (size_t)hashword((const uint32_t *)bytes, num_words, (uint32_t)start);
 
 
   switch (remaining_bytes) {
   switch (remaining_bytes) {
   case 3:
   case 3:
     {
     {
-      PN_uint32 remaining;
+      uint32_t remaining;
       remaining = (bytes[num_bytes - 3] << 16) | (bytes[num_bytes - 2] << 8) | (bytes[num_bytes - 1]);
       remaining = (bytes[num_bytes - 3] << 16) | (bytes[num_bytes - 2] << 8) | (bytes[num_bytes - 1]);
-      hash = (size_t)hashword(&remaining, 1, (PN_uint32)hash);
+      hash = (size_t)hashword(&remaining, 1, (uint32_t)hash);
     }
     }
     break;
     break;
 
 
   case 2:
   case 2:
     {
     {
-      PN_uint32 remaining;
+      uint32_t remaining;
       remaining = (bytes[num_bytes - 2] << 8) | (bytes[num_bytes - 1]);
       remaining = (bytes[num_bytes - 2] << 8) | (bytes[num_bytes - 1]);
-      hash = (size_t)hashword(&remaining, 1, (PN_uint32)hash);
+      hash = (size_t)hashword(&remaining, 1, (uint32_t)hash);
     }
     }
     break;
     break;
 
 
   case 1:
   case 1:
     {
     {
-      PN_uint32 remaining;
+      uint32_t remaining;
       remaining = (bytes[num_bytes - 1]);
       remaining = (bytes[num_bytes - 1]);
-      hash = (size_t)hashword(&remaining, 1, (PN_uint32)hash);
+      hash = (size_t)hashword(&remaining, 1, (uint32_t)hash);
     }
     }
     break;
     break;
 
 

+ 2 - 2
dtool/src/dtoolbase/addHash.h

@@ -25,8 +25,8 @@
  */
  */
 class EXPCL_DTOOL AddHash {
 class EXPCL_DTOOL AddHash {
 public:
 public:
-  INLINE static size_t add_hash(size_t start, const PN_uint32 *words, size_t num_words);
-  static size_t add_hash(size_t start, const PN_uint8 *bytes, size_t num_bytes);
+  INLINE static size_t add_hash(size_t start, const uint32_t *words, size_t num_words);
+  static size_t add_hash(size_t start, const uint8_t *bytes, size_t num_bytes);
   INLINE static size_t add_hash(size_t start, const PN_float32 *floats, size_t num_floats);
   INLINE static size_t add_hash(size_t start, const PN_float32 *floats, size_t num_floats);
   INLINE static size_t add_hash(size_t start, const PN_float64 *floats, size_t num_floats);
   INLINE static size_t add_hash(size_t start, const PN_float64 *floats, size_t num_floats);
 };
 };

+ 1 - 1
dtool/src/dtoolbase/atomicAdjustI386Impl.h

@@ -28,7 +28,7 @@
  */
  */
 class EXPCL_DTOOL AtomicAdjustI386Impl {
 class EXPCL_DTOOL AtomicAdjustI386Impl {
 public:
 public:
-  typedef ALIGN_4BYTE PN_int32 Integer;
+  typedef ALIGN_4BYTE int32_t Integer;
   typedef void *UnalignedPointer;
   typedef void *UnalignedPointer;
   typedef ALIGN_4BYTE UnalignedPointer Pointer;
   typedef ALIGN_4BYTE UnalignedPointer Pointer;
 
 

+ 2 - 0
dtool/src/dtoolbase/dtoolbase.h

@@ -415,6 +415,7 @@ typedef struct _object PyObject;
 #define MAKE_PROPERTY(property_name, ...) __make_property(property_name, __VA_ARGS__)
 #define MAKE_PROPERTY(property_name, ...) __make_property(property_name, __VA_ARGS__)
 #define MAKE_PROPERTY2(property_name, ...) __make_property2(property_name, __VA_ARGS__)
 #define MAKE_PROPERTY2(property_name, ...) __make_property2(property_name, __VA_ARGS__)
 #define MAKE_SEQ(seq_name, num_name, element_name) __make_seq(seq_name, num_name, element_name)
 #define MAKE_SEQ(seq_name, num_name, element_name) __make_seq(seq_name, num_name, element_name)
+#define MAKE_SEQ_PROPERTY(property_name, ...) __make_seq_property(property_name, __VA_ARGS__)
 #undef USE_STL_ALLOCATOR  /* Don't try to parse these template classes in interrogate. */
 #undef USE_STL_ALLOCATOR  /* Don't try to parse these template classes in interrogate. */
 #define EXTENSION(x) __extension x
 #define EXTENSION(x) __extension x
 #define EXTEND __extension
 #define EXTEND __extension
@@ -425,6 +426,7 @@ typedef struct _object PyObject;
 #define MAKE_PROPERTY(property_name, ...)
 #define MAKE_PROPERTY(property_name, ...)
 #define MAKE_PROPERTY2(property_name, ...)
 #define MAKE_PROPERTY2(property_name, ...)
 #define MAKE_SEQ(seq_name, num_name, element_name)
 #define MAKE_SEQ(seq_name, num_name, element_name)
+#define MAKE_SEQ_PROPERTY(property_name, ...)
 #define EXTENSION(x)
 #define EXTENSION(x)
 #define EXTEND
 #define EXTEND
 #endif
 #endif

+ 179 - 179
dtool/src/dtoolbase/lookup3.c

@@ -149,25 +149,25 @@ and these came close:
 /*
 /*
 --------------------------------------------------------------------
 --------------------------------------------------------------------
  This works on all machines.  To be useful, it requires
  This works on all machines.  To be useful, it requires
- -- that the key be an array of PN_uint32's, and
- -- that the length be the number of PN_uint32's in the key
+ -- that the key be an array of uint32_t's, and
+ -- that the length be the number of uint32_t's in the key
 
 
  The function hashword() is identical to hashlittle() on little-endian
  The function hashword() is identical to hashlittle() on little-endian
  machines, and identical to hashbig() on big-endian machines,
  machines, and identical to hashbig() on big-endian machines,
- except that the length has to be measured in PN_uint32s rather than in
+ except that the length has to be measured in uint32_ts rather than in
  bytes.  hashlittle() is more complicated than hashword() only because
  bytes.  hashlittle() is more complicated than hashword() only because
  hashlittle() has to dance around fitting the key bytes into registers.
  hashlittle() has to dance around fitting the key bytes into registers.
 --------------------------------------------------------------------
 --------------------------------------------------------------------
 */
 */
-PN_uint32 hashword(
-const PN_uint32 *k,                   /* the key, an array of PN_uint32 values */
-size_t          length,               /* the length of the key, in PN_uint32s */
-PN_uint32        initval)         /* the previous hash, or an arbitrary value */
+uint32_t hashword(
+const uint32_t *k,                   /* the key, an array of uint32_t values */
+size_t          length,               /* the length of the key, in uint32_ts */
+uint32_t        initval)         /* the previous hash, or an arbitrary value */
 {
 {
-  PN_uint32 a,b,c;
+  uint32_t a,b,c;
 
 
   /* Set up the internal state */
   /* Set up the internal state */
-  a = b = c = 0xdeadbeef + (((PN_uint32)length)<<2) + initval;
+  a = b = c = 0xdeadbeef + (((uint32_t)length)<<2) + initval;
 
 
   /*------------------------------------------------- handle most of the key */
   /*------------------------------------------------- handle most of the key */
   while (length > 3)
   while (length > 3)
@@ -180,7 +180,7 @@ PN_uint32        initval)         /* the previous hash, or an arbitrary value */
     k += 3;
     k += 3;
   }
   }
 
 
-  /*------------------------------------------- handle the last 3 PN_uint32's */
+  /*------------------------------------------- handle the last 3 uint32_t's */
   switch(length)                     /* all the case statements fall through */
   switch(length)                     /* all the case statements fall through */
   { 
   { 
   case 3 : c+=k[2];
   case 3 : c+=k[2];
@@ -211,7 +211,7 @@ use a bitmask.  For example, if you need only 10 bits, do
   h = (h & hashmask(10));
   h = (h & hashmask(10));
 In which case, the hash table should have hashsize(10) elements.
 In which case, the hash table should have hashsize(10) elements.
 
 
-If you are hashing n strings (PN_uint8 **)k, do it like this:
+If you are hashing n strings (uint8_t **)k, do it like this:
   for (i=0, h=0; i<n; ++i) h = hashlittle( k[i], len[i], h);
   for (i=0, h=0; i<n; ++i) h = hashlittle( k[i], len[i], h);
 
 
 By Bob Jenkins, 2006.  [email protected].  You may use this
 By Bob Jenkins, 2006.  [email protected].  You may use this
@@ -222,19 +222,19 @@ acceptable.  Do NOT use for cryptographic purposes.
 -------------------------------------------------------------------------------
 -------------------------------------------------------------------------------
 */
 */
 
 
-PN_uint32 hashlittle( const void *key, size_t length, PN_uint32 initval)
+uint32_t hashlittle( const void *key, size_t length, uint32_t initval)
 {
 {
-  PN_uint32 a,b,c;                                          /* internal state */
+  uint32_t a,b,c;                                          /* internal state */
   union { const void *ptr; size_t i; } u;     /* needed for Mac Powerbook G4 */
   union { const void *ptr; size_t i; } u;     /* needed for Mac Powerbook G4 */
 
 
   /* Set up the internal state */
   /* Set up the internal state */
-  a = b = c = 0xdeadbeef + ((PN_uint32)length) + initval;
+  a = b = c = 0xdeadbeef + ((uint32_t)length) + initval;
 
 
   u.ptr = key;
   u.ptr = key;
   if (HASH_LITTLE_ENDIAN && ((u.i & 0x3) == 0)) {
   if (HASH_LITTLE_ENDIAN && ((u.i & 0x3) == 0)) {
-    const PN_uint32 *k =(PN_uint32*) key;                           /* read 32-bit chunks */
+    const uint32_t *k =(uint32_t*) key;                           /* read 32-bit chunks */
 #ifdef VALGRIND
 #ifdef VALGRIND
-    const PN_uint8  *k8;
+    const uint8_t  *k8;
 #endif
 #endif
 
 
     /*------ all but last block: aligned reads and affect 32 bits of (a,b,c) */
     /*------ all but last block: aligned reads and affect 32 bits of (a,b,c) */
@@ -279,20 +279,20 @@ PN_uint32 hashlittle( const void *key, size_t length, PN_uint32 initval)
 
 
 #else /* make valgrind happy */
 #else /* make valgrind happy */
 
 
-    k8 = (const PN_uint8 *)k;
+    k8 = (const uint8_t *)k;
     switch(length)
     switch(length)
     {
     {
     case 12: c+=k[2]; b+=k[1]; a+=k[0]; break;
     case 12: c+=k[2]; b+=k[1]; a+=k[0]; break;
-    case 11: c+=((PN_uint32)k8[10])<<16;  /* fall through */
-    case 10: c+=((PN_uint32)k8[9])<<8;    /* fall through */
+    case 11: c+=((uint32_t)k8[10])<<16;  /* fall through */
+    case 10: c+=((uint32_t)k8[9])<<8;    /* fall through */
     case 9 : c+=k8[8];                   /* fall through */
     case 9 : c+=k8[8];                   /* fall through */
     case 8 : b+=k[1]; a+=k[0]; break;
     case 8 : b+=k[1]; a+=k[0]; break;
-    case 7 : b+=((PN_uint32)k8[6])<<16;   /* fall through */
-    case 6 : b+=((PN_uint32)k8[5])<<8;    /* fall through */
+    case 7 : b+=((uint32_t)k8[6])<<16;   /* fall through */
+    case 6 : b+=((uint32_t)k8[5])<<8;    /* fall through */
     case 5 : b+=k8[4];                   /* fall through */
     case 5 : b+=k8[4];                   /* fall through */
     case 4 : a+=k[0]; break;
     case 4 : a+=k[0]; break;
-    case 3 : a+=((PN_uint32)k8[2])<<16;   /* fall through */
-    case 2 : a+=((PN_uint32)k8[1])<<8;    /* fall through */
+    case 3 : a+=((uint32_t)k8[2])<<16;   /* fall through */
+    case 2 : a+=((uint32_t)k8[1])<<8;    /* fall through */
     case 1 : a+=k8[0]; break;
     case 1 : a+=k8[0]; break;
     case 0 : return c;
     case 0 : return c;
     }
     }
@@ -300,45 +300,45 @@ PN_uint32 hashlittle( const void *key, size_t length, PN_uint32 initval)
 #endif /* !valgrind */
 #endif /* !valgrind */
 
 
   } else if (HASH_LITTLE_ENDIAN && ((u.i & 0x1) == 0)) {
   } else if (HASH_LITTLE_ENDIAN && ((u.i & 0x1) == 0)) {
-    const PN_uint16 *k = (PN_uint16*)key;                           /* read 16-bit chunks */
-    const PN_uint8  *k8;
+    const uint16_t *k = (uint16_t*)key;                           /* read 16-bit chunks */
+    const uint8_t  *k8;
 
 
     /*--------------- all but last block: aligned reads and different mixing */
     /*--------------- all but last block: aligned reads and different mixing */
     while (length > 12)
     while (length > 12)
     {
     {
-      a += k[0] + (((PN_uint32)k[1])<<16);
-      b += k[2] + (((PN_uint32)k[3])<<16);
-      c += k[4] + (((PN_uint32)k[5])<<16);
+      a += k[0] + (((uint32_t)k[1])<<16);
+      b += k[2] + (((uint32_t)k[3])<<16);
+      c += k[4] + (((uint32_t)k[5])<<16);
       mix(a,b,c);
       mix(a,b,c);
       length -= 12;
       length -= 12;
       k += 6;
       k += 6;
     }
     }
 
 
     /*----------------------------- handle the last (probably partial) block */
     /*----------------------------- handle the last (probably partial) block */
-    k8 = (const PN_uint8 *)k;
+    k8 = (const uint8_t *)k;
     switch(length)
     switch(length)
     {
     {
-    case 12: c+=k[4]+(((PN_uint32)k[5])<<16);
-             b+=k[2]+(((PN_uint32)k[3])<<16);
-             a+=k[0]+(((PN_uint32)k[1])<<16);
+    case 12: c+=k[4]+(((uint32_t)k[5])<<16);
+             b+=k[2]+(((uint32_t)k[3])<<16);
+             a+=k[0]+(((uint32_t)k[1])<<16);
              break;
              break;
-    case 11: c+=((PN_uint32)k8[10])<<16;     /* fall through */
+    case 11: c+=((uint32_t)k8[10])<<16;     /* fall through */
     case 10: c+=k[4];
     case 10: c+=k[4];
-             b+=k[2]+(((PN_uint32)k[3])<<16);
-             a+=k[0]+(((PN_uint32)k[1])<<16);
+             b+=k[2]+(((uint32_t)k[3])<<16);
+             a+=k[0]+(((uint32_t)k[1])<<16);
              break;
              break;
     case 9 : c+=k8[8];                      /* fall through */
     case 9 : c+=k8[8];                      /* fall through */
-    case 8 : b+=k[2]+(((PN_uint32)k[3])<<16);
-             a+=k[0]+(((PN_uint32)k[1])<<16);
+    case 8 : b+=k[2]+(((uint32_t)k[3])<<16);
+             a+=k[0]+(((uint32_t)k[1])<<16);
              break;
              break;
-    case 7 : b+=((PN_uint32)k8[6])<<16;      /* fall through */
+    case 7 : b+=((uint32_t)k8[6])<<16;      /* fall through */
     case 6 : b+=k[2];
     case 6 : b+=k[2];
-             a+=k[0]+(((PN_uint32)k[1])<<16);
+             a+=k[0]+(((uint32_t)k[1])<<16);
              break;
              break;
     case 5 : b+=k8[4];                      /* fall through */
     case 5 : b+=k8[4];                      /* fall through */
-    case 4 : a+=k[0]+(((PN_uint32)k[1])<<16);
+    case 4 : a+=k[0]+(((uint32_t)k[1])<<16);
              break;
              break;
-    case 3 : a+=((PN_uint32)k8[2])<<16;      /* fall through */
+    case 3 : a+=((uint32_t)k8[2])<<16;      /* fall through */
     case 2 : a+=k[0];
     case 2 : a+=k[0];
              break;
              break;
     case 1 : a+=k8[0];
     case 1 : a+=k8[0];
@@ -347,23 +347,23 @@ PN_uint32 hashlittle( const void *key, size_t length, PN_uint32 initval)
     }
     }
 
 
   } else {                        /* need to read the key one byte at a time */
   } else {                        /* need to read the key one byte at a time */
-    const PN_uint8 *k =(PN_uint8*) key;
+    const uint8_t *k =(uint8_t*) key;
 
 
     /*--------------- all but the last block: affect some 32 bits of (a,b,c) */
     /*--------------- all but the last block: affect some 32 bits of (a,b,c) */
     while (length > 12)
     while (length > 12)
     {
     {
       a += k[0];
       a += k[0];
-      a += ((PN_uint32)k[1])<<8;
-      a += ((PN_uint32)k[2])<<16;
-      a += ((PN_uint32)k[3])<<24;
+      a += ((uint32_t)k[1])<<8;
+      a += ((uint32_t)k[2])<<16;
+      a += ((uint32_t)k[3])<<24;
       b += k[4];
       b += k[4];
-      b += ((PN_uint32)k[5])<<8;
-      b += ((PN_uint32)k[6])<<16;
-      b += ((PN_uint32)k[7])<<24;
+      b += ((uint32_t)k[5])<<8;
+      b += ((uint32_t)k[6])<<16;
+      b += ((uint32_t)k[7])<<24;
       c += k[8];
       c += k[8];
-      c += ((PN_uint32)k[9])<<8;
-      c += ((PN_uint32)k[10])<<16;
-      c += ((PN_uint32)k[11])<<24;
+      c += ((uint32_t)k[9])<<8;
+      c += ((uint32_t)k[10])<<16;
+      c += ((uint32_t)k[11])<<24;
       mix(a,b,c);
       mix(a,b,c);
       length -= 12;
       length -= 12;
       k += 12;
       k += 12;
@@ -372,17 +372,17 @@ PN_uint32 hashlittle( const void *key, size_t length, PN_uint32 initval)
     /*-------------------------------- last block: affect all 32 bits of (c) */
     /*-------------------------------- last block: affect all 32 bits of (c) */
     switch(length)                   /* all the case statements fall through */
     switch(length)                   /* all the case statements fall through */
     {
     {
-    case 12: c+=((PN_uint32)k[11])<<24;
-    case 11: c+=((PN_uint32)k[10])<<16;
-    case 10: c+=((PN_uint32)k[9])<<8;
+    case 12: c+=((uint32_t)k[11])<<24;
+    case 11: c+=((uint32_t)k[10])<<16;
+    case 10: c+=((uint32_t)k[9])<<8;
     case 9 : c+=k[8];
     case 9 : c+=k[8];
-    case 8 : b+=((PN_uint32)k[7])<<24;
-    case 7 : b+=((PN_uint32)k[6])<<16;
-    case 6 : b+=((PN_uint32)k[5])<<8;
+    case 8 : b+=((uint32_t)k[7])<<24;
+    case 7 : b+=((uint32_t)k[6])<<16;
+    case 6 : b+=((uint32_t)k[5])<<8;
     case 5 : b+=k[4];
     case 5 : b+=k[4];
-    case 4 : a+=((PN_uint32)k[3])<<24;
-    case 3 : a+=((PN_uint32)k[2])<<16;
-    case 2 : a+=((PN_uint32)k[1])<<8;
+    case 4 : a+=((uint32_t)k[3])<<24;
+    case 3 : a+=((uint32_t)k[2])<<16;
+    case 2 : a+=((uint32_t)k[1])<<8;
     case 1 : a+=k[0];
     case 1 : a+=k[0];
              break;
              break;
     case 0 : return c;
     case 0 : return c;
@@ -407,21 +407,21 @@ PN_uint32 hashlittle( const void *key, size_t length, PN_uint32 initval)
 void hashlittle2( 
 void hashlittle2( 
   const void *key,       /* the key to hash */
   const void *key,       /* the key to hash */
   size_t      length,    /* length of the key */
   size_t      length,    /* length of the key */
-  PN_uint32   *pc,        /* IN: primary initval, OUT: primary hash */
-  PN_uint32   *pb)        /* IN: secondary initval, OUT: secondary hash */
+  uint32_t   *pc,        /* IN: primary initval, OUT: primary hash */
+  uint32_t   *pb)        /* IN: secondary initval, OUT: secondary hash */
 {
 {
-  PN_uint32 a,b,c;                                          /* internal state */
+  uint32_t a,b,c;                                          /* internal state */
   union { const void *ptr; size_t i; } u;     /* needed for Mac Powerbook G4 */
   union { const void *ptr; size_t i; } u;     /* needed for Mac Powerbook G4 */
 
 
   /* Set up the internal state */
   /* Set up the internal state */
-  a = b = c = 0xdeadbeef + ((PN_uint32)length) + *pc;
+  a = b = c = 0xdeadbeef + ((uint32_t)length) + *pc;
   c += *pb;
   c += *pb;
 
 
   u.ptr = key;
   u.ptr = key;
   if (HASH_LITTLE_ENDIAN && ((u.i & 0x3) == 0)) {
   if (HASH_LITTLE_ENDIAN && ((u.i & 0x3) == 0)) {
-    const PN_uint32 *k = (PN_uint32*)key;                           /* read 32-bit chunks */
+    const uint32_t *k = (uint32_t*)key;                           /* read 32-bit chunks */
 #ifdef VALGRIND
 #ifdef VALGRIND
-    const PN_uint8  *k8;
+    const uint8_t  *k8;
 #endif
 #endif
 
 
     /*------ all but last block: aligned reads and affect 32 bits of (a,b,c) */
     /*------ all but last block: aligned reads and affect 32 bits of (a,b,c) */
@@ -466,20 +466,20 @@ void hashlittle2(
 
 
 #else /* make valgrind happy */
 #else /* make valgrind happy */
 
 
-    k8 = (const PN_uint8 *)k;
+    k8 = (const uint8_t *)k;
     switch(length)
     switch(length)
     {
     {
     case 12: c+=k[2]; b+=k[1]; a+=k[0]; break;
     case 12: c+=k[2]; b+=k[1]; a+=k[0]; break;
-    case 11: c+=((PN_uint32)k8[10])<<16;  /* fall through */
-    case 10: c+=((PN_uint32)k8[9])<<8;    /* fall through */
+    case 11: c+=((uint32_t)k8[10])<<16;  /* fall through */
+    case 10: c+=((uint32_t)k8[9])<<8;    /* fall through */
     case 9 : c+=k8[8];                   /* fall through */
     case 9 : c+=k8[8];                   /* fall through */
     case 8 : b+=k[1]; a+=k[0]; break;
     case 8 : b+=k[1]; a+=k[0]; break;
-    case 7 : b+=((PN_uint32)k8[6])<<16;   /* fall through */
-    case 6 : b+=((PN_uint32)k8[5])<<8;    /* fall through */
+    case 7 : b+=((uint32_t)k8[6])<<16;   /* fall through */
+    case 6 : b+=((uint32_t)k8[5])<<8;    /* fall through */
     case 5 : b+=k8[4];                   /* fall through */
     case 5 : b+=k8[4];                   /* fall through */
     case 4 : a+=k[0]; break;
     case 4 : a+=k[0]; break;
-    case 3 : a+=((PN_uint32)k8[2])<<16;   /* fall through */
-    case 2 : a+=((PN_uint32)k8[1])<<8;    /* fall through */
+    case 3 : a+=((uint32_t)k8[2])<<16;   /* fall through */
+    case 2 : a+=((uint32_t)k8[1])<<8;    /* fall through */
     case 1 : a+=k8[0]; break;
     case 1 : a+=k8[0]; break;
     case 0 : *pc=c; *pb=b; return;  /* zero length strings require no mixing */
     case 0 : *pc=c; *pb=b; return;  /* zero length strings require no mixing */
     }
     }
@@ -487,45 +487,45 @@ void hashlittle2(
 #endif /* !valgrind */
 #endif /* !valgrind */
 
 
   } else if (HASH_LITTLE_ENDIAN && ((u.i & 0x1) == 0)) {
   } else if (HASH_LITTLE_ENDIAN && ((u.i & 0x1) == 0)) {
-    const PN_uint16 *k = (PN_uint16*)key;                           /* read 16-bit chunks */
-    const PN_uint8  *k8;
+    const uint16_t *k = (uint16_t*)key;                           /* read 16-bit chunks */
+    const uint8_t  *k8;
 
 
     /*--------------- all but last block: aligned reads and different mixing */
     /*--------------- all but last block: aligned reads and different mixing */
     while (length > 12)
     while (length > 12)
     {
     {
-      a += k[0] + (((PN_uint32)k[1])<<16);
-      b += k[2] + (((PN_uint32)k[3])<<16);
-      c += k[4] + (((PN_uint32)k[5])<<16);
+      a += k[0] + (((uint32_t)k[1])<<16);
+      b += k[2] + (((uint32_t)k[3])<<16);
+      c += k[4] + (((uint32_t)k[5])<<16);
       mix(a,b,c);
       mix(a,b,c);
       length -= 12;
       length -= 12;
       k += 6;
       k += 6;
     }
     }
 
 
     /*----------------------------- handle the last (probably partial) block */
     /*----------------------------- handle the last (probably partial) block */
-    k8 = (const PN_uint8 *)k;
+    k8 = (const uint8_t *)k;
     switch(length)
     switch(length)
     {
     {
-    case 12: c+=k[4]+(((PN_uint32)k[5])<<16);
-             b+=k[2]+(((PN_uint32)k[3])<<16);
-             a+=k[0]+(((PN_uint32)k[1])<<16);
+    case 12: c+=k[4]+(((uint32_t)k[5])<<16);
+             b+=k[2]+(((uint32_t)k[3])<<16);
+             a+=k[0]+(((uint32_t)k[1])<<16);
              break;
              break;
-    case 11: c+=((PN_uint32)k8[10])<<16;     /* fall through */
+    case 11: c+=((uint32_t)k8[10])<<16;     /* fall through */
     case 10: c+=k[4];
     case 10: c+=k[4];
-             b+=k[2]+(((PN_uint32)k[3])<<16);
-             a+=k[0]+(((PN_uint32)k[1])<<16);
+             b+=k[2]+(((uint32_t)k[3])<<16);
+             a+=k[0]+(((uint32_t)k[1])<<16);
              break;
              break;
     case 9 : c+=k8[8];                      /* fall through */
     case 9 : c+=k8[8];                      /* fall through */
-    case 8 : b+=k[2]+(((PN_uint32)k[3])<<16);
-             a+=k[0]+(((PN_uint32)k[1])<<16);
+    case 8 : b+=k[2]+(((uint32_t)k[3])<<16);
+             a+=k[0]+(((uint32_t)k[1])<<16);
              break;
              break;
-    case 7 : b+=((PN_uint32)k8[6])<<16;      /* fall through */
+    case 7 : b+=((uint32_t)k8[6])<<16;      /* fall through */
     case 6 : b+=k[2];
     case 6 : b+=k[2];
-             a+=k[0]+(((PN_uint32)k[1])<<16);
+             a+=k[0]+(((uint32_t)k[1])<<16);
              break;
              break;
     case 5 : b+=k8[4];                      /* fall through */
     case 5 : b+=k8[4];                      /* fall through */
-    case 4 : a+=k[0]+(((PN_uint32)k[1])<<16);
+    case 4 : a+=k[0]+(((uint32_t)k[1])<<16);
              break;
              break;
-    case 3 : a+=((PN_uint32)k8[2])<<16;      /* fall through */
+    case 3 : a+=((uint32_t)k8[2])<<16;      /* fall through */
     case 2 : a+=k[0];
     case 2 : a+=k[0];
              break;
              break;
     case 1 : a+=k8[0];
     case 1 : a+=k8[0];
@@ -534,23 +534,23 @@ void hashlittle2(
     }
     }
 
 
   } else {                        /* need to read the key one byte at a time */
   } else {                        /* need to read the key one byte at a time */
-    const PN_uint8 *k = (PN_uint8*)key;
+    const uint8_t *k = (uint8_t*)key;
 
 
     /*--------------- all but the last block: affect some 32 bits of (a,b,c) */
     /*--------------- all but the last block: affect some 32 bits of (a,b,c) */
     while (length > 12)
     while (length > 12)
     {
     {
       a += k[0];
       a += k[0];
-      a += ((PN_uint32)k[1])<<8;
-      a += ((PN_uint32)k[2])<<16;
-      a += ((PN_uint32)k[3])<<24;
+      a += ((uint32_t)k[1])<<8;
+      a += ((uint32_t)k[2])<<16;
+      a += ((uint32_t)k[3])<<24;
       b += k[4];
       b += k[4];
-      b += ((PN_uint32)k[5])<<8;
-      b += ((PN_uint32)k[6])<<16;
-      b += ((PN_uint32)k[7])<<24;
+      b += ((uint32_t)k[5])<<8;
+      b += ((uint32_t)k[6])<<16;
+      b += ((uint32_t)k[7])<<24;
       c += k[8];
       c += k[8];
-      c += ((PN_uint32)k[9])<<8;
-      c += ((PN_uint32)k[10])<<16;
-      c += ((PN_uint32)k[11])<<24;
+      c += ((uint32_t)k[9])<<8;
+      c += ((uint32_t)k[10])<<16;
+      c += ((uint32_t)k[11])<<24;
       mix(a,b,c);
       mix(a,b,c);
       length -= 12;
       length -= 12;
       k += 12;
       k += 12;
@@ -559,17 +559,17 @@ void hashlittle2(
     /*-------------------------------- last block: affect all 32 bits of (c) */
     /*-------------------------------- last block: affect all 32 bits of (c) */
     switch(length)                   /* all the case statements fall through */
     switch(length)                   /* all the case statements fall through */
     {
     {
-    case 12: c+=((PN_uint32)k[11])<<24;
-    case 11: c+=((PN_uint32)k[10])<<16;
-    case 10: c+=((PN_uint32)k[9])<<8;
+    case 12: c+=((uint32_t)k[11])<<24;
+    case 11: c+=((uint32_t)k[10])<<16;
+    case 10: c+=((uint32_t)k[9])<<8;
     case 9 : c+=k[8];
     case 9 : c+=k[8];
-    case 8 : b+=((PN_uint32)k[7])<<24;
-    case 7 : b+=((PN_uint32)k[6])<<16;
-    case 6 : b+=((PN_uint32)k[5])<<8;
+    case 8 : b+=((uint32_t)k[7])<<24;
+    case 7 : b+=((uint32_t)k[6])<<16;
+    case 6 : b+=((uint32_t)k[5])<<8;
     case 5 : b+=k[4];
     case 5 : b+=k[4];
-    case 4 : a+=((PN_uint32)k[3])<<24;
-    case 3 : a+=((PN_uint32)k[2])<<16;
-    case 2 : a+=((PN_uint32)k[1])<<8;
+    case 4 : a+=((uint32_t)k[3])<<24;
+    case 3 : a+=((uint32_t)k[2])<<16;
+    case 2 : a+=((uint32_t)k[1])<<8;
     case 1 : a+=k[0];
     case 1 : a+=k[0];
              break;
              break;
     case 0 : *pc=c; *pb=b; return;  /* zero length strings require no mixing */
     case 0 : *pc=c; *pb=b; return;  /* zero length strings require no mixing */
@@ -588,19 +588,19 @@ void hashlittle2(
  * from hashlittle() on all machines.  hashbig() takes advantage of
  * from hashlittle() on all machines.  hashbig() takes advantage of
  * big-endian byte ordering. 
  * big-endian byte ordering. 
  */
  */
-PN_uint32 hashbig( const void *key, size_t length, PN_uint32 initval)
+uint32_t hashbig( const void *key, size_t length, uint32_t initval)
 {
 {
-  PN_uint32 a,b,c;
+  uint32_t a,b,c;
   union { const void *ptr; size_t i; } u; /* to cast key to (size_t) happily */
   union { const void *ptr; size_t i; } u; /* to cast key to (size_t) happily */
 
 
   /* Set up the internal state */
   /* Set up the internal state */
-  a = b = c = 0xdeadbeef + ((PN_uint32)length) + initval;
+  a = b = c = 0xdeadbeef + ((uint32_t)length) + initval;
 
 
   u.ptr = key;
   u.ptr = key;
   if (HASH_BIG_ENDIAN && ((u.i & 0x3) == 0)) {
   if (HASH_BIG_ENDIAN && ((u.i & 0x3) == 0)) {
-    const PN_uint32 *k = (PN_uint32*)key;                           /* read 32-bit chunks */
+    const uint32_t *k = (uint32_t*)key;                           /* read 32-bit chunks */
 #ifdef VALGRIND
 #ifdef VALGRIND
-    const PN_uint8  *k8;
+    const uint8_t  *k8;
 #endif
 #endif
 
 
     /*------ all but last block: aligned reads and affect 32 bits of (a,b,c) */
     /*------ all but last block: aligned reads and affect 32 bits of (a,b,c) */
@@ -645,44 +645,44 @@ PN_uint32 hashbig( const void *key, size_t length, PN_uint32 initval)
 
 
 #else  /* make valgrind happy */
 #else  /* make valgrind happy */
 
 
-    k8 = (const PN_uint8 *)k;
+    k8 = (const uint8_t *)k;
     switch(length)                   /* all the case statements fall through */
     switch(length)                   /* all the case statements fall through */
     {
     {
     case 12: c+=k[2]; b+=k[1]; a+=k[0]; break;
     case 12: c+=k[2]; b+=k[1]; a+=k[0]; break;
-    case 11: c+=((PN_uint32)k8[10])<<8;  /* fall through */
-    case 10: c+=((PN_uint32)k8[9])<<16;  /* fall through */
-    case 9 : c+=((PN_uint32)k8[8])<<24;  /* fall through */
+    case 11: c+=((uint32_t)k8[10])<<8;  /* fall through */
+    case 10: c+=((uint32_t)k8[9])<<16;  /* fall through */
+    case 9 : c+=((uint32_t)k8[8])<<24;  /* fall through */
     case 8 : b+=k[1]; a+=k[0]; break;
     case 8 : b+=k[1]; a+=k[0]; break;
-    case 7 : b+=((PN_uint32)k8[6])<<8;   /* fall through */
-    case 6 : b+=((PN_uint32)k8[5])<<16;  /* fall through */
-    case 5 : b+=((PN_uint32)k8[4])<<24;  /* fall through */
+    case 7 : b+=((uint32_t)k8[6])<<8;   /* fall through */
+    case 6 : b+=((uint32_t)k8[5])<<16;  /* fall through */
+    case 5 : b+=((uint32_t)k8[4])<<24;  /* fall through */
     case 4 : a+=k[0]; break;
     case 4 : a+=k[0]; break;
-    case 3 : a+=((PN_uint32)k8[2])<<8;   /* fall through */
-    case 2 : a+=((PN_uint32)k8[1])<<16;  /* fall through */
-    case 1 : a+=((PN_uint32)k8[0])<<24; break;
+    case 3 : a+=((uint32_t)k8[2])<<8;   /* fall through */
+    case 2 : a+=((uint32_t)k8[1])<<16;  /* fall through */
+    case 1 : a+=((uint32_t)k8[0])<<24; break;
     case 0 : return c;
     case 0 : return c;
     }
     }
 
 
 #endif /* !VALGRIND */
 #endif /* !VALGRIND */
 
 
   } else {                        /* need to read the key one byte at a time */
   } else {                        /* need to read the key one byte at a time */
-    const PN_uint8 *k = (PN_uint8*)key;
+    const uint8_t *k = (uint8_t*)key;
 
 
     /*--------------- all but the last block: affect some 32 bits of (a,b,c) */
     /*--------------- all but the last block: affect some 32 bits of (a,b,c) */
     while (length > 12)
     while (length > 12)
     {
     {
-      a += ((PN_uint32)k[0])<<24;
-      a += ((PN_uint32)k[1])<<16;
-      a += ((PN_uint32)k[2])<<8;
-      a += ((PN_uint32)k[3]);
-      b += ((PN_uint32)k[4])<<24;
-      b += ((PN_uint32)k[5])<<16;
-      b += ((PN_uint32)k[6])<<8;
-      b += ((PN_uint32)k[7]);
-      c += ((PN_uint32)k[8])<<24;
-      c += ((PN_uint32)k[9])<<16;
-      c += ((PN_uint32)k[10])<<8;
-      c += ((PN_uint32)k[11]);
+      a += ((uint32_t)k[0])<<24;
+      a += ((uint32_t)k[1])<<16;
+      a += ((uint32_t)k[2])<<8;
+      a += ((uint32_t)k[3]);
+      b += ((uint32_t)k[4])<<24;
+      b += ((uint32_t)k[5])<<16;
+      b += ((uint32_t)k[6])<<8;
+      b += ((uint32_t)k[7]);
+      c += ((uint32_t)k[8])<<24;
+      c += ((uint32_t)k[9])<<16;
+      c += ((uint32_t)k[10])<<8;
+      c += ((uint32_t)k[11]);
       mix(a,b,c);
       mix(a,b,c);
       length -= 12;
       length -= 12;
       k += 12;
       k += 12;
@@ -692,17 +692,17 @@ PN_uint32 hashbig( const void *key, size_t length, PN_uint32 initval)
     switch(length)                   /* all the case statements fall through */
     switch(length)                   /* all the case statements fall through */
     {
     {
     case 12: c+=k[11];
     case 12: c+=k[11];
-    case 11: c+=((PN_uint32)k[10])<<8;
-    case 10: c+=((PN_uint32)k[9])<<16;
-    case 9 : c+=((PN_uint32)k[8])<<24;
+    case 11: c+=((uint32_t)k[10])<<8;
+    case 10: c+=((uint32_t)k[9])<<16;
+    case 9 : c+=((uint32_t)k[8])<<24;
     case 8 : b+=k[7];
     case 8 : b+=k[7];
-    case 7 : b+=((PN_uint32)k[6])<<8;
-    case 6 : b+=((PN_uint32)k[5])<<16;
-    case 5 : b+=((PN_uint32)k[4])<<24;
+    case 7 : b+=((uint32_t)k[6])<<8;
+    case 6 : b+=((uint32_t)k[5])<<16;
+    case 5 : b+=((uint32_t)k[4])<<24;
     case 4 : a+=k[3];
     case 4 : a+=k[3];
-    case 3 : a+=((PN_uint32)k[2])<<8;
-    case 2 : a+=((PN_uint32)k[1])<<16;
-    case 1 : a+=((PN_uint32)k[0])<<24;
+    case 3 : a+=((uint32_t)k[2])<<8;
+    case 2 : a+=((uint32_t)k[1])<<16;
+    case 1 : a+=((uint32_t)k[0])<<24;
              break;
              break;
     case 0 : return c;
     case 0 : return c;
     }
     }
@@ -718,9 +718,9 @@ PN_uint32 hashbig( const void *key, size_t length, PN_uint32 initval)
 /* used for timings */
 /* used for timings */
 void driver1()
 void driver1()
 {
 {
-  PN_uint8 buf[256];
-  PN_uint32 i;
-  PN_uint32 h=0;
+  uint8_t buf[256];
+  uint32_t i;
+  uint32_t h=0;
   time_t a,z;
   time_t a,z;
 
 
   time(&a);
   time(&a);
@@ -740,11 +740,11 @@ void driver1()
 #define MAXLEN  70
 #define MAXLEN  70
 void driver2()
 void driver2()
 {
 {
-  PN_uint8 qa[MAXLEN+1], qb[MAXLEN+2], *a = &qa[0], *b = &qb[1];
-  PN_uint32 c[HASHSTATE], d[HASHSTATE], i=0, j=0, k, l, m=0, z;
-  PN_uint32 e[HASHSTATE],f[HASHSTATE],g[HASHSTATE],h[HASHSTATE];
-  PN_uint32 x[HASHSTATE],y[HASHSTATE];
-  PN_uint32 hlen;
+  uint8_t qa[MAXLEN+1], qb[MAXLEN+2], *a = &qa[0], *b = &qb[1];
+  uint32_t c[HASHSTATE], d[HASHSTATE], i=0, j=0, k, l, m=0, z;
+  uint32_t e[HASHSTATE],f[HASHSTATE],g[HASHSTATE],h[HASHSTATE];
+  uint32_t x[HASHSTATE],y[HASHSTATE];
+  uint32_t hlen;
 
 
   printf("No more than %d trials should ever be needed \n",MAXPAIR/2);
   printf("No more than %d trials should ever be needed \n",MAXPAIR/2);
   for (hlen=0; hlen < MAXLEN; ++hlen)
   for (hlen=0; hlen < MAXLEN; ++hlen)
@@ -757,14 +757,14 @@ void driver2()
 	for (m=1; m<8; ++m) /*------------ for serveral possible initvals, */
 	for (m=1; m<8; ++m) /*------------ for serveral possible initvals, */
 	{
 	{
 	  for (l=0; l<HASHSTATE; ++l)
 	  for (l=0; l<HASHSTATE; ++l)
-	    e[l]=f[l]=g[l]=h[l]=x[l]=y[l]=~((PN_uint32)0);
+	    e[l]=f[l]=g[l]=h[l]=x[l]=y[l]=~((uint32_t)0);
 
 
       	  /*---- check that every output bit is affected by that input bit */
       	  /*---- check that every output bit is affected by that input bit */
 	  for (k=0; k<MAXPAIR; k+=2)
 	  for (k=0; k<MAXPAIR; k+=2)
 	  { 
 	  { 
-	    PN_uint32 finished=1;
+	    uint32_t finished=1;
 	    /* keys have one bit different */
 	    /* keys have one bit different */
-	    for (l=0; l<hlen+1; ++l) {a[l] = b[l] = (PN_uint8)0;}
+	    for (l=0; l<hlen+1; ++l) {a[l] = b[l] = (uint8_t)0;}
 	    /* have a and b be two keys differing in only one bit */
 	    /* have a and b be two keys differing in only one bit */
 	    a[i] ^= (k<<j);
 	    a[i] ^= (k<<j);
 	    a[i] ^= (k>>(8-j));
 	    a[i] ^= (k>>(8-j));
@@ -810,23 +810,23 @@ void driver2()
 /* Check for reading beyond the end of the buffer and alignment problems */
 /* Check for reading beyond the end of the buffer and alignment problems */
 void driver3()
 void driver3()
 {
 {
-  PN_uint8 buf[MAXLEN+20], *b;
-  PN_uint32 len;
-  PN_uint8 q[] = "This is the time for all good men to come to the aid of their country...";
-  PN_uint32 h;
-  PN_uint8 qq[] = "xThis is the time for all good men to come to the aid of their country...";
-  PN_uint32 i;
-  PN_uint8 qqq[] = "xxThis is the time for all good men to come to the aid of their country...";
-  PN_uint32 j;
-  PN_uint8 qqqq[] = "xxxThis is the time for all good men to come to the aid of their country...";
-  PN_uint32 ref,x,y;
-  PN_uint8 *p;
+  uint8_t buf[MAXLEN+20], *b;
+  uint32_t len;
+  uint8_t q[] = "This is the time for all good men to come to the aid of their country...";
+  uint32_t h;
+  uint8_t qq[] = "xThis is the time for all good men to come to the aid of their country...";
+  uint32_t i;
+  uint8_t qqq[] = "xxThis is the time for all good men to come to the aid of their country...";
+  uint32_t j;
+  uint8_t qqqq[] = "xxxThis is the time for all good men to come to the aid of their country...";
+  uint32_t ref,x,y;
+  uint8_t *p;
 
 
   printf("Endianness.  These lines should all be the same (for values filled in):\n");
   printf("Endianness.  These lines should all be the same (for values filled in):\n");
   printf("%.8x                            %.8x                            %.8x\n",
   printf("%.8x                            %.8x                            %.8x\n",
-         hashword((const PN_uint32 *)q, (sizeof(q)-1)/4, 13),
-         hashword((const PN_uint32 *)q, (sizeof(q)-5)/4, 13),
-         hashword((const PN_uint32 *)q, (sizeof(q)-9)/4, 13));
+         hashword((const uint32_t *)q, (sizeof(q)-1)/4, 13),
+         hashword((const uint32_t *)q, (sizeof(q)-5)/4, 13),
+         hashword((const uint32_t *)q, (sizeof(q)-9)/4, 13));
   p = q;
   p = q;
   printf("%.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x\n",
   printf("%.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x %.8x\n",
          hashlittle(p, sizeof(q)-1, 13), hashlittle(p, sizeof(q)-2, 13),
          hashlittle(p, sizeof(q)-1, 13), hashlittle(p, sizeof(q)-2, 13),
@@ -868,11 +868,11 @@ void driver3()
       for (j=0; j<i; ++j) *(b+j)=0;
       for (j=0; j<i; ++j) *(b+j)=0;
 
 
       /* these should all be equal */
       /* these should all be equal */
-      ref = hashlittle(b, len, (PN_uint32)1);
-      *(b+i)=(PN_uint8)~0;
-      *(b-1)=(PN_uint8)~0;
-      x = hashlittle(b, len, (PN_uint32)1);
-      y = hashlittle(b, len, (PN_uint32)1);
+      ref = hashlittle(b, len, (uint32_t)1);
+      *(b+i)=(uint8_t)~0;
+      *(b-1)=(uint8_t)~0;
+      x = hashlittle(b, len, (uint32_t)1);
+      y = hashlittle(b, len, (uint32_t)1);
       if ((ref != x) || (ref != y)) 
       if ((ref != x) || (ref != y)) 
       {
       {
 	printf("alignment error: %.8x %.8x %.8x %d %d\n",ref,x,y,
 	printf("alignment error: %.8x %.8x %.8x %d %d\n",ref,x,y,
@@ -885,8 +885,8 @@ void driver3()
 /* check for problems with nulls */
 /* check for problems with nulls */
  void driver4()
  void driver4()
 {
 {
-  PN_uint8 buf[1];
-  PN_uint32 h,i,state[HASHSTATE];
+  uint8_t buf[1];
+  uint32_t h,i,state[HASHSTATE];
 
 
 
 
   buf[0] = ~0;
   buf[0] = ~0;

+ 3 - 3
dtool/src/dtoolbase/lookup3.h

@@ -21,9 +21,9 @@
 extern "C" {
 extern "C" {
 #endif
 #endif
 
 
-EXPCL_DTOOL PN_uint32 hashword(const PN_uint32 *k,                   /* the key, an array of PN_uint32 values */
-                               size_t          length,               /* the length of the key, in PN_uint32s */
-                               PN_uint32        initval);
+EXPCL_DTOOL uint32_t hashword(const uint32_t *k,                   /* the key, an array of uint32_t values */
+                               size_t          length,               /* the length of the key, in uint32_ts */
+                               uint32_t        initval);
 
 
 #ifdef __cplusplus
 #ifdef __cplusplus
 };  /* end of extern "C" */
 };  /* end of extern "C" */

+ 1 - 24
dtool/src/dtoolbase/numeric_types.h

@@ -19,30 +19,7 @@
 // This header file defines a number of typedefs that correspond to the
 // This header file defines a number of typedefs that correspond to the
 // various numeric types for unsigned and signed numbers of various widths.
 // various numeric types for unsigned and signed numbers of various widths.
 
 
-#if defined(WIN32_VC) && !defined(CPPPARSER)
-typedef signed __int8  PN_int8;
-typedef signed __int16 PN_int16;
-typedef signed __int32 PN_int32;
-typedef signed __int64 PN_int64;
-
-typedef unsigned __int8  PN_uint8;
-typedef unsigned __int16 PN_uint16;
-typedef unsigned __int32 PN_uint32;
-typedef unsigned __int64 PN_uint64;
-
-#else
-
-typedef signed char PN_int8;
-typedef short int PN_int16;
-typedef int PN_int32;
-typedef long long int PN_int64;
-
-typedef unsigned char PN_uint8;
-typedef unsigned short int PN_uint16;
-typedef unsigned int PN_uint32;
-typedef unsigned long long int PN_uint64;
-
-#endif
+#include <stdint.h>
 
 
 typedef double PN_float64;
 typedef double PN_float64;
 typedef float PN_float32;
 typedef float PN_float32;

+ 4 - 4
dtool/src/dtoolbase/stl_compares.I

@@ -99,7 +99,7 @@ is_equal(const Key &a, const Key &b) const {
 template<class Key, class Compare>
 template<class Key, class Compare>
 INLINE size_t integer_hash<Key, Compare>::
 INLINE size_t integer_hash<Key, Compare>::
 add_hash(size_t hash, const Key &key) {
 add_hash(size_t hash, const Key &key) {
-  PN_uint32 key32 = (PN_uint32)(key);
+  uint32_t key32 = (uint32_t)(key);
   return AddHash::add_hash(hash, &key32, 1);
   return AddHash::add_hash(hash, &key32, 1);
 }
 }
 
 
@@ -109,7 +109,7 @@ add_hash(size_t hash, const Key &key) {
 INLINE size_t pointer_hash::
 INLINE size_t pointer_hash::
 add_hash(size_t hash, const void *key) {
 add_hash(size_t hash, const void *key) {
   // We don't mind if this loses precision.
   // We don't mind if this loses precision.
-  PN_uint32 key32 = (PN_uint32)reinterpret_cast<uintptr_t>(key);
+  uint32_t key32 = (uint32_t)reinterpret_cast<uintptr_t>(key);
   return AddHash::add_hash(hash, &key32, 1);
   return AddHash::add_hash(hash, &key32, 1);
 }
 }
 
 
@@ -147,7 +147,7 @@ operator () (const Key &a, const Key &b) const {
 template<class Key>
 template<class Key>
 INLINE size_t floating_point_hash<Key>::
 INLINE size_t floating_point_hash<Key>::
 add_hash(size_t hash, const Key &key) const {
 add_hash(size_t hash, const Key &key) const {
-  PN_uint32 key32 = (PN_uint32)(key / _threshold + 0.5f);
+  uint32_t key32 = (uint32_t)(key / _threshold + 0.5f);
   return AddHash::add_hash(hash, &key32, 1);
   return AddHash::add_hash(hash, &key32, 1);
 }
 }
 
 
@@ -173,7 +173,7 @@ add_hash(size_t hash, const Key &key) {
   }
   }
 #endif
 #endif
   size_t num_bytes = (key.size() * sizeof(key[0]));
   size_t num_bytes = (key.size() * sizeof(key[0]));
-  return AddHash::add_hash(hash, (const PN_uint8 *)&key[0], num_bytes);
+  return AddHash::add_hash(hash, (const uint8_t *)&key[0], num_bytes);
 }
 }
 
 
 /**
 /**

+ 2 - 0
dtool/src/dtoolbase/typeHandle.h

@@ -114,6 +114,8 @@ PUBLISHED:
 
 
   MAKE_PROPERTY(index, get_index);
   MAKE_PROPERTY(index, get_index);
   MAKE_PROPERTY(name, get_name);
   MAKE_PROPERTY(name, get_name);
+  MAKE_SEQ_PROPERTY(parent_classes, get_num_parent_classes, get_parent_class);
+  MAKE_SEQ_PROPERTY(child_classes, get_num_child_classes, get_child_class);
 
 
 public:
 public:
   INLINE static TypeHandle from_index(int index);
   INLINE static TypeHandle from_index(int index);

+ 4 - 4
dtool/src/dtoolbase/typeRegistry.cxx

@@ -511,10 +511,10 @@ TypeRegistry() {
   // Here's a few sanity checks on the sizes of our words.  We have to put it
   // Here's a few sanity checks on the sizes of our words.  We have to put it
   // here, at runtime, since there doesn't appear to be a cross-platform
   // here, at runtime, since there doesn't appear to be a cross-platform
   // compile-time way to verify that we've chosen the right word sizes.
   // compile-time way to verify that we've chosen the right word sizes.
-  assert(sizeof(PN_uint8) == 1 && sizeof(PN_int8) == 1);
-  assert(sizeof(PN_uint16) == 2 && sizeof(PN_int16) == 2);
-  assert(sizeof(PN_uint32) == 4 && sizeof(PN_int32) == 4);
-  assert(sizeof(PN_uint64) == 8 && sizeof(PN_int64) == 8);
+  assert(sizeof(uint8_t) == 1 && sizeof(int8_t) == 1);
+  assert(sizeof(uint16_t) == 2 && sizeof(int16_t) == 2);
+  assert(sizeof(uint32_t) == 4 && sizeof(int32_t) == 4);
+  assert(sizeof(uint64_t) == 8 && sizeof(int64_t) == 8);
 
 
   assert(sizeof(PN_float32) == 4);
   assert(sizeof(PN_float32) == 4);
   assert(sizeof(PN_float64) == 8);
   assert(sizeof(PN_float64) == 8);

+ 3 - 0
dtool/src/dtoolbase/typeRegistry.h

@@ -79,6 +79,9 @@ PUBLISHED:
   // ptr() returns the pointer to the global TypeRegistry object.
   // ptr() returns the pointer to the global TypeRegistry object.
   static TypeRegistry *ptr();
   static TypeRegistry *ptr();
 
 
+  MAKE_SEQ_PROPERTY(typehandles, get_num_typehandles, get_typehandle);
+  MAKE_SEQ_PROPERTY(root_classes, get_num_root_classes, get_root_class);
+
 private:
 private:
   // The TypeRegistry class should never be constructed by user code.  There
   // The TypeRegistry class should never be constructed by user code.  There
   // is only one in the universe, and it constructs itself!
   // is only one in the universe, and it constructs itself!

+ 1 - 0
dtool/src/dtoolutil/dSearchPath.h

@@ -71,6 +71,7 @@ PUBLISHED:
   size_t get_num_directories() const;
   size_t get_num_directories() const;
   const Filename &get_directory(size_t n) const;
   const Filename &get_directory(size_t n) const;
   MAKE_SEQ(get_directories, get_num_directories, get_directory);
   MAKE_SEQ(get_directories, get_num_directories, get_directory);
+  MAKE_SEQ_PROPERTY(directories, get_num_directories, get_directory);
 
 
   Filename find_file(const Filename &filename) const;
   Filename find_file(const Filename &filename) const;
   size_t find_all_files(const Filename &filename, Results &results) const;
   size_t find_all_files(const Filename &filename, Results &results) const;

+ 1 - 0
dtool/src/dtoolutil/pandaSystem.h

@@ -50,6 +50,7 @@ PUBLISHED:
   size_t get_num_systems() const;
   size_t get_num_systems() const;
   string get_system(size_t n) const;
   string get_system(size_t n) const;
   MAKE_SEQ(get_systems, get_num_systems, get_system);
   MAKE_SEQ(get_systems, get_num_systems, get_system);
+  MAKE_SEQ_PROPERTY(systems, get_num_systems, get_system);
 
 
   string get_system_tag(const string &system, const string &tag) const;
   string get_system_tag(const string &system, const string &tag) const;
 
 

+ 2 - 2
dtool/src/dtoolutil/string_utils.I

@@ -80,13 +80,13 @@ format_string(int value) {
 }
 }
 
 
 INLINE string
 INLINE string
-format_string(PN_int64 value) {
+format_string(int64_t value) {
   char buffer[21];
   char buffer[21];
   char *p = buffer + 20;
   char *p = buffer + 20;
   *p = 0;
   *p = 0;
 
 
   if (value < 0) {
   if (value < 0) {
-    PN_uint64 posv = (PN_uint64)-value;
+    uint64_t posv = (uint64_t)-value;
     do {
     do {
       *--p = '0' + (posv % 10);
       *--p = '0' + (posv % 10);
       posv /= 10;
       posv /= 10;

+ 1 - 1
dtool/src/dtoolutil/string_utils.h

@@ -73,7 +73,7 @@ INLINE string format_string(float value);
 INLINE string format_string(double value);
 INLINE string format_string(double value);
 INLINE string format_string(unsigned int value);
 INLINE string format_string(unsigned int value);
 INLINE string format_string(int value);
 INLINE string format_string(int value);
-INLINE string format_string(PN_int64 value);
+INLINE string format_string(int64_t value);
 
 
 #include "string_utils.I"
 #include "string_utils.I"
 
 

+ 3 - 1
dtool/src/interrogate/interfaceMaker.cxx

@@ -86,10 +86,12 @@ MakeSeq(const string &name, const InterrogateMakeSeq &imake_seq) :
 InterfaceMaker::Property::
 InterfaceMaker::Property::
 Property(const InterrogateElement &ielement) :
 Property(const InterrogateElement &ielement) :
   _ielement(ielement),
   _ielement(ielement),
+  _length_function(NULL),
   _getter(NULL),
   _getter(NULL),
   _setter(NULL),
   _setter(NULL),
   _has_function(NULL),
   _has_function(NULL),
-  _clear_function(NULL)
+  _clear_function(NULL),
+  _deleter(NULL)
 {
 {
 }
 }
 
 

+ 2 - 0
dtool/src/interrogate/interfaceMaker.h

@@ -126,10 +126,12 @@ public:
     Property(const InterrogateElement &ielement);
     Property(const InterrogateElement &ielement);
 
 
     const InterrogateElement &_ielement;
     const InterrogateElement &_ielement;
+    Function *_length_function;
     Function *_getter;
     Function *_getter;
     Function *_setter;
     Function *_setter;
     Function *_has_function;
     Function *_has_function;
     Function *_clear_function;
     Function *_clear_function;
+    Function *_deleter;
   };
   };
   typedef vector<Property *> Properties;
   typedef vector<Property *> Properties;
 
 

+ 335 - 282
dtool/src/interrogate/interfaceMakerPythonNative.cxx

@@ -764,10 +764,6 @@ write_prototypes(ostream &out_code, ostream *out_h) {
     *out_h << "#include \"py_panda.h\"\n\n";
     *out_h << "#include \"py_panda.h\"\n\n";
   }
   }
 
 
-  out_code << "//********************************************************************\n";
-  out_code << "//*** prototypes for .. Global\n";
-  out_code << "//********************************************************************\n";
-
   /*
   /*
   for (fi = _functions.begin(); fi != _functions.end(); ++fi)
   for (fi = _functions.begin(); fi != _functions.end(); ++fi)
   {
   {
@@ -792,9 +788,9 @@ write_prototypes(ostream &out_code, ostream *out_h) {
     }
     }
   }
   }
 
 
-  out_code << "//********************************************************************\n";
-  out_code << "//*** prototypes for .. External Objects\n";
-  out_code << "//********************************************************************\n";
+  out_code << "/**\n";
+  out_code << " * Extern declarations for imported classes\n";
+  out_code << " */\n";
 
 
   for (std::set<CPPType *>::iterator ii = _external_imports.begin(); ii != _external_imports.end(); ii++) {
   for (std::set<CPPType *>::iterator ii = _external_imports.begin(); ii != _external_imports.end(); ii++) {
     CPPType *type = (*ii);
     CPPType *type = (*ii);
@@ -897,9 +893,9 @@ write_prototypes_class_external(ostream &out, Object *obj) {
   std::string preferred_name =  obj->_itype.get_name();
   std::string preferred_name =  obj->_itype.get_name();
 
 
 
 
-  out << "//********************************************************************\n";
-  out << "//*** prototypes for external.. " << class_name << "\n";
-  out << "//********************************************************************\n";
+  out << "/**\n";
+  out << " * Forward declaration of class " << class_name << "\n";
+  out << " */\n";
 
 
   // This typedef is necessary for class templates since we can't pass a comma
   // This typedef is necessary for class templates since we can't pass a comma
   // to a macro function.
   // to a macro function.
@@ -915,9 +911,9 @@ write_prototypes_class(ostream &out_code, ostream *out_h, Object *obj) {
   std::string ClassName = make_safe_name(obj->_itype.get_scoped_name());
   std::string ClassName = make_safe_name(obj->_itype.get_scoped_name());
   Functions::iterator fi;
   Functions::iterator fi;
 
 
-  out_code << "//********************************************************************\n";
-  out_code << "//*** prototypes for .. " << ClassName << "\n";
-  out_code << "//********************************************************************\n";
+  out_code << "/**\n";
+  out_code << " * Forward declarations for top-level class " << ClassName << "\n";
+  out_code << " */\n";
 
 
   /*
   /*
   for (fi = obj->_methods.begin(); fi != obj->_methods.end(); ++fi) {
   for (fi = obj->_methods.begin(); fi != obj->_methods.end(); ++fi) {
@@ -943,9 +939,9 @@ write_prototypes_class(ostream &out_code, ostream *out_h, Object *obj) {
  */
  */
 void InterfaceMakerPythonNative::
 void InterfaceMakerPythonNative::
 write_functions(ostream &out) {
 write_functions(ostream &out) {
-  out << "//********************************************************************\n";
-  out << "//*** Functions for .. Global\n" ;
-  out << "//********************************************************************\n";
+  out << "/**\n";
+  out << " * Python wrappers for global functions\n" ;
+  out << " */\n";
   FunctionsByIndex::iterator fi;
   FunctionsByIndex::iterator fi;
   for (fi = _functions.begin(); fi != _functions.end(); ++fi) {
   for (fi = _functions.begin(); fi != _functions.end(); ++fi) {
     Function *func = (*fi).second;
     Function *func = (*fi).second;
@@ -994,9 +990,9 @@ write_class_details(ostream &out, Object *obj) {
   std::string ClassName = make_safe_name(obj->_itype.get_scoped_name());
   std::string ClassName = make_safe_name(obj->_itype.get_scoped_name());
   std::string cClassName = obj->_itype.get_true_name();
   std::string cClassName = obj->_itype.get_true_name();
 
 
-  out << "//********************************************************************\n";
-  out << "//*** Functions for .. " << cClassName << "\n" ;
-  out << "//********************************************************************\n";
+  out << "/**\n";
+  out << " * Python wrappers for functions of class " << cClassName << "\n" ;
+  out << " */\n";
 
 
   // First write out all the wrapper functions for the methods.
   // First write out all the wrapper functions for the methods.
   for (fi = obj->_methods.begin(); fi != obj->_methods.end(); ++fi) {
   for (fi = obj->_methods.begin(); fi != obj->_methods.end(); ++fi) {
@@ -1017,13 +1013,21 @@ write_class_details(ostream &out, Object *obj) {
   }
   }
 
 
   // Write the constructors.
   // Write the constructors.
+  std::string fname = "static int Dtool_Init_" + ClassName + "(PyObject *self, PyObject *args, PyObject *kwds)";
   for (fi = obj->_constructors.begin(); fi != obj->_constructors.end(); ++fi) {
   for (fi = obj->_constructors.begin(); fi != obj->_constructors.end(); ++fi) {
     Function *func = (*fi);
     Function *func = (*fi);
-    std::string fname = "static int Dtool_Init_" + ClassName + "(PyObject *self, PyObject *args, PyObject *kwds)";
 
 
     string expected_params;
     string expected_params;
     write_function_for_name(out, obj, func->_remaps, fname, expected_params, true, AT_keyword_args, RF_int);
     write_function_for_name(out, obj, func->_remaps, fname, expected_params, true, AT_keyword_args, RF_int);
   }
   }
+  if (obj->_constructors.size() == 0) {
+    // We still need to write a dummy constructor to prevent inheriting the
+    // constructor from a base class.
+    out << fname << " {\n"
+      "  Dtool_Raise_TypeError(\"cannot init abstract class\");\n"
+      "  return -1;\n"
+      "}\n\n";
+  }
 
 
   CPPType *cpptype = TypeManager::resolve_type(obj->_itype._cpptype);
   CPPType *cpptype = TypeManager::resolve_type(obj->_itype._cpptype);
 
 
@@ -1183,7 +1187,6 @@ write_sub_module(ostream &out, Object *obj) {
   // Object * obj = _objects[_embeded_index] ;
   // Object * obj = _objects[_embeded_index] ;
   string class_name = make_safe_name(obj->_itype.get_scoped_name());
   string class_name = make_safe_name(obj->_itype.get_scoped_name());
   string class_ptr;
   string class_ptr;
-  out << "  // Module init upcall for " << obj->_itype.get_scoped_name() << "\n";
 
 
   if (!obj->_itype.is_typedef()) {
   if (!obj->_itype.is_typedef()) {
     out << "  // " << *(obj->_itype._cpptype) << "\n";
     out << "  // " << *(obj->_itype._cpptype) << "\n";
@@ -1242,9 +1245,9 @@ write_sub_module(ostream &out, Object *obj) {
  */
  */
 void InterfaceMakerPythonNative::
 void InterfaceMakerPythonNative::
 write_module_support(ostream &out, ostream *out_h, InterrogateModuleDef *def) {
 write_module_support(ostream &out, ostream *out_h, InterrogateModuleDef *def) {
-  out << "//********************************************************************\n";
-  out << "//*** Module Object Linker ..\n";
-  out << "//********************************************************************\n";
+  out << "/**\n";
+  out << " * Module Object Linker ..\n";
+  out << " */\n";
 
 
   Objects::iterator oi;
   Objects::iterator oi;
 
 
@@ -1305,14 +1308,41 @@ write_module_support(ostream &out, ostream *out_h, InterrogateModuleDef *def) {
     if (object->_itype.is_enum() && !object->_itype.is_nested() &&
     if (object->_itype.is_enum() && !object->_itype.is_nested() &&
         isExportThisRun(object->_itype._cpptype)) {
         isExportThisRun(object->_itype._cpptype)) {
       int enum_count = object->_itype.number_of_enum_values();
       int enum_count = object->_itype.number_of_enum_values();
-      for (int xx = 0; xx < enum_count; xx++) {
-        string name1 = classNameFromCppName(object->_itype.get_enum_value_name(xx), false);
-        string name2 = classNameFromCppName(object->_itype.get_enum_value_name(xx), true);
-        string enum_value = "::" + object->_itype.get_enum_value_name(xx);
-        out << "  PyModule_AddIntConstant(module, \"" << name1 << "\", " << enum_value << ");\n";
-        if (name1 != name2) {
-          // Also write the mangled name, for historical purposes.
-          out << "  PyModule_AddIntConstant(module, \"" << name2 << "\", " << enum_value << ");\n";
+
+      if (object->_itype.is_scoped_enum()) {
+        // Convert as Python 3.4 enum.
+        CPPType *underlying_type = TypeManager::unwrap_const(object->_itype._cpptype->as_enum_type()->get_underlying_type());
+        string cast_to = underlying_type->get_local_name(&parser);
+        out << "#if PY_VERSION_HEX >= 0x03040000\n\n";
+        out << "  // enum class " << object->_itype.get_scoped_name() << "\n";
+        out << "  {\n";
+        out << "    PyObject *members = PyTuple_New(" << enum_count << ");\n";
+        out << "    PyObject *member;\n";
+        for (int xx = 0; xx < enum_count; xx++) {
+          out << "    member = PyTuple_New(2);\n"
+                 "    PyTuple_SET_ITEM(member, 0, PyUnicode_FromString(\""
+              << object->_itype.get_enum_value_name(xx) << "\"));\n"
+                 "    PyTuple_SET_ITEM(member, 1, Dtool_WrapValue(("
+              << cast_to << ")" << object->_itype.get_scoped_name() << "::"
+              << object->_itype.get_enum_value_name(xx) << "));\n"
+                 "    PyTuple_SET_ITEM(members, " << xx << ", member);\n";
+        }
+        out << "    PyModule_AddObject(module, \"" << object->_itype.get_name()
+            << "\", Dtool_EnumType_Create(\"" << object->_itype.get_name()
+            << "\", members, \"" << _def->module_name << "\"));\n";
+        out << "  }\n";
+        out << "#endif\n";
+      } else {
+        out << "  // enum " << object->_itype.get_scoped_name() << "\n";
+        for (int xx = 0; xx < enum_count; xx++) {
+          string name1 = classNameFromCppName(object->_itype.get_enum_value_name(xx), false);
+          string name2 = classNameFromCppName(object->_itype.get_enum_value_name(xx), true);
+          string enum_value = "::" + object->_itype.get_enum_value_name(xx);
+          out << "  PyModule_AddObject(module, \"" << name1 << "\", Dtool_WrapValue(" << enum_value << "));\n";
+          if (name1 != name2) {
+            // Also write the mangled name, for historical purposes.
+            out << "  PyModule_AddObject(module, \"" << name2 << "\", Dtool_WrapValue(" << enum_value << "));\n";
+          }
         }
         }
       }
       }
     }
     }
@@ -1360,13 +1390,6 @@ write_module_support(ostream &out, ostream *out_h, InterrogateModuleDef *def) {
       }
       }
     }
     }
   }
   }
-  out << "//********************************************************************\n";
-  out << "//*** Module Init Upcall ..  Externally Defined Class\n";
-  out << "//********************************************************************\n";
-
-// for (std::set< std::string >::iterator ii = _external_imports.begin(); ii
-// != _external_imports.end(); ii++) out << "Dtool_" <<*ii <<
-// "._Dtool_ClassInit(NULL);\n";
 
 
   out << "}\n\n";
   out << "}\n\n";
 
 
@@ -1435,9 +1458,9 @@ write_module(ostream &out, ostream *out_h, InterrogateModuleDef *def) {
   InterfaceMakerPython::write_module(out, out_h, def);
   InterfaceMakerPython::write_module(out, out_h, def);
   Objects::iterator oi;
   Objects::iterator oi;
 
 
-  out << "//********************************************************************\n";
-  out << "//*** Py Init Code For .. GlobalScope\n" ;
-  out << "//********************************************************************\n";
+  out << "/**\n";
+  out << " * Module initialization functions for Python module \"" << def->module_name << "\"\n";
+  out << " */\n";
 
 
   out << "#if PY_MAJOR_VERSION >= 3\n"
   out << "#if PY_MAJOR_VERSION >= 3\n"
       << "static struct PyModuleDef python_native_module = {\n"
       << "static struct PyModuleDef python_native_module = {\n"
@@ -1452,14 +1475,16 @@ write_module(ostream &out, ostream *out_h, InterrogateModuleDef *def) {
       << "#ifdef _WIN32\n"
       << "#ifdef _WIN32\n"
       << "extern \"C\" __declspec(dllexport) PyObject *PyInit_" << def->module_name << "();\n"
       << "extern \"C\" __declspec(dllexport) PyObject *PyInit_" << def->module_name << "();\n"
       << "#elif __GNUC__ >= 4\n"
       << "#elif __GNUC__ >= 4\n"
-      << "extern \"C\" __attribute__((visibility(\"default\"))) PyInit_" << def->module_name << "();\n"
+      << "extern \"C\" __attribute__((visibility(\"default\"))) PyObject *PyInit_" << def->module_name << "();\n"
       << "#else\n"
       << "#else\n"
       << "extern \"C\" PyObject *PyInit_" << def->module_name << "();\n"
       << "extern \"C\" PyObject *PyInit_" << def->module_name << "();\n"
       << "#endif\n"
       << "#endif\n"
       << "\n"
       << "\n"
       << "PyObject *PyInit_" << def->module_name << "() {\n"
       << "PyObject *PyInit_" << def->module_name << "() {\n"
       << "  LibraryDef *refs[] = {&" << def->library_name << "_moddef, NULL};\n"
       << "  LibraryDef *refs[] = {&" << def->library_name << "_moddef, NULL};\n"
-      << "  return Dtool_PyModuleInitHelper(refs, &python_native_module);\n"
+      << "  PyObject *module = Dtool_PyModuleInitHelper(refs, &python_native_module);\n"
+      << "  Dtool_" << def->library_name << "_BuildInstants(module);\n"
+      << "  return module;\n"
       << "}\n"
       << "}\n"
       << "\n"
       << "\n"
       << "#else  // Python 2 case\n"
       << "#else  // Python 2 case\n"
@@ -1467,14 +1492,15 @@ write_module(ostream &out, ostream *out_h, InterrogateModuleDef *def) {
       << "#ifdef _WIN32\n"
       << "#ifdef _WIN32\n"
       << "extern \"C\" __declspec(dllexport) void init" << def->module_name << "();\n"
       << "extern \"C\" __declspec(dllexport) void init" << def->module_name << "();\n"
       << "#elif __GNUC__ >= 4\n"
       << "#elif __GNUC__ >= 4\n"
-      << "extern \"C\" __attribute__((visibility(\"default\"))) init" << def->module_name << "();\n"
+      << "extern \"C\" __attribute__((visibility(\"default\"))) void init" << def->module_name << "();\n"
       << "#else\n"
       << "#else\n"
       << "extern \"C\" void init" << def->module_name << "();\n"
       << "extern \"C\" void init" << def->module_name << "();\n"
       << "#endif\n"
       << "#endif\n"
       << "\n"
       << "\n"
       << "void init" << def->module_name << "() {\n"
       << "void init" << def->module_name << "() {\n"
       << "  LibraryDef *refs[] = {&" << def->library_name << "_moddef, NULL};\n"
       << "  LibraryDef *refs[] = {&" << def->library_name << "_moddef, NULL};\n"
-      << "  Dtool_PyModuleInitHelper(refs, \"" << def->module_name << "\");\n"
+      << "  PyObject *module = Dtool_PyModuleInitHelper(refs, \"" << def->module_name << "\");\n"
+      << "  Dtool_" << def->library_name << "_BuildInstants(module);\n"
       << "}\n"
       << "}\n"
       << "\n"
       << "\n"
       << "#endif\n"
       << "#endif\n"
@@ -1520,9 +1546,9 @@ write_module_class(ostream &out, Object *obj) {
   }
   }
 
 
   Functions::iterator fi;
   Functions::iterator fi;
-  out << "//********************************************************************\n";
-  out << "//*** Py Init Code For .. " << ClassName << " | " << export_class_name << "\n" ;
-  out << "//********************************************************************\n";
+  out << "/**\n";
+  out << " * Python method tables for " << ClassName << " (" << export_class_name << ")\n" ;
+  out << " */\n";
   out << "static PyMethodDef Dtool_Methods_" << ClassName << "[] = {\n";
   out << "static PyMethodDef Dtool_Methods_" << ClassName << "[] = {\n";
 
 
   SlottedFunctions slots;
   SlottedFunctions slots;
@@ -2449,11 +2475,7 @@ write_module_class(ostream &out, Object *obj) {
             << classNameFromCppName(ClassName, false) << "\");\n";
             << classNameFromCppName(ClassName, false) << "\");\n";
       }
       }
       out << "  std::string ss = os.str();\n";
       out << "  std::string ss = os.str();\n";
-      out << "#if PY_MAJOR_VERSION >= 3\n";
-      out << "  return PyUnicode_FromStringAndSize(ss.data(), ss.length());\n";
-      out << "#else\n";
-      out << "  return PyString_FromStringAndSize(ss.data(), ss.length());\n";
-      out << "#endif\n";
+      out << "  return Dtool_WrapValue(ss);\n";
       out << "}\n\n";
       out << "}\n\n";
       has_local_repr = true;
       has_local_repr = true;
     }
     }
@@ -2479,11 +2501,7 @@ write_module_class(ostream &out, Object *obj) {
         out << "  local_this->write(os);\n";
         out << "  local_this->write(os);\n";
       }
       }
       out << "  std::string ss = os.str();\n";
       out << "  std::string ss = os.str();\n";
-      out << "#if PY_MAJOR_VERSION >= 3\n";
-      out << "  return PyUnicode_FromStringAndSize(ss.data(), ss.length());\n";
-      out << "#else\n";
-      out << "  return PyString_FromStringAndSize(ss.data(), ss.length());\n";
-      out << "#endif\n";
+      out << "  return Dtool_WrapValue(ss);\n";
       out << "}\n\n";
       out << "}\n\n";
       has_local_str = true;
       has_local_str = true;
     }
     }
@@ -2608,7 +2626,8 @@ write_module_class(ostream &out, Object *obj) {
 
 
       string getter = "&Dtool_" + ClassName + "_" + ielem.get_name() + "_Getter";
       string getter = "&Dtool_" + ClassName + "_" + ielem.get_name() + "_Getter";
       string setter = "NULL";
       string setter = "NULL";
-      if (property->_setter != NULL && is_function_legal(property->_setter)) {
+      if (property->_length_function == NULL &&
+          property->_setter != NULL && is_function_legal(property->_setter)) {
         setter = "&Dtool_" + ClassName + "_" + ielem.get_name() + "_Setter";
         setter = "&Dtool_" + ClassName + "_" + ielem.get_name() + "_Setter";
       }
       }
 
 
@@ -2921,11 +2940,7 @@ write_module_class(ostream &out, Object *obj) {
   // Py_ssize_t tp_dictoffset;
   // Py_ssize_t tp_dictoffset;
   out << "    0, // tp_dictoffset\n";
   out << "    0, // tp_dictoffset\n";
   // initproc tp_init;
   // initproc tp_init;
-  if (obj->_constructors.size() > 0) {
-    out << "    Dtool_Init_" << ClassName << ",\n";
-  } else {
-    out << "    0,\n";
-  }
+  out << "    Dtool_Init_" << ClassName << ",\n";
   // allocfunc tp_alloc;
   // allocfunc tp_alloc;
   out << "    PyType_GenericAlloc,\n";
   out << "    PyType_GenericAlloc,\n";
   // newfunc tp_new;
   // newfunc tp_new;
@@ -3037,7 +3052,7 @@ write_module_class(ostream &out, Object *obj) {
     } else if (nested_obj->_itype.is_typedef()) {
     } else if (nested_obj->_itype.is_typedef()) {
       ++num_dict_items;
       ++num_dict_items;
 
 
-    } else if (nested_obj->_itype.is_enum()) {
+    } else if (nested_obj->_itype.is_enum() && !nested_obj->_itype.is_scoped_enum()) {
       CPPEnumType *enum_type = nested_obj->_itype._cpptype->as_enum_type();
       CPPEnumType *enum_type = nested_obj->_itype._cpptype->as_enum_type();
       num_dict_items += 2 * enum_type->_elements.size();
       num_dict_items += 2 * enum_type->_elements.size();
     }
     }
@@ -3095,8 +3110,33 @@ write_module_class(ostream &out, Object *obj) {
       // No need to support mangled names for nested typedefs; we only added
       // No need to support mangled names for nested typedefs; we only added
       // support recently.
       // support recently.
 
 
+    } else if (nested_obj->_itype.is_scoped_enum()) {
+      // Convert enum class as Python 3.4 enum.
+      int enum_count = nested_obj->_itype.number_of_enum_values();
+      CPPType *underlying_type = TypeManager::unwrap_const(nested_obj->_itype._cpptype->as_enum_type()->get_underlying_type());
+      string cast_to = underlying_type->get_local_name(&parser);
+      out << "#if PY_VERSION_HEX >= 0x03040000\n\n";
+      out << "    // enum class " << nested_obj->_itype.get_scoped_name() << ";\n";
+      out << "    {\n";
+      out << "      PyObject *members = PyTuple_New(" << enum_count << ");\n";
+      out << "      PyObject *member;\n";
+      for (int xx = 0; xx < enum_count; xx++) {
+        out << "      member = PyTuple_New(2);\n"
+               "      PyTuple_SET_ITEM(member, 0, PyUnicode_FromString(\""
+            << nested_obj->_itype.get_enum_value_name(xx) << "\"));\n"
+               "      PyTuple_SET_ITEM(member, 1, Dtool_WrapValue(("
+            << cast_to << ")" << nested_obj->_itype.get_scoped_name() << "::"
+            << nested_obj->_itype.get_enum_value_name(xx) << "));\n"
+               "      PyTuple_SET_ITEM(members, " << xx << ", member);\n";
+      }
+      out << "      PyDict_SetItemString(dict, \"" << nested_obj->_itype.get_name()
+          << "\", Dtool_EnumType_Create(\"" << nested_obj->_itype.get_name()
+          << "\", members, \"" << _def->module_name << "\"));\n";
+      out << "    }\n";
+      out << "#endif\n";
+
     } else if (nested_obj->_itype.is_enum()) {
     } else if (nested_obj->_itype.is_enum()) {
-      out << "    // Enum  " << nested_obj->_itype.get_scoped_name() << ";\n";
+      out << "    // enum " << nested_obj->_itype.get_scoped_name() << ";\n";
       CPPEnumType *enum_type = nested_obj->_itype._cpptype->as_enum_type();
       CPPEnumType *enum_type = nested_obj->_itype._cpptype->as_enum_type();
       CPPEnumType::Elements::const_iterator ei;
       CPPEnumType::Elements::const_iterator ei;
       for (ei = enum_type->_elements.begin(); ei != enum_type->_elements.end(); ++ei) {
       for (ei = enum_type->_elements.begin(); ei != enum_type->_elements.end(); ++ei) {
@@ -3111,9 +3151,9 @@ write_module_class(ostream &out, Object *obj) {
           name2 = name1;
           name2 = name1;
         }
         }
         string enum_value = obj->_itype.get_scoped_name() + "::" + (*ei)->get_simple_name();
         string enum_value = obj->_itype.get_scoped_name() + "::" + (*ei)->get_simple_name();
-        out << "    PyDict_SetItemString(dict, \"" << name1 << "\", PyLongOrInt_FromLong(" << enum_value << "));\n";
+        out << "    PyDict_SetItemString(dict, \"" << name1 << "\", Dtool_WrapValue(" << enum_value << "));\n";
         if (name1 != name2) {
         if (name1 != name2) {
-          out << "    PyDict_SetItemString(dict, \"" << name2 << "\", PyLongOrInt_FromLong(" << enum_value << "));\n";
+          out << "    PyDict_SetItemString(dict, \"" << name2 << "\", Dtool_WrapValue(" << enum_value << "));\n";
         }
         }
       }
       }
     }
     }
@@ -3340,7 +3380,7 @@ write_function_for_name(ostream &out, Object *obj,
   int max_required_args = 0;
   int max_required_args = 0;
   bool all_nonconst = true;
   bool all_nonconst = true;
 
 
-  out << "/******************************************************************\n" << " * Python type method wrapper for\n";
+  out << "/**\n * Python function wrapper for:\n";
   for (ri = remaps.begin(); ri != remaps.end(); ++ri) {
   for (ri = remaps.begin(); ri != remaps.end(); ++ri) {
     remap = (*ri);
     remap = (*ri);
     if (is_remap_legal(remap)) {
     if (is_remap_legal(remap)) {
@@ -3369,7 +3409,7 @@ write_function_for_name(ostream &out, Object *obj,
     }
     }
   }
   }
 
 
-  out << " *******************************************************************/\n";
+  out << " */\n";
 
 
   out << function_name << " {\n";
   out << function_name << " {\n";
 
 
@@ -3935,13 +3975,7 @@ collapse_default_remaps(std::map<int, std::set<FunctionRemap *> > &map_sets,
               goto abort_iteration;
               goto abort_iteration;
             }
             }
           }
           }
-        } else if (TypeManager::is_bool(type)) {
-        } else if (TypeManager::is_char(type)) {
-        } else if (TypeManager::is_wchar(type)) {
-          goto abort_iteration;
-        } else if (TypeManager::is_longlong(type)) {
         } else if (TypeManager::is_integer(type)) {
         } else if (TypeManager::is_integer(type)) {
-        } else if (TypeManager::is_double(type)) {
         } else if (TypeManager::is_float(type)) {
         } else if (TypeManager::is_float(type)) {
         } else if (TypeManager::is_const_char_pointer(type)) {
         } else if (TypeManager::is_const_char_pointer(type)) {
         } else if (TypeManager::is_pointer_to_PyTypeObject(type)) {
         } else if (TypeManager::is_pointer_to_PyTypeObject(type)) {
@@ -6033,164 +6067,16 @@ pack_return_value(ostream &out, int indent_level, FunctionRemap *remap,
   CPPType *orig_type = return_type->get_orig_type();
   CPPType *orig_type = return_type->get_orig_type();
   CPPType *type = return_type->get_new_type();
   CPPType *type = return_type->get_new_type();
 
 
-  if (return_type->new_type_is_atomic_string()) {
-    if (TypeManager::is_char_pointer(orig_type)) {
-      indent(out, indent_level) << "if (" << return_expr << " == NULL) {\n";
-      indent(out, indent_level) << "  Py_INCREF(Py_None);\n";
-      indent(out, indent_level) << "  return Py_None;\n";
-      indent(out, indent_level) << "} else {\n";
-
-      out << "#if PY_MAJOR_VERSION >= 3\n";
-      indent(out, indent_level) << "  return "
-        << "PyUnicode_FromString(" << return_expr << ");\n";
-      out << "#else\n";
-      indent(out, indent_level) << "  return "
-        << "PyString_FromString(" << return_expr << ");\n";
-      out << "#endif\n";
-
-      indent(out, indent_level) << "}\n";
-
-    } else if (TypeManager::is_wchar_pointer(orig_type)) {
-      indent(out, indent_level) << "if (" << return_expr << " == NULL) {\n";
-      indent(out, indent_level) << "  Py_INCREF(Py_None);\n";
-      indent(out, indent_level) << "  return Py_None;\n";
-      indent(out, indent_level) << "} else {\n";
-      indent(out, indent_level+2)
-        << "return PyUnicode_FromWideChar("
-        << return_expr << ", wcslen(" << return_expr << "));\n";
-      indent(out, indent_level) << "}\n";
-
-    } else if (TypeManager::is_wstring(orig_type)) {
-      indent(out, indent_level)
-        << "return PyUnicode_FromWideChar("
-        << return_expr << ".data(), (int) " << return_expr << ".length());\n";
-
-    } else if (TypeManager::is_const_ptr_to_basic_string_wchar(orig_type)) {
-      indent(out, indent_level) << "if (" << return_expr << " == NULL) {\n";
-      indent(out, indent_level) << "  Py_INCREF(Py_None);\n";
-      indent(out, indent_level) << "  return Py_None;\n";
-      indent(out, indent_level) << "} else {\n";
-
-      indent(out, indent_level) << "  return "
-        << "PyUnicode_FromWideChar("
-        << return_expr << "->data(), (int) " << return_expr << "->length());\n";
-
-      indent(out, indent_level) << "}\n";
-
-    } else if (TypeManager::is_const_ptr_to_basic_string_char(orig_type)) {
-      indent(out, indent_level) << "if (" << return_expr<< " == NULL) {\n";
-      indent(out, indent_level) << "  Py_INCREF(Py_None);\n";
-      indent(out, indent_level) << "  return Py_None;\n";
-      indent(out, indent_level) << "} else {\n";
-
-      out << "#if PY_MAJOR_VERSION >= 3\n";
-      indent(out, indent_level) << "  return "
-        << "PyUnicode_FromStringAndSize("
-        << return_expr << "->data(), (Py_ssize_t)" << return_expr << "->length());\n";
-      out << "#else\n";
-      indent(out, indent_level) << "  return "
-        << "PyString_FromStringAndSize("
-        << return_expr << "->data(), (Py_ssize_t)" << return_expr << "->length());\n";
-      out << "#endif\n";
-
-      indent(out, indent_level) << "}\n";
-
-    } else {
-      out << "#if PY_MAJOR_VERSION >= 3\n";
-      indent(out, indent_level)
-        << "return PyUnicode_FromStringAndSize("
-        << return_expr << ".data(), (Py_ssize_t)" << return_expr << ".length());\n";
-      out << "#else\n";
-      indent(out, indent_level)
-        << "return PyString_FromStringAndSize("
-        << return_expr << ".data(), (Py_ssize_t)" << return_expr << ".length());\n";
-      out << "#endif\n";
-    }
-
-  } else if (TypeManager::is_bool(type)) {
-    indent(out, indent_level)
-      << "return PyBool_FromLong(" << return_expr << ");\n";
-
-  } else if (TypeManager::is_ssize(type)) {
-    indent(out, indent_level)
-      << "return PyLongOrInt_FromSsize_t(" << return_expr << ");\n";
-
-  } else if (TypeManager::is_size(type)) {
-    indent(out, indent_level)
-      << "return PyLongOrInt_FromSize_t(" << return_expr << ");\n";
-
-  } else if (TypeManager::is_char(type)) {
-    out << "#if PY_MAJOR_VERSION >= 3\n";
-    indent(out, indent_level)
-      << "return PyUnicode_FromStringAndSize(&" << return_expr << ", 1);\n";
-    out << "#else\n";
-    indent(out, indent_level)
-      << "return PyString_FromStringAndSize(&" << return_expr << ", 1);\n";
-    out << "#endif\n";
-
-  } else if (TypeManager::is_wchar(type)) {
-    indent(out, indent_level)
-      << "return PyUnicode_FromWideChar(&" << return_expr << ", 1);\n";
-
-  } else if (TypeManager::is_unsigned_longlong(type)) {
-    indent(out, indent_level)
-      << "return PyLong_FromUnsignedLongLong(" << return_expr << ");\n";
-
-  } else if (TypeManager::is_longlong(type)) {
-    indent(out, indent_level)
-      << "return PyLong_FromLongLong(" << return_expr << ");\n";
-
-  } else if (TypeManager::is_unsigned_integer(type)){
-    indent(out, indent_level)
-      << "return PyLongOrInt_FromUnsignedLong(" << return_expr << ");\n";
-
-  } else if (TypeManager::is_integer(type)) {
+  if (return_type->new_type_is_atomic_string() ||
+      TypeManager::is_simple(type) ||
+      TypeManager::is_char_pointer(type) ||
+      TypeManager::is_wchar_pointer(type) ||
+      TypeManager::is_pointer_to_PyObject(type) ||
+      TypeManager::is_pointer_to_Py_buffer(type)) {
+    // Most types are now handled by the many overloads of Dtool_WrapValue,
+    // defined in py_panda.h.
     indent(out, indent_level)
     indent(out, indent_level)
-      << "return PyLongOrInt_FromLong(" << return_expr << ");\n";
-
-  } else if (TypeManager::is_float(type)) {
-    indent(out, indent_level)
-      << "return PyFloat_FromDouble(" << return_expr << ");\n";
-
-  } else if (TypeManager::is_char_pointer(type)) {
-    indent(out, indent_level) << "if (" << return_expr << " == NULL) {\n";
-    indent(out, indent_level) << "  Py_INCREF(Py_None);\n";
-    indent(out, indent_level) << "  return Py_None;\n";
-    indent(out, indent_level) << "} else {\n";
-
-    out << "#if PY_MAJOR_VERSION >= 3\n";
-    indent(out, indent_level) << "  return "
-      << "PyUnicode_FromString(" << return_expr << ");\n";
-    out << "#else\n";
-    indent(out, indent_level) << "  return "
-      << "PyString_FromString(" << return_expr << ");\n";
-    out << "#endif\n";
-
-    indent(out, indent_level) << "}\n";
-
-  } else if (TypeManager::is_wchar_pointer(type)) {
-    indent(out, indent_level) << "if (" << return_expr << " == NULL) {\n";
-    indent(out, indent_level) << "  Py_INCREF(Py_None);\n";
-    indent(out, indent_level) << "  return Py_None;\n";
-    indent(out, indent_level) << "} else {\n";
-    indent(out, indent_level) << "  return "
-      << "PyUnicode_FromWideChar("
-      << return_expr << ", wcslen(" << return_expr << "));\n";
-
-    indent(out, indent_level) << "}\n";
-
-  } else if (TypeManager::is_pointer_to_PyObject(type)) {
-    indent(out, indent_level)
-      << "return " << return_expr << ";\n";
-
-  } else if (TypeManager::is_pointer_to_Py_buffer(type)) {
-    indent(out, indent_level) << "if (" << return_expr << " == NULL) {\n";
-    indent(out, indent_level) << "  Py_INCREF(Py_None);\n";
-    indent(out, indent_level) << "  return Py_None;\n";
-    indent(out, indent_level) << "} else {\n";
-    indent(out, indent_level) << "  return "
-      << "PyMemoryView_FromBuffer(" << return_expr << ");\n";
-    indent(out, indent_level) << "}\n";
+      << "return Dtool_WrapValue(" << return_expr << ");\n";
 
 
   } else if (TypeManager::is_pointer(type)) {
   } else if (TypeManager::is_pointer(type)) {
     bool is_const = TypeManager::is_const_pointer_to_anything(type);
     bool is_const = TypeManager::is_const_pointer_to_anything(type);
@@ -6234,13 +6120,13 @@ pack_return_value(ostream &out, int indent_level, FunctionRemap *remap,
 
 
     } else {
     } else {
       indent(out, indent_level) << "Should Never Reach This InterfaceMakerPythonNative::pack_python_value";
       indent(out, indent_level) << "Should Never Reach This InterfaceMakerPythonNative::pack_python_value";
-          // << "return PyLongOrInt_FromLong((int) " << return_expr << ");\n";
+          // << "return Dtool_Integer((int) " << return_expr << ");\n";
     }
     }
 
 
   } else {
   } else {
     // Return None.
     // Return None.
     indent(out, indent_level)
     indent(out, indent_level)
-      << "return Py_BuildValue(\"\");\n";
+      << "return Py_BuildValue(\"\"); // Don't know how to wrap type.\n";
   }
   }
 }
 }
 
 
@@ -6251,8 +6137,9 @@ void InterfaceMakerPythonNative::
 write_make_seq(ostream &out, Object *obj, const std::string &ClassName,
 write_make_seq(ostream &out, Object *obj, const std::string &ClassName,
                const std::string &cClassName, MakeSeq *make_seq) {
                const std::string &cClassName, MakeSeq *make_seq) {
 
 
-  out << "/******************************************************************\n" << " * Python make_seq wrapper\n";
-  out << " *******************************************************************/\n";
+  out << "/*\n"
+         " * Python make_seq wrapper\n"
+         " */\n";
 
 
   out << "static PyObject *" << make_seq->_name + "(PyObject *self, PyObject *) {\n";
   out << "static PyObject *" << make_seq->_name + "(PyObject *self, PyObject *) {\n";
 
 
@@ -6288,11 +6175,7 @@ write_make_seq(ostream &out, Object *obj, const std::string &ClassName,
     "  PyObject *tuple = PyTuple_New(count);\n"
     "  PyObject *tuple = PyTuple_New(count);\n"
     "\n"
     "\n"
     "  for (Py_ssize_t i = 0; i < count; ++i) {\n"
     "  for (Py_ssize_t i = 0; i < count; ++i) {\n"
-    "#if PY_MAJOR_VERSION >= 3\n"
-    "    PyObject *index = PyLong_FromSsize_t(i);\n"
-    "#else\n"
-    "    PyObject *index = PyInt_FromSsize_t(i);\n"
-    "#endif\n";
+    "    PyObject *index = Dtool_WrapValue(i);\n";
 
 
   switch (elem_getter->_args_type) {
   switch (elem_getter->_args_type) {
   case AT_keyword_args:
   case AT_keyword_args:
@@ -6345,10 +6228,156 @@ write_getset(ostream &out, Object *obj, Property *property) {
 
 
   const InterrogateElement &ielem = property->_ielement;
   const InterrogateElement &ielem = property->_ielement;
 
 
-  if (property->_getter != NULL) {
+  if (property->_length_function != NULL) {
+    // This is actually a sequence.  Wrap this with a special class.
+    FunctionRemap *len_remap = property->_length_function->_remaps.front();
+    vector_string pexprs;
+
+    out << "/**\n"
+           " * sequence length function for property " << cClassName << "::" << ielem.get_name() << "\n"
+           " */\n"
+           "static Py_ssize_t Dtool_" + ClassName + "_" + ielem.get_name() + "_Len(PyObject *self) {\n";
+    if (property->_length_function->_has_this) {
+      out <<
+        "  " << cClassName  << " *local_this = NULL;\n"
+        "  if (!Dtool_Call_ExtractThisPointer(self, Dtool_" << ClassName << ", (void **)&local_this)) {\n"
+        "    return NULL;\n"
+        "  }\n"
+        "  return (Py_ssize_t)" << len_remap->get_call_str("local_this", pexprs) << ";\n";
+    } else {
+      out << "  return (Py_ssize_t)" << len_remap->get_call_str("", pexprs) << ";\n";
+    }
+    out << "}\n\n";
+
+    // Now write out the getitem helper function.
+    if (property->_getter != NULL) {
+      out <<
+        "/**\n"
+        " * sequence getter for property " << cClassName << "::" << ielem.get_name() << "\n"
+        " */\n"
+        "static PyObject *Dtool_" + ClassName + "_" + ielem.get_name() + "_Getitem(PyObject *self, Py_ssize_t index) {\n"
+        "  " << cClassName << " *local_this = NULL;\n"
+        "  if (!Dtool_Call_ExtractThisPointer(self, Dtool_" << ClassName << ", (void **)&local_this)) {\n"
+        "    return NULL;\n"
+        "  }\n";
+
+      // This is a getitem of a sequence type.  This means we *need* to raise
+      // IndexError if we're out of bounds.
+      out << "  if (index < 0 || index >= (Py_ssize_t)"
+          << len_remap->get_call_str("local_this", pexprs) << ") {\n";
+      out << "    PyErr_SetString(PyExc_IndexError, \"" << ClassName << "." << ielem.get_name() << "[] index out of range\");\n";
+      out << "    return NULL;\n";
+      out << "  }\n";
+
+      if (property->_has_function != NULL) {
+        out << "  if (!local_this->" << property->_has_function->_ifunc.get_name() << "(index)) {\n"
+            << "    Py_INCREF(Py_None);\n"
+            << "    return Py_None;\n"
+            << "  }\n";
+      }
+
+      std::set<FunctionRemap*> remaps;
+
+      // Extract only the getters that take one argument.
+      Function::Remaps::iterator it;
+      for (it = property->_getter->_remaps.begin();
+           it != property->_getter->_remaps.end();
+           ++it) {
+        FunctionRemap *remap = *it;
+        int min_num_args = remap->get_min_num_args();
+        int max_num_args = remap->get_max_num_args();
+        if (min_num_args <= 1 && max_num_args >= 1) {
+          remaps.insert(remap);
+        }
+      }
+
+      string expected_params;
+      write_function_forset(out, remaps, 1, 1, expected_params, 2, true, true,
+                            AT_no_args, RF_pyobject | RF_err_null, false, true, "index");
+
+      out << "  if (!_PyErr_OCCURRED()) {\n";
+      out << "    return Dtool_Raise_BadArgumentsError(\n";
+      output_quoted(out, 6, expected_params);
+      out << ");\n"
+             "  }\n"
+             "}\n\n";
+    }
+
+    // Write out a setitem if this is not a read-only property.
+    if (property->_setter != NULL) {
+      out << "static int Dtool_" + ClassName + "_" + ielem.get_name() + "_Setitem(PyObject *self, Py_ssize_t index, PyObject *arg) {\n";
+      out << "  " << cClassName  << " *local_this = NULL;\n";
+      out << "  if (!Dtool_Call_ExtractThisPointer_NonConst(self, Dtool_" << ClassName << ", (void **)&local_this, \""
+          << classNameFromCppName(cClassName, false) << "." << ielem.get_name() << "\")) {\n";
+      out << "    return -1;\n";
+      out << "  }\n\n";
+
+      out << "  if (arg == (PyObject *)NULL) {\n";
+      if (property->_deleter != NULL) {
+        out << "    local_this->" << property->_deleter->_ifunc.get_name() << "(index);\n"
+            << "    return 0;\n";
+      } else {
+        out << "    Dtool_Raise_TypeError(\"can't delete " << ielem.get_name() << "[] attribute\");\n"
+               "    return -1;\n";
+      }
+      out << "  }\n";
+
+      if (property->_clear_function != NULL) {
+        out << "  if (arg == Py_None) {\n"
+            << "    local_this->" << property->_clear_function->_ifunc.get_name() << "(index);\n"
+            << "    return 0;\n"
+            << "  }\n";
+      }
+
+      std::set<FunctionRemap*> remaps;
+
+      // Extract only the setters that take two arguments.
+      Function::Remaps::iterator it;
+      for (it = property->_setter->_remaps.begin();
+           it != property->_setter->_remaps.end();
+           ++it) {
+        FunctionRemap *remap = *it;
+        int min_num_args = remap->get_min_num_args();
+        int max_num_args = remap->get_max_num_args();
+        if (min_num_args <= 2 && max_num_args >= 2) {
+          remaps.insert(remap);
+        }
+      }
+
+      string expected_params;
+      write_function_forset(out, remaps, 2, 2,
+                            expected_params, 2, true, true, AT_single_arg,
+                            RF_int, false, false, "index");
+
+      out << "  if (!_PyErr_OCCURRED()) {\n";
+      out << "    Dtool_Raise_BadArgumentsError(\n";
+      output_quoted(out, 6, expected_params);
+      out << ");\n";
+      out << "  }\n";
+      out << "  return -1;\n";
+      out << "}\n\n";
+    }
+
+    // Now write the getter, which returns a special wrapper object.
+    out << "static PyObject *Dtool_" + ClassName + "_" + ielem.get_name() + "_Getter(PyObject *self, void *) {\n"
+           "  Py_INCREF(self);\n"
+           "  Dtool_SequenceWrapper *wrap = PyObject_New(Dtool_SequenceWrapper, &Dtool_SequenceWrapper_Type);\n"
+           "  wrap->_base = self;\n"
+           "  wrap->_len_func = &Dtool_" << ClassName << "_" << ielem.get_name() << "_Len;\n"
+           "  wrap->_getitem_func = &Dtool_" << ClassName << "_" << ielem.get_name() << "_Getitem;\n";
+    if (property->_setter != NULL) {
+      out << "  wrap->_setitem_func = &Dtool_" << ClassName << "_" << ielem.get_name() << "_Setitem;\n";
+    } else {
+      out << "  wrap->_setitem_func = NULL;\n";
+    }
+    out << "  return (PyObject *)wrap;\n"
+           "}\n\n";
+
+  } else if (property->_getter != NULL) {
+    // Write out a regular, unwrapped getter.
+    out << "static PyObject *Dtool_" + ClassName + "_" + ielem.get_name() + "_Getter(PyObject *self, void *) {\n";
     FunctionRemap *remap = property->_getter->_remaps.front();
     FunctionRemap *remap = property->_getter->_remaps.front();
 
 
-    out << "PyObject *Dtool_" + ClassName + "_" + ielem.get_name() + "_Getter(PyObject *self, void *) {\n";
     if (remap->_const_method) {
     if (remap->_const_method) {
       out << "  const " << cClassName  << " *local_this = NULL;\n";
       out << "  const " << cClassName  << " *local_this = NULL;\n";
       out << "  if (!Dtool_Call_ExtractThisPointer(self, Dtool_" << ClassName << ", (void **)&local_this)) {\n";
       out << "  if (!Dtool_Call_ExtractThisPointer(self, Dtool_" << ClassName << ", (void **)&local_this)) {\n";
@@ -6375,50 +6404,61 @@ write_getset(ostream &out, Object *obj, Property *property) {
                           expected_params, 2, false, true, AT_no_args,
                           expected_params, 2, false, true, AT_no_args,
                           RF_pyobject | RF_err_null, false, false);
                           RF_pyobject | RF_err_null, false, false);
     out << "}\n\n";
     out << "}\n\n";
-  }
 
 
-  if (property->_setter != NULL) {
-    out << "int Dtool_" + ClassName + "_" + ielem.get_name() + "_Setter(PyObject *self, PyObject *arg, void *) {\n";
-    out << "  " << cClassName  << " *local_this = NULL;\n";
-    out << "  if (!Dtool_Call_ExtractThisPointer_NonConst(self, Dtool_" << ClassName << ", (void **)&local_this, \""
-        << classNameFromCppName(cClassName, false) << "." << ielem.get_name() << "\")) {\n";
-    out << "    return -1;\n";
-    out << "  }\n\n";
+    // Write out a setter if this is not a read-only property.
+    if (property->_setter != NULL) {
+      out << "static int Dtool_" + ClassName + "_" + ielem.get_name() + "_Setter(PyObject *self, PyObject *arg, void *) {\n";
+      out << "  " << cClassName  << " *local_this = NULL;\n";
+      out << "  if (!Dtool_Call_ExtractThisPointer_NonConst(self, Dtool_" << ClassName << ", (void **)&local_this, \""
+          << classNameFromCppName(cClassName, false) << "." << ielem.get_name() << "\")) {\n";
+      out << "    return -1;\n";
+      out << "  }\n\n";
 
 
-    if (property->_clear_function != NULL) {
-      out << "  if (arg == Py_None) {\n"
-          << "    local_this->" << property->_clear_function->_ifunc.get_name() << "();\n"
-          << "    return 0;\n"
-          << "  }\n";
-    }
+      out << "  if (arg == (PyObject *)NULL) {\n";
+      if (property->_deleter != NULL) {
+        out << "    local_this->" << property->_deleter->_ifunc.get_name() << "();\n"
+            << "    return 0;\n";
+      } else {
+        out << "    Dtool_Raise_TypeError(\"can't delete " << ielem.get_name() << " attribute\");\n"
+               "    return -1;\n";
+      }
+      out << "  }\n";
 
 
-    std::set<FunctionRemap*> remaps;
+      if (property->_clear_function != NULL) {
+        out << "  if (arg == Py_None) {\n"
+            << "    local_this->" << property->_clear_function->_ifunc.get_name() << "();\n"
+            << "    return 0;\n"
+            << "  }\n";
+      }
 
 
-    // Extract only the setters that take one argument.
-    Function::Remaps::iterator it;
-    for (it = property->_setter->_remaps.begin();
-         it != property->_setter->_remaps.end();
-         ++it) {
-      FunctionRemap *remap = *it;
-      int min_num_args = remap->get_min_num_args();
-      int max_num_args = remap->get_max_num_args();
-      if (min_num_args <= 1 && max_num_args >= 1) {
-        remaps.insert(remap);
+      std::set<FunctionRemap*> remaps;
+
+      // Extract only the setters that take one argument.
+      Function::Remaps::iterator it;
+      for (it = property->_setter->_remaps.begin();
+           it != property->_setter->_remaps.end();
+           ++it) {
+        FunctionRemap *remap = *it;
+        int min_num_args = remap->get_min_num_args();
+        int max_num_args = remap->get_max_num_args();
+        if (min_num_args <= 1 && max_num_args >= 1) {
+          remaps.insert(remap);
+        }
       }
       }
-    }
 
 
-    string expected_params;
-    write_function_forset(out, remaps, 1, 1,
-                          expected_params, 2, true, true, AT_single_arg,
-                          RF_int, false, false);
+      string expected_params;
+      write_function_forset(out, remaps, 1, 1,
+                            expected_params, 2, true, true, AT_single_arg,
+                            RF_int, false, false);
 
 
-    out << "  if (!_PyErr_OCCURRED()) {\n";
-    out << "    Dtool_Raise_BadArgumentsError(\n";
-    output_quoted(out, 6, expected_params);
-    out << ");\n";
-    out << "  }\n";
-    out << "  return -1;\n";
-    out << "}\n\n";
+      out << "  if (!_PyErr_OCCURRED()) {\n";
+      out << "    Dtool_Raise_BadArgumentsError(\n";
+      output_quoted(out, 6, expected_params);
+      out << ");\n";
+      out << "  }\n";
+      out << "  return -1;\n";
+      out << "}\n\n";
+    }
   }
   }
 }
 }
 
 
@@ -6543,6 +6583,19 @@ record_object(TypeIndex type_index) {
       }
       }
     }
     }
 
 
+    if (ielement.has_del_function()) {
+      FunctionIndex func_index = ielement.get_del_function();
+      Function *del_function = record_function(itype, func_index);
+      if (is_function_legal(del_function)) {
+        property->_deleter = del_function;
+      }
+    }
+
+    if (ielement.is_sequence()) {
+      FunctionIndex func_index = ielement.get_length_function();
+      property->_length_function = record_function(itype, func_index);
+    }
+
     if (property->_getter != NULL) {
     if (property->_getter != NULL) {
       object->_properties.push_back(property);
       object->_properties.push_back(property);
     } else {
     } else {

+ 88 - 19
dtool/src/interrogate/interrogateBuilder.cxx

@@ -1782,9 +1782,9 @@ get_function(CPPInstance *function, string description,
 }
 }
 
 
 /**
 /**
- * Adds the indicated make_property to the database, if it is not already
- * present.  In either case, returns the MakeSeqIndex of the make_seq within
- * the database.
+ * Adds the indicated make_property or make_seq_property to the database, if
+ * it is not already present.  In either case, returns the ElementIndex
+ * of the created property within the database.
  */
  */
 ElementIndex InterrogateBuilder::
 ElementIndex InterrogateBuilder::
 get_make_property(CPPMakeProperty *make_property, CPPStructType *struct_type, CPPScope *scope) {
 get_make_property(CPPMakeProperty *make_property, CPPStructType *struct_type, CPPScope *scope) {
@@ -1805,20 +1805,58 @@ get_make_property(CPPMakeProperty *make_property, CPPStructType *struct_type, CP
     return index;
     return index;
   }
   }
 
 
+  // If we have a length function (ie. this is a sequence property), we should
+  // find the function that will give us the length.
+  FunctionIndex length_function = 0;
+  bool is_seq = false;
+
+  CPPFunctionGroup::Instances::const_iterator fi;
+  CPPFunctionGroup *fgroup = make_property->_length_function;
+  if (fgroup != NULL) {
+    is_seq = true;
+
+    for (fi = fgroup->_instances.begin(); fi != fgroup->_instances.end(); ++fi) {
+      CPPInstance *function = (*fi);
+      CPPFunctionType *ftype =
+        function->_type->as_function_type();
+      if (ftype != NULL) {
+        length_function = get_function(function, "", struct_type,
+                                       struct_type->get_scope(), 0);
+        if (length_function != 0) {
+          break;
+        }
+      }
+    }
+    if (length_function == 0) {
+      cerr << "No instance of length method '"
+           << fgroup->_name << "' is suitable!\n";
+      return 0;
+    }
+  }
+
   // Find the getter so we can get its return type.
   // Find the getter so we can get its return type.
   CPPInstance *getter = NULL;
   CPPInstance *getter = NULL;
   CPPType *return_type = NULL;
   CPPType *return_type = NULL;
 
 
-  CPPFunctionGroup *fgroup = make_property->_get_function;
+  fgroup = make_property->_get_function;
   if (fgroup != NULL) {
   if (fgroup != NULL) {
     CPPFunctionGroup::Instances::const_iterator fi;
     CPPFunctionGroup::Instances::const_iterator fi;
     for (fi = fgroup->_instances.begin(); fi != fgroup->_instances.end(); ++fi) {
     for (fi = fgroup->_instances.begin(); fi != fgroup->_instances.end(); ++fi) {
       CPPInstance *function = (*fi);
       CPPInstance *function = (*fi);
       CPPFunctionType *ftype = function->_type->as_function_type();
       CPPFunctionType *ftype = function->_type->as_function_type();
+      if (ftype == NULL) {
+        continue;
+      }
 
 
       // The getter must either take no arguments, or all defaults.
       // The getter must either take no arguments, or all defaults.
-      if (ftype != NULL && (ftype->_parameters->_parameters.size() == 0 ||
-          ftype->_parameters->_parameters[0]->_initializer != NULL)) {
+      if (ftype->_parameters->_parameters.size() == (int)is_seq ||
+          (ftype->_parameters->_parameters.size() > (int)is_seq &&
+           ftype->_parameters->_parameters[(int)is_seq]->_initializer != NULL)) {
+        // If this is a sequence getter, it must take an index argument.
+        if (is_seq && !TypeManager::is_integer(ftype->_parameters->_parameters[0]->_type)) {
+          continue;
+        }
+
         getter = function;
         getter = function;
         return_type = ftype->_return_type;
         return_type = ftype->_return_type;
 
 
@@ -1860,6 +1898,28 @@ get_make_property(CPPMakeProperty *make_property, CPPStructType *struct_type, CP
     }
     }
   }
   }
 
 
+  // And the "deleter".
+  CPPInstance *deleter = NULL;
+
+  fgroup = make_property->_del_function;
+  if (fgroup != NULL) {
+    CPPFunctionGroup::Instances::const_iterator fi;
+    for (fi = fgroup->_instances.begin(); fi != fgroup->_instances.end(); ++fi) {
+      CPPInstance *function = (*fi);
+      CPPFunctionType *ftype = function->_type->as_function_type();
+      if (ftype != NULL && ftype->_parameters->_parameters.size() == (int)is_seq) {
+        deleter = function;
+        break;
+      }
+    }
+
+    if (deleter == NULL || return_type == NULL) {
+      cerr << "No instance of delete-function '"
+           << fgroup->_name << "' is suitable!\n";
+      return 0;
+    }
+  }
+
   InterrogateDatabase *idb = InterrogateDatabase::get_ptr();
   InterrogateDatabase *idb = InterrogateDatabase::get_ptr();
   // It isn't here, so we'll have to define it.
   // It isn't here, so we'll have to define it.
   ElementIndex index = idb->get_next_index();
   ElementIndex index = idb->get_next_index();
@@ -1875,22 +1935,30 @@ get_make_property(CPPMakeProperty *make_property, CPPStructType *struct_type, CP
     iproperty._type = 0;
     iproperty._type = 0;
   }
   }
 
 
+  if (length_function != 0) {
+    iproperty._flags |= InterrogateElement::F_sequence;
+    iproperty._length_function = length_function;
+  }
+
   if (getter != NULL) {
   if (getter != NULL) {
     iproperty._flags |= InterrogateElement::F_has_getter;
     iproperty._flags |= InterrogateElement::F_has_getter;
     iproperty._getter = get_function(getter, "", struct_type,
     iproperty._getter = get_function(getter, "", struct_type,
                                      struct_type->get_scope(), 0);
                                      struct_type->get_scope(), 0);
-    if (iproperty._getter == 0) {
-      cerr << "failed " << *getter << "\n";
-    }
+    nassertr(iproperty._getter, 0);
   }
   }
 
 
   if (hasser != NULL) {
   if (hasser != NULL) {
     iproperty._flags |= InterrogateElement::F_has_has_function;
     iproperty._flags |= InterrogateElement::F_has_has_function;
     iproperty._has_function = get_function(hasser, "", struct_type,
     iproperty._has_function = get_function(hasser, "", struct_type,
                                            struct_type->get_scope(), 0);
                                            struct_type->get_scope(), 0);
-    if (iproperty._has_function == 0) {
-      cerr << "failed " << *hasser << "\n";
-    }
+    nassertr(iproperty._has_function, 0);
+  }
+
+  if (deleter != NULL) {
+    iproperty._flags |= InterrogateElement::F_has_del_function;
+    iproperty._del_function = get_function(deleter, "", struct_type,
+                                          struct_type->get_scope(), 0);
+    nassertr(iproperty._del_function, 0);
   }
   }
 
 
   // See if there happens to be a comment before the MAKE_PROPERTY macro.
   // See if there happens to be a comment before the MAKE_PROPERTY macro.
@@ -1907,9 +1975,7 @@ get_make_property(CPPMakeProperty *make_property, CPPStructType *struct_type, CP
       iproperty._flags |= InterrogateElement::F_has_setter;
       iproperty._flags |= InterrogateElement::F_has_setter;
       iproperty._setter = get_function(function, "", struct_type,
       iproperty._setter = get_function(function, "", struct_type,
                                        struct_type->get_scope(), 0);
                                        struct_type->get_scope(), 0);
-      if (iproperty._setter == 0) {
-        cerr << "failed " << *function << "\n";
-      }
+      nassertr(iproperty._setter, 0);
       break;
       break;
     }
     }
   }
   }
@@ -1922,15 +1988,12 @@ get_make_property(CPPMakeProperty *make_property, CPPStructType *struct_type, CP
       iproperty._flags |= InterrogateElement::F_has_clear_function;
       iproperty._flags |= InterrogateElement::F_has_clear_function;
       iproperty._clear_function = get_function(function, "", struct_type,
       iproperty._clear_function = get_function(function, "", struct_type,
                                                struct_type->get_scope(), 0);
                                                struct_type->get_scope(), 0);
-      if (iproperty._clear_function == 0) {
-        cerr << "failed " << *function << "\n";
-      }
+      nassertr(iproperty._clear_function, 0);
       break;
       break;
     }
     }
   }
   }
 
 
   idb->add_element(index, iproperty);
   idb->add_element(index, iproperty);
-
   return index;
   return index;
 }
 }
 
 
@@ -2838,6 +2901,10 @@ define_enum_type(InterrogateType &itype, CPPEnumType *cpptype) {
     return;
     return;
   }
   }
 
 
+  if (cpptype->is_scoped()) {
+    itype._flags |= InterrogateType::F_scoped_enum;
+  }
+
   int next_value = 0;
   int next_value = 0;
 
 
   CPPEnumType::Elements::const_iterator ei;
   CPPEnumType::Elements::const_iterator ei;
@@ -2919,6 +2986,8 @@ define_extension_type(InterrogateType &itype, CPPExtensionType *cpptype) {
   // But we can at least indicate which of the various extension types it is.
   // But we can at least indicate which of the various extension types it is.
   switch (cpptype->_type) {
   switch (cpptype->_type) {
   case CPPExtensionType::T_enum:
   case CPPExtensionType::T_enum:
+  case CPPExtensionType::T_enum_class:
+  case CPPExtensionType::T_enum_struct:
     itype._flags |= InterrogateType::F_enum;
     itype._flags |= InterrogateType::F_enum;
     break;
     break;
 
 

+ 1 - 1
dtool/src/interrogatedb/interrogateDatabase.cxx

@@ -20,7 +20,7 @@ InterrogateDatabase *InterrogateDatabase::_global_ptr = NULL;
 int InterrogateDatabase::_file_major_version = 0;
 int InterrogateDatabase::_file_major_version = 0;
 int InterrogateDatabase::_file_minor_version = 0;
 int InterrogateDatabase::_file_minor_version = 0;
 int InterrogateDatabase::_current_major_version = 3;
 int InterrogateDatabase::_current_major_version = 3;
-int InterrogateDatabase::_current_minor_version = 1;
+int InterrogateDatabase::_current_minor_version = 2;
 
 
 /**
 /**
  *
  *

+ 36 - 0
dtool/src/interrogatedb/interrogateElement.I

@@ -24,6 +24,8 @@ InterrogateElement(InterrogateModuleDef *def) :
   _setter = 0;
   _setter = 0;
   _has_function = 0;
   _has_function = 0;
   _clear_function = 0;
   _clear_function = 0;
+  _del_function = 0;
+  _length_function = 0;
 }
 }
 
 
 /**
 /**
@@ -48,6 +50,8 @@ operator = (const InterrogateElement &copy) {
   _setter = copy._setter;
   _setter = copy._setter;
   _has_function = copy._has_function;
   _has_function = copy._has_function;
   _clear_function = copy._clear_function;
   _clear_function = copy._clear_function;
+  _del_function = copy._del_function;
+  _length_function = copy._length_function;
 }
 }
 
 
 /**
 /**
@@ -163,6 +167,38 @@ get_clear_function() const {
   return _clear_function;
   return _clear_function;
 }
 }
 
 
+/**
+ *
+ */
+INLINE bool InterrogateElement::
+has_del_function() const {
+  return (_flags & F_has_del_function) != 0;
+}
+
+/**
+ *
+ */
+INLINE FunctionIndex InterrogateElement::
+get_del_function() const {
+  return _del_function;
+}
+
+/**
+ *
+ */
+INLINE bool InterrogateElement::
+is_sequence() const {
+  return (_flags & F_sequence) != 0;
+}
+
+/**
+ *
+ */
+INLINE FunctionIndex InterrogateElement::
+get_length_function() const {
+  return _length_function;
+}
+
 
 
 INLINE ostream &
 INLINE ostream &
 operator << (ostream &out, const InterrogateElement &element) {
 operator << (ostream &out, const InterrogateElement &element) {

+ 10 - 1
dtool/src/interrogatedb/interrogateElement.cxx

@@ -27,7 +27,9 @@ output(ostream &out) const {
       << _getter << " "
       << _getter << " "
       << _setter << " "
       << _setter << " "
       << _has_function << " "
       << _has_function << " "
-      << _clear_function << " ";
+      << _clear_function << " "
+      << _del_function << " "
+      << _length_function << " ";
   idf_output_string(out, _scoped_name);
   idf_output_string(out, _scoped_name);
   idf_output_string(out, _comment, '\n');
   idf_output_string(out, _comment, '\n');
 }
 }
@@ -41,6 +43,9 @@ input(istream &in) {
   in >> _flags >> _type >> _getter >> _setter;
   in >> _flags >> _type >> _getter >> _setter;
   if (InterrogateDatabase::get_file_minor_version() >= 1) {
   if (InterrogateDatabase::get_file_minor_version() >= 1) {
     in >> _has_function >> _clear_function;
     in >> _has_function >> _clear_function;
+    if (InterrogateDatabase::get_file_minor_version() >= 2) {
+      in >> _del_function >> _length_function;
+    }
   }
   }
   idf_input_string(in, _scoped_name);
   idf_input_string(in, _scoped_name);
   idf_input_string(in, _comment);
   idf_input_string(in, _comment);
@@ -55,4 +60,8 @@ remap_indices(const IndexRemapper &remap) {
   _type = remap.map_from(_type);
   _type = remap.map_from(_type);
   _getter = remap.map_from(_getter);
   _getter = remap.map_from(_getter);
   _setter = remap.map_from(_setter);
   _setter = remap.map_from(_setter);
+  _has_function = remap.map_from(_has_function);
+  _clear_function = remap.map_from(_clear_function);
+  _del_function = remap.map_from(_del_function);
+  _length_function = remap.map_from(_length_function);
 }
 }

+ 9 - 0
dtool/src/interrogatedb/interrogateElement.h

@@ -47,6 +47,10 @@ public:
   INLINE FunctionIndex get_has_function() const;
   INLINE FunctionIndex get_has_function() const;
   INLINE bool has_clear_function() const;
   INLINE bool has_clear_function() const;
   INLINE FunctionIndex get_clear_function() const;
   INLINE FunctionIndex get_clear_function() const;
+  INLINE bool has_del_function() const;
+  INLINE FunctionIndex get_del_function() const;
+  INLINE bool is_sequence() const;
+  INLINE FunctionIndex get_length_function() const;
 
 
   void output(ostream &out) const;
   void output(ostream &out) const;
   void input(istream &in);
   void input(istream &in);
@@ -60,16 +64,21 @@ private:
     F_has_setter      = 0x0004,
     F_has_setter      = 0x0004,
     F_has_has_function= 0x0008,
     F_has_has_function= 0x0008,
     F_has_clear_function= 0x0010,
     F_has_clear_function= 0x0010,
+    F_has_del_function= 0x0020,
+    F_sequence        = 0x0040,
+    F_mapping         = 0x0080,
   };
   };
 
 
   int _flags;
   int _flags;
   string _scoped_name;
   string _scoped_name;
   string _comment;
   string _comment;
   TypeIndex _type;
   TypeIndex _type;
+  FunctionIndex _length_function;
   FunctionIndex _getter;
   FunctionIndex _getter;
   FunctionIndex _setter;
   FunctionIndex _setter;
   FunctionIndex _has_function;
   FunctionIndex _has_function;
   FunctionIndex _clear_function;
   FunctionIndex _clear_function;
+  FunctionIndex _del_function;
 
 
   friend class InterrogateBuilder;
   friend class InterrogateBuilder;
 };
 };

+ 8 - 0
dtool/src/interrogatedb/interrogateType.I

@@ -205,6 +205,14 @@ is_enum() const {
   return (_flags & F_enum) != 0;
   return (_flags & F_enum) != 0;
 }
 }
 
 
+/**
+ * Returns true if enum values are only available under a scope.
+ */
+INLINE bool InterrogateType::
+is_scoped_enum() const {
+  return (_flags & F_scoped_enum) != 0;
+}
+
 /**
 /**
  *
  *
  */
  */

+ 2 - 0
dtool/src/interrogatedb/interrogateType.h

@@ -65,6 +65,7 @@ public:
   INLINE int get_array_size() const;
   INLINE int get_array_size() const;
 
 
   INLINE bool is_enum() const;
   INLINE bool is_enum() const;
+  INLINE bool is_scoped_enum() const;
   INLINE int number_of_enum_values() const;
   INLINE int number_of_enum_values() const;
   INLINE const string &get_enum_value_name(int n) const;
   INLINE const string &get_enum_value_name(int n) const;
   INLINE const string &get_enum_value_scoped_name(int n) const;
   INLINE const string &get_enum_value_scoped_name(int n) const;
@@ -136,6 +137,7 @@ private:
     F_unpublished          = 0x100000,
     F_unpublished          = 0x100000,
     F_typedef              = 0x200000,
     F_typedef              = 0x200000,
     F_array                = 0x400000,
     F_array                = 0x400000,
+    F_scoped_enum          = 0x800000,
   };
   };
 
 
 public:
 public:

+ 219 - 0
dtool/src/interrogatedb/py_panda.I

@@ -0,0 +1,219 @@
+/**
+ * PANDA 3D SOFTWARE
+ * Copyright (c) Carnegie Mellon University.  All rights reserved.
+ *
+ * All use of this software is subject to the terms of the revised BSD
+ * license.  You should have received a copy of this license along
+ * with this source code in a file named "LICENSE."
+ *
+ * @file py_panda.I
+ * @author rdb
+ * @date 2016-06-06
+ */
+
+/**
+ * Template function that can be used to extract any TypedObject pointer from
+ * a wrapped Python object.
+ */
+template<class T> INLINE bool
+DTOOL_Call_ExtractThisPointer(PyObject *self, T *&into) {
+  if (DtoolCanThisBeAPandaInstance(self)) {
+    Dtool_PyTypedObject *target_class = Dtool_RuntimeTypeDtoolType(get_type_handle(T).get_index());
+    if (target_class != NULL) {
+      into = (T*) ((Dtool_PyInstDef *)self)->_My_Type->_Dtool_UpcastInterface(self, target_class);
+      return (into != NULL);
+    }
+  }
+  into = NULL;
+  return false;
+}
+
+/**
+ * These functions wrap a pointer for a class that defines get_type_handle().
+ */
+template<class T> INLINE PyObject *
+DTool_CreatePyInstance(const T *obj, bool memory_rules) {
+  Dtool_PyTypedObject *known_class = Dtool_RuntimeTypeDtoolType(get_type_handle(T).get_index());
+  nassertr(known_class != NULL, NULL);
+  return DTool_CreatePyInstance((void*) obj, *known_class, memory_rules, true);
+}
+
+template<class T> INLINE PyObject *
+DTool_CreatePyInstance(T *obj, bool memory_rules) {
+  Dtool_PyTypedObject *known_class = Dtool_RuntimeTypeDtoolType(get_type_handle(T).get_index());
+  nassertr(known_class != NULL, NULL);
+  return DTool_CreatePyInstance((void*) obj, *known_class, memory_rules, false);
+}
+
+template<class T> INLINE PyObject *
+DTool_CreatePyInstanceTyped(const T *obj, bool memory_rules) {
+  Dtool_PyTypedObject *known_class = Dtool_RuntimeTypeDtoolType(get_type_handle(T).get_index());
+  nassertr(known_class != NULL, NULL);
+  return DTool_CreatePyInstanceTyped((void*) obj, *known_class, memory_rules, true, obj->get_type().get_index());
+}
+
+template<class T> INLINE PyObject *
+DTool_CreatePyInstanceTyped(T *obj, bool memory_rules) {
+  Dtool_PyTypedObject *known_class = Dtool_RuntimeTypeDtoolType(get_type_handle(T).get_index());
+  nassertr(known_class != NULL, NULL);
+  return DTool_CreatePyInstanceTyped((void*) obj, *known_class, memory_rules, false, obj->get_type().get_index());
+}
+
+/**
+ * The following functions wrap an arbitrary C++ value into a PyObject.
+ */
+ALWAYS_INLINE PyObject *Dtool_WrapValue(int value) {
+#if PY_MAJOR_VERSION >= 3
+  return PyLong_FromLong((long)value);
+#else
+  return PyInt_FromLong((long)value);
+#endif
+}
+
+ALWAYS_INLINE PyObject *Dtool_WrapValue(unsigned int value) {
+#if PY_MAJOR_VERSION >= 3 && SIZEOF_INT < SIZEOF_LONG
+  return PyLong_FromLong((long)value);
+#elif PY_MAJOR_VERSION >= 3
+  return PyLong_FromUnsignedLong((unsigned long)value);
+#elif SIZEOF_INT < SIZEOF_LONG
+  return PyInt_FromLong((long)value);
+#else
+  return (value > LONG_MAX)
+    ? PyLong_FromUnsignedLong((unsigned long)value)
+    : PyInt_FromLong((long)value);
+#endif
+}
+
+ALWAYS_INLINE PyObject *Dtool_WrapValue(long value) {
+#if PY_MAJOR_VERSION >= 3
+  return PyLong_FromLong(value);
+#else
+  return PyInt_FromLong(value);
+#endif
+}
+
+ALWAYS_INLINE PyObject *Dtool_WrapValue(unsigned long value) {
+#if PY_MAJOR_VERSION >= 3
+  return PyLong_FromUnsignedLong(value);
+#else
+  return (value > LONG_MAX)
+    ? PyLong_FromUnsignedLong(value)
+    : PyInt_FromLong((long)value);
+#endif
+}
+
+ALWAYS_INLINE PyObject *Dtool_WrapValue(long long value) {
+  return PyLong_FromLongLong(value);
+}
+
+ALWAYS_INLINE PyObject *Dtool_WrapValue(unsigned long long value) {
+  return PyLong_FromUnsignedLongLong(value);
+}
+
+ALWAYS_INLINE PyObject *Dtool_WrapValue(bool value) {
+  PyObject *result = (value ? Py_True : Py_False);
+  Py_INCREF(result);
+  return result;
+}
+
+ALWAYS_INLINE PyObject *Dtool_WrapValue(double value) {
+  return PyFloat_FromDouble(value);
+}
+
+ALWAYS_INLINE PyObject *Dtool_WrapValue(const char *value) {
+  if (value == (const char *)NULL) {
+    Py_INCREF(Py_None);
+    return Py_None;
+  } else {
+#if PY_MAJOR_VERSION >= 3
+    return PyUnicode_FromString(value);
+#else
+    return PyString_FromString(value);
+#endif
+  }
+}
+
+ALWAYS_INLINE PyObject *Dtool_WrapValue(const wchar_t *value) {
+  if (value == (const wchar_t *)NULL) {
+    Py_INCREF(Py_None);
+    return Py_None;
+  } else {
+    return PyUnicode_FromWideChar(value, (Py_ssize_t)wcslen(value));
+  }
+}
+
+ALWAYS_INLINE PyObject *Dtool_WrapValue(const std::string &value) {
+#if PY_MAJOR_VERSION >= 3
+  return PyUnicode_FromStringAndSize(value.data(), (Py_ssize_t)value.length());
+#else
+  return PyString_FromStringAndSize(value.data(), (Py_ssize_t)value.length());
+#endif
+}
+
+ALWAYS_INLINE PyObject *Dtool_WrapValue(const std::wstring &value) {
+  return PyUnicode_FromWideChar(value.data(), (Py_ssize_t)value.length());
+}
+
+ALWAYS_INLINE PyObject *Dtool_WrapValue(const std::string *value) {
+  if (value == (const std::string *)NULL) {
+    Py_INCREF(Py_None);
+    return Py_None;
+  } else {
+#if PY_MAJOR_VERSION >= 3
+    return PyUnicode_FromStringAndSize(value->data(), (Py_ssize_t)value->length());
+#else
+    return PyString_FromStringAndSize(value->data(), (Py_ssize_t)value->length());
+#endif
+  }
+}
+
+ALWAYS_INLINE PyObject *Dtool_WrapValue(const std::wstring *value) {
+  if (value == (const std::wstring *)NULL) {
+    Py_INCREF(Py_None);
+    return Py_None;
+  } else {
+    return PyUnicode_FromWideChar(value->data(), (Py_ssize_t)value->length());
+  }
+}
+
+ALWAYS_INLINE PyObject *Dtool_WrapValue(char value) {
+#if PY_MAJOR_VERSION >= 3
+  return PyUnicode_FromStringAndSize(&value, 1);
+#else
+  return PyString_FromStringAndSize(&value, 1);
+#endif
+}
+
+ALWAYS_INLINE PyObject *Dtool_WrapValue(wchar_t value) {
+  return PyUnicode_FromWideChar(&value, 1);
+}
+
+ALWAYS_INLINE PyObject *Dtool_WrapValue(PyObject *value) {
+  return value;
+}
+
+ALWAYS_INLINE PyObject *Dtool_WrapValue(const std::vector<unsigned char> &value) {
+#if PY_MAJOR_VERSION >= 3
+  return PyBytes_FromStringAndSize((char *)value.data(), (Py_ssize_t)value.size());
+#else
+  return PyString_FromStringAndSize((char *)value.data(), (Py_ssize_t)value.size());
+#endif
+}
+
+#if PY_MAJOR_VERSION >= 0x02060000
+ALWAYS_INLINE PyObject *Dtool_WrapValue(Py_buffer *value) {
+  if (value == (Py_buffer *)NULL) {
+    return value;
+  } else {
+    return PyMemoryView_FromBuffer(value);
+  }
+}
+#endif
+
+template<class T1, class T2>
+ALWAYS_INLINE PyObject *Dtool_WrapValue(const std::pair<T1, T2> &value) {
+  PyObject *tuple = PyTuple_New(2);
+  PyTuple_SET_ITEM(tuple, 0, Dtool_WrapValue(value.first));
+  PyTuple_SET_ITEM(tuple, 1, Dtool_WrapValue(value.second));
+  return tuple;
+}

+ 139 - 13
dtool/src/interrogatedb/py_panda.cxx

@@ -335,6 +335,33 @@ PyObject *_Dtool_Return(PyObject *value) {
   return value;
   return value;
 }
 }
 
 
+/**
+ * Creates a Python 3.4-style enum type.  Steals reference to 'names'.
+ */
+PyObject *Dtool_EnumType_Create(const char *name, PyObject *names, const char *module) {
+  static PyObject *enum_class = NULL;
+  static PyObject *enum_meta = NULL;
+  static PyObject *enum_create = NULL;
+  if (enum_meta == NULL) {
+    PyObject *enum_module = PyImport_ImportModule("enum");
+    nassertr_always(enum_module != NULL, NULL);
+
+    enum_class = PyObject_GetAttrString(enum_module, "Enum");
+    enum_meta = PyObject_GetAttrString(enum_module, "EnumMeta");
+    enum_create = PyObject_GetAttrString(enum_meta, "_create_");
+    nassertr(enum_meta != NULL, NULL);
+  }
+
+  PyObject *result = PyObject_CallFunction(enum_create, (char *)"OsN", enum_class, name, names);
+  nassertr(result != NULL, NULL);
+  if (module != NULL) {
+    PyObject *modstr = PyUnicode_FromString(module);
+    PyObject_SetAttrString(result, "__module__", modstr);
+    Py_DECREF(modstr);
+  }
+  return result;
+}
+
 /**
 /**
 
 
  */
  */
@@ -544,8 +571,19 @@ PyObject *Dtool_PyModuleInitHelper(LibraryDef *defs[], const char *modulename) {
     return (PyObject *)NULL;
     return (PyObject *)NULL;
   }
   }
 
 
-  // Initialize the base class of everything.
-  Dtool_PyModuleClassInit_DTOOL_SUPER_BASE(NULL);
+  // Initialize the types we define in py_panda.
+  static bool dtool_inited = false;
+  if (!dtool_inited) {
+    dtool_inited = true;
+
+    if (PyType_Ready(&Dtool_SequenceWrapper_Type) < 0) {
+      PyErr_SetString(PyExc_TypeError, "PyType_Ready(Dtool_SequenceWrapper)");
+      return NULL;
+    }
+
+    // Initialize the base class of everything.
+    Dtool_PyModuleClassInit_DTOOL_SUPER_BASE(NULL);
+  }
 
 
   // the module level function inits....
   // the module level function inits....
   MethodDefmap functions;
   MethodDefmap functions;
@@ -834,18 +872,106 @@ PyObject *map_deepcopy_to_copy(PyObject *self, PyObject *args) {
 }
 }
 
 
 /**
 /**
- * Similar to PyLong_FromUnsignedLong(), but returns either a regular integer
- * or a long integer, according to whether the indicated value will fit.
+ * This class is returned from properties that require a settable interface,
+ * ie. something.children[i] = 3.
  */
  */
-#if PY_MAJOR_VERSION < 3
-EXPCL_INTERROGATEDB PyObject *
-PyLongOrInt_FromUnsignedLong(unsigned long value) {
-  if ((long)value < 0) {
-    return PyLong_FromUnsignedLong(value);
-  } else {
-    return PyInt_FromLong((long)value);
-  }
-}
+static void Dtool_SequenceWrapper_dealloc(PyObject *self) {
+  Dtool_SequenceWrapper *wrap = (Dtool_SequenceWrapper *)self;
+  nassertv(wrap);
+  Py_DECREF(wrap->_base);
+}
+
+static Py_ssize_t Dtool_SequenceWrapper_length(PyObject *self) {
+  Dtool_SequenceWrapper *wrap = (Dtool_SequenceWrapper *)self;
+  nassertr(wrap, -1);
+  nassertr(wrap->_len_func, -1);
+  return wrap->_len_func(wrap->_base);
+}
+
+static PyObject *Dtool_SequenceWrapper_getitem(PyObject *self, Py_ssize_t index) {
+  Dtool_SequenceWrapper *wrap = (Dtool_SequenceWrapper *)self;
+  nassertr(wrap, NULL);
+  nassertr(wrap->_getitem_func, NULL);
+  return wrap->_getitem_func(wrap->_base, index);
+}
+
+static int Dtool_SequenceWrapper_setitem(PyObject *self, Py_ssize_t index, PyObject *value) {
+  Dtool_SequenceWrapper *wrap = (Dtool_SequenceWrapper *)self;
+  nassertr(wrap, -1);
+  nassertr(wrap->_setitem_func, -1);
+  return wrap->_setitem_func(wrap->_base, index, value);
+}
+
+static PySequenceMethods Dtool_SequenceWrapper_SequenceMethods = {
+  Dtool_SequenceWrapper_length,
+  0, // sq_concat
+  0, // sq_repeat
+  Dtool_SequenceWrapper_getitem,
+  0, // sq_slice
+  Dtool_SequenceWrapper_setitem,
+  0, // sq_ass_slice
+  0, // sq_contains
+  0, // sq_inplace_concat
+  0, // sq_inplace_repeat
+};
+
+PyTypeObject Dtool_SequenceWrapper_Type = {
+  PyVarObject_HEAD_INIT(NULL, 0)
+  "sequence wrapper",
+  sizeof(Dtool_SequenceWrapper),
+  0, // tp_itemsize
+  Dtool_SequenceWrapper_dealloc,
+  0, // tp_print
+  0, // tp_getattr
+  0, // tp_setattr
+#if PY_MAJOR_VERSION >= 3
+  0, // tp_reserved
+#else
+  0, // tp_compare
+#endif
+  0, // tp_repr
+  0, // tp_as_number
+  &Dtool_SequenceWrapper_SequenceMethods,
+  0, // tp_as_mapping
+  0, // tp_hash
+  0, // tp_call
+  0, // tp_str
+  PyObject_GenericGetAttr,
+  PyObject_GenericSetAttr,
+  0, // tp_as_buffer
+  Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES,
+  0, // tp_doc
+  0, // tp_traverse
+  0, // tp_clear
+  0, // tp_richcompare
+  0, // tp_weaklistoffset
+  0, // tp_iter
+  0, // tp_iternext
+  0, // tp_methods
+  0, // tp_members
+  0, // tp_getset
+  0, // tp_base
+  0, // tp_dict
+  0, // tp_descr_get
+  0, // tp_descr_set
+  0, // tp_dictoffset
+  0, // tp_init
+  PyType_GenericAlloc,
+  0, // tp_new
+  PyObject_Del,
+  0, // tp_is_gc
+  0, // tp_bases
+  0, // tp_mro
+  0, // tp_cache
+  0, // tp_subclasses
+  0, // tp_weaklist
+  0, // tp_del
+#if PY_VERSION_HEX >= 0x02060000
+  0, // tp_version_tag
 #endif
 #endif
+#if PY_VERSION_HEX >= 0x03040000
+  0, // tp_finalize
+#endif
+};
 
 
 #endif  // HAVE_PYTHON
 #endif  // HAVE_PYTHON

+ 57 - 49
dtool/src/interrogatedb/py_panda.h

@@ -103,10 +103,6 @@ inline PyObject* doPy_RETURN_FALSE()
 #define nb_inplace_divide nb_inplace_true_divide
 #define nb_inplace_divide nb_inplace_true_divide
 
 
 #define PyLongOrInt_Check(x) PyLong_Check(x)
 #define PyLongOrInt_Check(x) PyLong_Check(x)
-#define PyLongOrInt_FromSize_t PyLong_FromSize_t
-#define PyLongOrInt_FromSsize_t PyLong_FromSsize_t
-#define PyLongOrInt_FromLong PyLong_FromLong
-#define PyLongOrInt_FromUnsignedLong PyLong_FromUnsignedLong
 #define PyLongOrInt_AS_LONG PyLong_AS_LONG
 #define PyLongOrInt_AS_LONG PyLong_AS_LONG
 #define PyInt_Check PyLong_Check
 #define PyInt_Check PyLong_Check
 #define PyInt_AsLong PyLong_AsLong
 #define PyInt_AsLong PyLong_AsLong
@@ -114,9 +110,6 @@ inline PyObject* doPy_RETURN_FALSE()
 #else
 #else
 #define PyLongOrInt_Check(x) (PyInt_Check(x) || PyLong_Check(x))
 #define PyLongOrInt_Check(x) (PyInt_Check(x) || PyLong_Check(x))
 // PyInt_FromSize_t automatically picks the right type.
 // PyInt_FromSize_t automatically picks the right type.
-#define PyLongOrInt_FromSize_t PyInt_FromSize_t
-#define PyLongOrInt_FromSsize_t PyInt_FromSsize_t
-#define PyLongOrInt_FromLong PyInt_FromLong
 #define PyLongOrInt_AS_LONG PyInt_AsLong
 #define PyLongOrInt_AS_LONG PyInt_AsLong
 
 
 // For more portably defining hash functions.
 // For more portably defining hash functions.
@@ -159,9 +152,6 @@ typedef void *(*DowncastFunction)(void *, Dtool_PyTypedObject *);
 typedef void *(*CoerceFunction)(PyObject *, void *);
 typedef void *(*CoerceFunction)(PyObject *, void *);
 typedef void (*ModuleClassInitFunction)(PyObject *module);
 typedef void (*ModuleClassInitFunction)(PyObject *module);
 
 
-// inline          Dtool_PyTypedObject *  Dtool_RuntimeTypeDtoolType(int
-// type); inline void     Dtool_Deallocate_General(PyObject * self); inline
-// int      DTOOL_PyObject_Compare(PyObject *v1, PyObject *v2); THIS IS THE
 // INSTANCE CONTAINER FOR ALL panda py objects....
 // INSTANCE CONTAINER FOR ALL panda py objects....
 struct Dtool_PyInstDef {
 struct Dtool_PyInstDef {
   PyObject_HEAD
   PyObject_HEAD
@@ -300,17 +290,7 @@ EXPCL_INTERROGATEDB bool Dtool_Call_ExtractThisPointer(PyObject *self, Dtool_PyT
 EXPCL_INTERROGATEDB bool Dtool_Call_ExtractThisPointer_NonConst(PyObject *self, Dtool_PyTypedObject &classdef,
 EXPCL_INTERROGATEDB bool Dtool_Call_ExtractThisPointer_NonConst(PyObject *self, Dtool_PyTypedObject &classdef,
                                                               void **answer, const char *method_name);
                                                               void **answer, const char *method_name);
 
 
-template<class T> INLINE bool DTOOL_Call_ExtractThisPointer(PyObject *self, T *&into) {
-  if (DtoolCanThisBeAPandaInstance(self)) {
-    Dtool_PyTypedObject *target_class = Dtool_RuntimeTypeDtoolType(get_type_handle(T).get_index());
-    if (target_class != NULL) {
-      into = (T*) ((Dtool_PyInstDef *)self)->_My_Type->_Dtool_UpcastInterface(self, target_class);
-      return (into != NULL);
-    }
-  }
-  into = NULL;
-  return false;
-}
+template<class T> INLINE bool DTOOL_Call_ExtractThisPointer(PyObject *self, T *&into);
 
 
 // Functions related to error reporting.
 // Functions related to error reporting.
 EXPCL_INTERROGATEDB bool _Dtool_CheckErrorOccurred();
 EXPCL_INTERROGATEDB bool _Dtool_CheckErrorOccurred();
@@ -348,6 +328,12 @@ EXPCL_INTERROGATEDB PyObject *_Dtool_Return(PyObject *value);
 #define Dtool_Return(value) _Dtool_Return(value)
 #define Dtool_Return(value) _Dtool_Return(value)
 #endif
 #endif
 
 
+/**
+ * Wrapper around Python 3.4's enum library, which does not have a C API.
+ */
+EXPCL_INTERROGATEDB PyObject *Dtool_EnumType_Create(const char *name, PyObject *names,
+                                                    const char *module = NULL);
+
 /**
 /**
 
 
  */
  */
@@ -359,29 +345,10 @@ EXPCL_INTERROGATEDB PyObject *DTool_CreatePyInstance(void *local_this, Dtool_PyT
 
 
 // These template methods allow use when the Dtool_PyTypedObject is not known.
 // These template methods allow use when the Dtool_PyTypedObject is not known.
 // They require a get_class_type() to be defined for the class.
 // They require a get_class_type() to be defined for the class.
-template<class T> INLINE PyObject *DTool_CreatePyInstance(const T *obj, bool memory_rules) {
-  Dtool_PyTypedObject *known_class = Dtool_RuntimeTypeDtoolType(get_type_handle(T).get_index());
-  nassertr(known_class != NULL, NULL);
-  return DTool_CreatePyInstance((void*) obj, *known_class, memory_rules, true);
-}
-
-template<class T> INLINE PyObject *DTool_CreatePyInstance(T *obj, bool memory_rules) {
-  Dtool_PyTypedObject *known_class = Dtool_RuntimeTypeDtoolType(get_type_handle(T).get_index());
-  nassertr(known_class != NULL, NULL);
-  return DTool_CreatePyInstance((void*) obj, *known_class, memory_rules, false);
-}
-
-template<class T> INLINE PyObject *DTool_CreatePyInstanceTyped(const T *obj, bool memory_rules) {
-  Dtool_PyTypedObject *known_class = Dtool_RuntimeTypeDtoolType(get_type_handle(T).get_index());
-  nassertr(known_class != NULL, NULL);
-  return DTool_CreatePyInstanceTyped((void*) obj, *known_class, memory_rules, true, obj->get_type().get_index());
-}
-
-template<class T> INLINE PyObject *DTool_CreatePyInstanceTyped(T *obj, bool memory_rules) {
-  Dtool_PyTypedObject *known_class = Dtool_RuntimeTypeDtoolType(get_type_handle(T).get_index());
-  nassertr(known_class != NULL, NULL);
-  return DTool_CreatePyInstanceTyped((void*) obj, *known_class, memory_rules, false, obj->get_type().get_index());
-}
+template<class T> INLINE PyObject *DTool_CreatePyInstance(const T *obj, bool memory_rules);
+template<class T> INLINE PyObject *DTool_CreatePyInstance(T *obj, bool memory_rules);
+template<class T> INLINE PyObject *DTool_CreatePyInstanceTyped(const T *obj, bool memory_rules);
+template<class T> INLINE PyObject *DTool_CreatePyInstanceTyped(T *obj, bool memory_rules);
 
 
 // Macro(s) class definition .. Used to allocate storage and init some values
 // Macro(s) class definition .. Used to allocate storage and init some values
 // for a Dtool Py Type object.
 // for a Dtool Py Type object.
@@ -474,18 +441,59 @@ copy_from_copy_constructor(PyObject *self, PyObject *noargs);
 EXPCL_INTERROGATEDB PyObject *
 EXPCL_INTERROGATEDB PyObject *
 map_deepcopy_to_copy(PyObject *self, PyObject *args);
 map_deepcopy_to_copy(PyObject *self, PyObject *args);
 
 
-#if PY_MAJOR_VERSION < 3
-// In the Python 3 case, it is defined as a macro, at the beginning of this
-// file.
-EXPCL_INTERROGATEDB PyObject *
-PyLongOrInt_FromUnsignedLong(unsigned long value);
+/**
+ * This class is returned from properties that require a settable interface,
+ * ie. something.children[i] = 3.
+ */
+struct Dtool_SequenceWrapper {
+  PyObject_HEAD
+  PyObject *_base;
+  lenfunc _len_func;
+  ssizeargfunc _getitem_func;
+  ssizeobjargproc _setitem_func;
+};
+
+EXPCL_INTERROGATEDB extern PyTypeObject Dtool_SequenceWrapper_Type;
+
+/**
+ * These functions convert a C++ value into the corresponding Python object.
+ * This used to be generated by the code generator, but it seems more reliable
+ * and maintainable to define these as overloads and have the compiler sort
+ * it out.
+ */
+ALWAYS_INLINE PyObject *Dtool_WrapValue(int value);
+ALWAYS_INLINE PyObject *Dtool_WrapValue(unsigned int value);
+ALWAYS_INLINE PyObject *Dtool_WrapValue(long value);
+ALWAYS_INLINE PyObject *Dtool_WrapValue(unsigned long value);
+ALWAYS_INLINE PyObject *Dtool_WrapValue(long long value);
+ALWAYS_INLINE PyObject *Dtool_WrapValue(unsigned long long value);
+ALWAYS_INLINE PyObject *Dtool_WrapValue(bool value);
+ALWAYS_INLINE PyObject *Dtool_WrapValue(double value);
+ALWAYS_INLINE PyObject *Dtool_WrapValue(const char *value);
+ALWAYS_INLINE PyObject *Dtool_WrapValue(const wchar_t *value);
+ALWAYS_INLINE PyObject *Dtool_WrapValue(const std::string &value);
+ALWAYS_INLINE PyObject *Dtool_WrapValue(const std::wstring &value);
+ALWAYS_INLINE PyObject *Dtool_WrapValue(const std::string *value);
+ALWAYS_INLINE PyObject *Dtool_WrapValue(const std::wstring *value);
+ALWAYS_INLINE PyObject *Dtool_WrapValue(char value);
+ALWAYS_INLINE PyObject *Dtool_WrapValue(wchar_t value);
+ALWAYS_INLINE PyObject *Dtool_WrapValue(PyObject *value);
+ALWAYS_INLINE PyObject *Dtool_WrapValue(const std::vector<unsigned char> &value);
+
+#if PY_MAJOR_VERSION >= 0x02060000
+ALWAYS_INLINE PyObject *Dtool_WrapValue(Py_buffer *value);
 #endif
 #endif
 
 
+template<class T1, class T2>
+ALWAYS_INLINE PyObject *Dtool_WrapValue(const std::pair<T1, T2> &value);
+
 EXPCL_INTERROGATEDB extern struct Dtool_PyTypedObject Dtool_DTOOL_SUPER_BASE;
 EXPCL_INTERROGATEDB extern struct Dtool_PyTypedObject Dtool_DTOOL_SUPER_BASE;
 EXPCL_INTERROGATEDB extern void Dtool_PyModuleClassInit_DTOOL_SUPER_BASE(PyObject *module);
 EXPCL_INTERROGATEDB extern void Dtool_PyModuleClassInit_DTOOL_SUPER_BASE(PyObject *module);
 
 
 #define Dtool_Ptr_DTOOL_SUPER_BASE (&Dtool_DTOOL_SUPER_BASE)
 #define Dtool_Ptr_DTOOL_SUPER_BASE (&Dtool_DTOOL_SUPER_BASE)
 
 
+#include "py_panda.I"
+
 #endif  // HAVE_PYTHON && !CPPPARSER
 #endif  // HAVE_PYTHON && !CPPPARSER
 
 
 #endif // PY_PANDA_H_
 #endif // PY_PANDA_H_

+ 1 - 1
dtool/src/prc/configDeclaration.I

@@ -187,7 +187,7 @@ get_int_word(size_t n) const {
  * Returns the int64 value of the nth word of the declaration's value, or 0 if
  * Returns the int64 value of the nth word of the declaration's value, or 0 if
  * there is no nth value.  See also has_int64_word().
  * there is no nth value.  See also has_int64_word().
  */
  */
-INLINE PN_int64 ConfigDeclaration::
+INLINE int64_t ConfigDeclaration::
 get_int64_word(size_t n) const {
 get_int64_word(size_t n) const {
   // We use has_string_word() instead of has_int64_word(), so we can return a
   // We use has_string_word() instead of has_int64_word(), so we can return a
   // partial answer if there was one.
   // partial answer if there was one.

+ 5 - 5
dtool/src/prc/configDeclaration.cxx

@@ -108,7 +108,7 @@ set_int_word(size_t n, int value) {
  * words.
  * words.
  */
  */
 void ConfigDeclaration::
 void ConfigDeclaration::
-set_int64_word(size_t n, PN_int64 value) {
+set_int64_word(size_t n, int64_t value) {
   set_string_word(n, format_string(value));
   set_string_word(n, format_string(value));
 
 
   _words[n]._flags |= (F_checked_int64 | F_valid_int64);
   _words[n]._flags |= (F_checked_int64 | F_valid_int64);
@@ -294,8 +294,8 @@ check_int64_word(size_t n) {
         ++pi;
         ++pi;
         // Negative number.
         // Negative number.
         while (pi != word._str.end() && isdigit(*pi)) {
         while (pi != word._str.end() && isdigit(*pi)) {
-          PN_int64 next = word._int_64 * 10 - (int)((*pi) - '0');
-          if ((PN_int64)(next / 10) != word._int_64) {
+          int64_t next = word._int_64 * 10 - (int)((*pi) - '0');
+          if ((int64_t)(next / 10) != word._int_64) {
             // Overflow.
             // Overflow.
             overflow = true;
             overflow = true;
           }
           }
@@ -306,8 +306,8 @@ check_int64_word(size_t n) {
       } else {
       } else {
         // Positive number.
         // Positive number.
         while (pi != word._str.end() && isdigit(*pi)) {
         while (pi != word._str.end() && isdigit(*pi)) {
-          PN_int64 next = word._int_64 * 10 + (int)((*pi) - '0');
-          if ((PN_int64)(next / 10) != word._int_64) {
+          int64_t next = word._int_64 * 10 + (int)((*pi) - '0');
+          if ((int64_t)(next / 10) != word._int_64) {
             // Overflow.
             // Overflow.
             overflow = true;
             overflow = true;
           }
           }

+ 3 - 3
dtool/src/prc/configDeclaration.h

@@ -59,13 +59,13 @@ PUBLISHED:
   INLINE string get_string_word(size_t n) const;
   INLINE string get_string_word(size_t n) const;
   INLINE bool get_bool_word(size_t n) const;
   INLINE bool get_bool_word(size_t n) const;
   INLINE int get_int_word(size_t n) const;
   INLINE int get_int_word(size_t n) const;
-  INLINE PN_int64 get_int64_word(size_t n) const;
+  INLINE int64_t get_int64_word(size_t n) const;
   INLINE double get_double_word(size_t n) const;
   INLINE double get_double_word(size_t n) const;
 
 
   void set_string_word(size_t n, const string &value);
   void set_string_word(size_t n, const string &value);
   void set_bool_word(size_t n, bool value);
   void set_bool_word(size_t n, bool value);
   void set_int_word(size_t n, int value);
   void set_int_word(size_t n, int value);
-  void set_int64_word(size_t n, PN_int64 value);
+  void set_int64_word(size_t n, int64_t value);
   void set_double_word(size_t n, double value);
   void set_double_word(size_t n, double value);
 
 
   INLINE int get_decl_seq() const;
   INLINE int get_decl_seq() const;
@@ -106,7 +106,7 @@ private:
     string _str;
     string _str;
     bool _bool;
     bool _bool;
     int _int;
     int _int;
-    PN_int64 _int_64;
+    int64_t _int_64;
     double _double;
     double _double;
     short _flags;
     short _flags;
   };
   };

+ 4 - 0
dtool/src/prc/configPage.h

@@ -44,6 +44,8 @@ PUBLISHED:
 
 
   INLINE bool is_special() const;
   INLINE bool is_special() const;
   INLINE bool is_implicit() const;
   INLINE bool is_implicit() const;
+  MAKE_PROPERTY(special, is_special);
+  MAKE_PROPERTY(implicit, is_implicit);
 
 
   void set_sort(int sort);
   void set_sort(int sort);
   INLINE int get_sort() const;
   INLINE int get_sort() const;
@@ -72,6 +74,8 @@ PUBLISHED:
   string get_string_value(size_t n) const;
   string get_string_value(size_t n) const;
   bool is_variable_used(size_t n) const;
   bool is_variable_used(size_t n) const;
 
 
+  MAKE_SEQ_PROPERTY(declarations, get_num_declarations, modify_declaration);
+
   void output(ostream &out) const;
   void output(ostream &out) const;
   void output_brief_signature(ostream &out) const;
   void output_brief_signature(ostream &out) const;
   void write(ostream &out) const;
   void write(ostream &out) const;

+ 2 - 2
dtool/src/prc/configVariable.I

@@ -196,7 +196,7 @@ get_int_word(size_t n) const {
  * Returns the int64 value of the nth word of the variable's value, or 0 if
  * Returns the int64 value of the nth word of the variable's value, or 0 if
  * there is no nth value.  See also has_int_word().
  * there is no nth value.  See also has_int_word().
  */
  */
-INLINE PN_int64 ConfigVariable::
+INLINE int64_t ConfigVariable::
 get_int64_word(size_t n) const {
 get_int64_word(size_t n) const {
   nassertr(is_constructed(), 0);
   nassertr(is_constructed(), 0);
   const ConfigDeclaration *decl = _core->get_declaration(0);
   const ConfigDeclaration *decl = _core->get_declaration(0);
@@ -249,7 +249,7 @@ set_int_word(size_t n, int value) {
  * words.
  * words.
  */
  */
 INLINE void ConfigVariable::
 INLINE void ConfigVariable::
-set_int64_word(size_t n, PN_int64 value) {
+set_int64_word(size_t n, int64_t value) {
   nassertv(is_constructed());
   nassertv(is_constructed());
   _core->make_local_value()->set_int64_word(n, value);
   _core->make_local_value()->set_int64_word(n, value);
 }
 }

+ 2 - 2
dtool/src/prc/configVariable.h

@@ -56,13 +56,13 @@ protected:
   INLINE string get_string_word(size_t n) const;
   INLINE string get_string_word(size_t n) const;
   INLINE bool get_bool_word(size_t n) const;
   INLINE bool get_bool_word(size_t n) const;
   INLINE int get_int_word(size_t n) const;
   INLINE int get_int_word(size_t n) const;
-  INLINE PN_int64 get_int64_word(size_t n) const;
+  INLINE int64_t get_int64_word(size_t n) const;
   INLINE double get_double_word(size_t n) const;
   INLINE double get_double_word(size_t n) const;
 
 
   INLINE void set_string_word(size_t n, const string &value);
   INLINE void set_string_word(size_t n, const string &value);
   INLINE void set_bool_word(size_t n, bool value);
   INLINE void set_bool_word(size_t n, bool value);
   INLINE void set_int_word(size_t n, int value);
   INLINE void set_int_word(size_t n, int value);
-  INLINE void set_int64_word(size_t n, PN_int64 value);
+  INLINE void set_int64_word(size_t n, int64_t value);
   INLINE void set_double_word(size_t n, double value);
   INLINE void set_double_word(size_t n, double value);
 
 
 protected:
 protected:

+ 15 - 0
dtool/src/prc/configVariableCore.h

@@ -75,10 +75,25 @@ PUBLISHED:
   INLINE size_t get_num_unique_references() const;
   INLINE size_t get_num_unique_references() const;
   INLINE const ConfigDeclaration *get_unique_reference(size_t n) const;
   INLINE const ConfigDeclaration *get_unique_reference(size_t n) const;
   MAKE_SEQ(get_unique_references, get_num_unique_references, get_unique_reference);
   MAKE_SEQ(get_unique_references, get_num_unique_references, get_unique_reference);
+  MAKE_SEQ_PROPERTY(declarations, get_num_declarations, get_declaration);
 
 
   void output(ostream &out) const;
   void output(ostream &out) const;
   void write(ostream &out) const;
   void write(ostream &out) const;
 
 
+  MAKE_PROPERTY(name, get_name);
+  MAKE_PROPERTY(used, is_used);
+  MAKE_PROPERTY(closed, is_closed);
+  MAKE_PROPERTY(trust_level, get_trust_level);
+  MAKE_PROPERTY(dynamic, is_dynamic);
+
+  MAKE_PROPERTY(value_type, get_value_type, set_value_type);
+  MAKE_PROPERTY(description, get_description, set_description);
+  MAKE_PROPERTY(default_value, get_default_value, set_default_value);
+
+  MAKE_SEQ_PROPERTY(references, get_num_references, get_reference);
+  MAKE_SEQ_PROPERTY(trusted_references, get_num_trusted_references, get_trusted_reference);
+  MAKE_SEQ_PROPERTY(unique_references, get_num_unique_references, get_unique_reference);
+
 private:
 private:
   void add_declaration(ConfigDeclaration *decl);
   void add_declaration(ConfigDeclaration *decl);
   void remove_declaration(ConfigDeclaration *decl);
   void remove_declaration(ConfigDeclaration *decl);

+ 10 - 10
dtool/src/prc/configVariableInt64.I

@@ -26,7 +26,7 @@ ConfigVariableInt64(const string &name) :
  *
  *
  */
  */
 INLINE ConfigVariableInt64::
 INLINE ConfigVariableInt64::
-ConfigVariableInt64(const string &name, PN_int64 default_value,
+ConfigVariableInt64(const string &name, int64_t default_value,
                     const string &description, int flags) :
                     const string &description, int flags) :
 #ifdef PRC_SAVE_DESCRIPTIONS
 #ifdef PRC_SAVE_DESCRIPTIONS
   ConfigVariable(name, ConfigVariableCore::VT_int64, description, flags),
   ConfigVariable(name, ConfigVariableCore::VT_int64, description, flags),
@@ -60,7 +60,7 @@ ConfigVariableInt64(const string &name, const string &default_value,
  * Reassigns the variable's local value.
  * Reassigns the variable's local value.
  */
  */
 INLINE void ConfigVariableInt64::
 INLINE void ConfigVariableInt64::
-operator = (PN_int64 value) {
+operator = (int64_t value) {
   set_value(value);
   set_value(value);
 }
 }
 
 
@@ -68,7 +68,7 @@ operator = (PN_int64 value) {
  * Returns the variable's value.
  * Returns the variable's value.
  */
  */
 INLINE ConfigVariableInt64::
 INLINE ConfigVariableInt64::
-operator PN_int64 () const {
+operator int64_t () const {
   return get_value();
   return get_value();
 }
 }
 
 
@@ -83,7 +83,7 @@ size() const {
 /**
 /**
  * Returns the value of the variable's nth word.
  * Returns the value of the variable's nth word.
  */
  */
-INLINE PN_int64 ConfigVariableInt64::
+INLINE int64_t ConfigVariableInt64::
 operator [] (size_t n) const {
 operator [] (size_t n) const {
   return get_word(n);
   return get_word(n);
 }
 }
@@ -92,7 +92,7 @@ operator [] (size_t n) const {
  * Reassigns the variable's local value.
  * Reassigns the variable's local value.
  */
  */
 INLINE void ConfigVariableInt64::
 INLINE void ConfigVariableInt64::
-set_value(PN_int64 value) {
+set_value(int64_t value) {
   set_string_value("");
   set_string_value("");
   set_int64_word(0, value);
   set_int64_word(0, value);
 }
 }
@@ -100,9 +100,9 @@ set_value(PN_int64 value) {
 /**
 /**
  * Returns the variable's value.
  * Returns the variable's value.
  */
  */
-INLINE PN_int64 ConfigVariableInt64::
+INLINE int64_t ConfigVariableInt64::
 get_value() const {
 get_value() const {
-  TAU_PROFILE("PN_int64 ConfigVariableInt64::get_value() const", " ", TAU_USER);
+  TAU_PROFILE("int64_t ConfigVariableInt64::get_value() const", " ", TAU_USER);
   if (!is_cache_valid(_local_modified)) {
   if (!is_cache_valid(_local_modified)) {
     mark_cache_valid(((ConfigVariableInt64 *)this)->_local_modified);
     mark_cache_valid(((ConfigVariableInt64 *)this)->_local_modified);
     ((ConfigVariableInt64 *)this)->_cache = get_int64_word(0);
     ((ConfigVariableInt64 *)this)->_cache = get_int64_word(0);
@@ -113,7 +113,7 @@ get_value() const {
 /**
 /**
  * Returns the variable's default value.
  * Returns the variable's default value.
  */
  */
-INLINE PN_int64 ConfigVariableInt64::
+INLINE int64_t ConfigVariableInt64::
 get_default_value() const {
 get_default_value() const {
   const ConfigDeclaration *decl = ConfigVariable::get_default_value();
   const ConfigDeclaration *decl = ConfigVariable::get_default_value();
   if (decl != (ConfigDeclaration *)NULL) {
   if (decl != (ConfigDeclaration *)NULL) {
@@ -125,7 +125,7 @@ get_default_value() const {
 /**
 /**
  * Returns the variable's nth value.
  * Returns the variable's nth value.
  */
  */
-INLINE PN_int64 ConfigVariableInt64::
+INLINE int64_t ConfigVariableInt64::
 get_word(size_t n) const {
 get_word(size_t n) const {
   return get_int64_word(n);
   return get_int64_word(n);
 }
 }
@@ -135,6 +135,6 @@ get_word(size_t n) const {
  * variable's overall value.
  * variable's overall value.
  */
  */
 INLINE void ConfigVariableInt64::
 INLINE void ConfigVariableInt64::
-set_word(size_t n, PN_int64 value) {
+set_word(size_t n, int64_t value) {
   set_int64_word(n, value);
   set_int64_word(n, value);
 }
 }

+ 1 - 1
dtool/src/prc/configVariableInt64.cxx

@@ -18,6 +18,6 @@
  *
  *
  */
  */
 void ConfigVariableInt64::
 void ConfigVariableInt64::
-set_default_value(PN_int64 default_value) {
+set_default_value(int64_t default_value) {
   _core->set_default_value(format_string(default_value));
   _core->set_default_value(format_string(default_value));
 }
 }

+ 11 - 11
dtool/src/prc/configVariableInt64.h

@@ -25,34 +25,34 @@
 class EXPCL_DTOOLCONFIG ConfigVariableInt64 : public ConfigVariable {
 class EXPCL_DTOOLCONFIG ConfigVariableInt64 : public ConfigVariable {
 PUBLISHED:
 PUBLISHED:
   INLINE ConfigVariableInt64(const string &name);
   INLINE ConfigVariableInt64(const string &name);
-  INLINE ConfigVariableInt64(const string &name, PN_int64 default_value,
+  INLINE ConfigVariableInt64(const string &name, int64_t default_value,
                              const string &description = string(),
                              const string &description = string(),
                              int flags = 0);
                              int flags = 0);
   INLINE ConfigVariableInt64(const string &name, const string &default_value,
   INLINE ConfigVariableInt64(const string &name, const string &default_value,
                              const string &description = string(),
                              const string &description = string(),
                              int flags = 0);
                              int flags = 0);
 
 
-  INLINE void operator = (PN_int64 value);
-  INLINE operator PN_int64 () const;
+  INLINE void operator = (int64_t value);
+  INLINE operator int64_t () const;
 
 
   INLINE size_t size() const;
   INLINE size_t size() const;
-  INLINE PN_int64 operator [] (size_t n) const;
+  INLINE int64_t operator [] (size_t n) const;
 
 
-  INLINE void set_value(PN_int64 value);
-  INLINE PN_int64 get_value() const;
-  INLINE PN_int64 get_default_value() const;
+  INLINE void set_value(int64_t value);
+  INLINE int64_t get_value() const;
+  INLINE int64_t get_default_value() const;
   MAKE_PROPERTY(value, get_value, set_value);
   MAKE_PROPERTY(value, get_value, set_value);
   MAKE_PROPERTY(default_value, get_default_value);
   MAKE_PROPERTY(default_value, get_default_value);
 
 
-  INLINE PN_int64 get_word(size_t n) const;
-  INLINE void set_word(size_t n, PN_int64 value);
+  INLINE int64_t get_word(size_t n) const;
+  INLINE void set_word(size_t n, int64_t value);
 
 
 private:
 private:
-  void set_default_value(PN_int64 default_value);
+  void set_default_value(int64_t default_value);
 
 
 private:
 private:
   AtomicAdjust::Integer _local_modified;
   AtomicAdjust::Integer _local_modified;
-  PN_int64 _cache;
+  int64_t _cache;
 };
 };
 
 
 #include "configVariableInt64.I"
 #include "configVariableInt64.I"

+ 2 - 0
dtool/src/prc/configVariableManager.h

@@ -48,6 +48,8 @@ PUBLISHED:
   string get_variable_name(size_t n) const;
   string get_variable_name(size_t n) const;
   bool is_variable_used(size_t n) const;
   bool is_variable_used(size_t n) const;
 
 
+  MAKE_SEQ_PROPERTY(variables, get_num_variables, get_variable);
+
   void output(ostream &out) const;
   void output(ostream &out) const;
   void write(ostream &out) const;
   void write(ostream &out) const;
 
 

+ 1 - 0
dtool/src/prc/configVariableSearchPath.h

@@ -68,6 +68,7 @@ PUBLISHED:
   INLINE size_t get_num_directories() const;
   INLINE size_t get_num_directories() const;
   INLINE const Filename &get_directory(size_t n) const;
   INLINE const Filename &get_directory(size_t n) const;
   MAKE_SEQ(get_directories, get_num_directories, get_directory);
   MAKE_SEQ(get_directories, get_num_directories, get_directory);
+  MAKE_SEQ_PROPERTY(directories, get_num_directories, get_directory);
 
 
   INLINE Filename find_file(const Filename &filename) const;
   INLINE Filename find_file(const Filename &filename) const;
   INLINE size_t find_all_files(const Filename &filename,
   INLINE size_t find_all_files(const Filename &filename,

+ 23 - 0
dtool/src/prc/encryptStream.I

@@ -109,6 +109,29 @@ close() {
   return *this;
   return *this;
 }
 }
 
 
+/**
+ * Returns the encryption algorithm that was read from the stream.
+ */
+INLINE const string &OEncryptStream::
+get_algorithm() const {
+  return _buf.get_algorithm();
+}
+
+/**
+ * Returns the encryption key length, in bits, that was read from the stream.
+ */
+INLINE int OEncryptStream::
+get_key_length() const {
+  return _buf.get_key_length();
+}
+
+/**
+ * Returns the value that was was read from the stream.
+ */
+INLINE int OEncryptStream::
+get_iteration_count() const {
+  return _buf.get_iteration_count();
+}
 
 
 /**
 /**
  * Specifies the encryption algorithm that should be used for future calls to
  * Specifies the encryption algorithm that should be used for future calls to

+ 14 - 0
dtool/src/prc/encryptStream.h

@@ -49,6 +49,10 @@ PUBLISHED:
   INLINE int get_key_length() const;
   INLINE int get_key_length() const;
   INLINE int get_iteration_count() const;
   INLINE int get_iteration_count() const;
 
 
+  MAKE_PROPERTY(algorithm, get_algorithm);
+  MAKE_PROPERTY(key_length, get_key_length);
+  MAKE_PROPERTY(iteration_count, get_iteration_count);
+
 private:
 private:
   EncryptStreamBuf _buf;
   EncryptStreamBuf _buf;
 };
 };
@@ -76,10 +80,20 @@ PUBLISHED:
                               const string &password);
                               const string &password);
   INLINE OEncryptStream &close();
   INLINE OEncryptStream &close();
 
 
+public:
+  INLINE const string &get_algorithm() const;
+  INLINE int get_key_length() const;
+  INLINE int get_iteration_count() const;
+
+PUBLISHED:
   INLINE void set_algorithm(const string &algorithm);
   INLINE void set_algorithm(const string &algorithm);
   INLINE void set_key_length(int key_length);
   INLINE void set_key_length(int key_length);
   INLINE void set_iteration_count(int iteration_count);
   INLINE void set_iteration_count(int iteration_count);
 
 
+  MAKE_PROPERTY(algorithm, get_algorithm, set_algorithm);
+  MAKE_PROPERTY(key_length, get_key_length, set_key_length);
+  MAKE_PROPERTY(iteration_count, get_iteration_count, set_iteration_count);
+
 private:
 private:
   EncryptStreamBuf _buf;
   EncryptStreamBuf _buf;
 };
 };

+ 6 - 6
dtool/src/prc/encryptStreamBuf.cxx

@@ -276,12 +276,12 @@ open_write(ostream *dest, bool owns_dest, const string &password) {
 
 
   // Now write the header information to the stream.
   // Now write the header information to the stream.
   StreamWriter sw(_dest, false);
   StreamWriter sw(_dest, false);
-  nassertv((PN_uint16)nid == nid);
-  sw.add_uint16((PN_uint16)nid);
-  nassertv((PN_uint16)key_length == key_length);
-  sw.add_uint16((PN_uint16)key_length);
-  nassertv((PN_uint16)count == count);
-  sw.add_uint16((PN_uint16)count);
+  nassertv((uint16_t)nid == nid);
+  sw.add_uint16((uint16_t)nid);
+  nassertv((uint16_t)key_length == key_length);
+  sw.add_uint16((uint16_t)key_length);
+  nassertv((uint16_t)count == count);
+  sw.add_uint16((uint16_t)count);
   sw.append_data(iv, iv_length);
   sw.append_data(iv, iv_length);
 
 
   _write_valid = true;
   _write_valid = true;

+ 4 - 4
dtool/src/prc/nativeNumericData.I

@@ -54,24 +54,24 @@ get_data() const {
 
 
 // this is for a intel compile .. it is native format and it is readable off
 // this is for a intel compile .. it is native format and it is readable off
 // word boundries
 // word boundries
-inline void TS_SetVal1(const PN_int8 * src, PN_int8 *dst)
+inline void TS_SetVal1(const int8_t * src, int8_t *dst)
 {
 {
   *dst = *src;
   *dst = *src;
 }
 }
 inline void TS_SetVal2(const char * src, char *dst)
 inline void TS_SetVal2(const char * src, char *dst)
 {
 {
-  *(reinterpret_cast<PN_int16 *>(dst)) = *(reinterpret_cast  <const PN_int16 *>(src));
+  *(reinterpret_cast<int16_t *>(dst)) = *(reinterpret_cast  <const int16_t *>(src));
 }
 }
 
 
 inline void TS_SetVal4(const char * src, char *dst)
 inline void TS_SetVal4(const char * src, char *dst)
 {
 {
-  *(reinterpret_cast <PN_int32 *>(dst)) = *(reinterpret_cast <const PN_int32 *>(src));
+  *(reinterpret_cast <int32_t *>(dst)) = *(reinterpret_cast <const int32_t *>(src));
 }
 }
 
 
 
 
 inline void TS_SetVal8(const char * src, char *dst)
 inline void TS_SetVal8(const char * src, char *dst)
 {
 {
-  *(reinterpret_cast<PN_int64 *>(dst)) = *(reinterpret_cast<const PN_int64 *>(src));
+  *(reinterpret_cast<int64_t *>(dst)) = *(reinterpret_cast<const int64_t *>(src));
 }
 }
 
 
 template<class type> inline type  TS_GetInteger(type &val,const  char * _src)
 template<class type> inline type  TS_GetInteger(type &val,const  char * _src)

+ 1 - 0
dtool/src/prc/notifyCategory.h

@@ -74,6 +74,7 @@ PUBLISHED:
   size_t get_num_children() const;
   size_t get_num_children() const;
   NotifyCategory *get_child(size_t i) const;
   NotifyCategory *get_child(size_t i) const;
   MAKE_SEQ(get_children, get_num_children, get_child);
   MAKE_SEQ(get_children, get_num_children, get_child);
+  MAKE_SEQ_PROPERTY(children, get_num_children, get_child);
 
 
   static void set_server_delta(long delta);
   static void set_server_delta(long delta);
 
 

+ 28 - 28
dtool/src/prc/streamReader.I

@@ -83,25 +83,25 @@ get_bool() {
 /**
 /**
  * Extracts a signed 8-bit integer.
  * Extracts a signed 8-bit integer.
  */
  */
-INLINE PN_int8 StreamReader::
+INLINE int8_t StreamReader::
 get_int8() {
 get_int8() {
-  return (PN_int8)_in->get();
+  return (int8_t)_in->get();
 }
 }
 
 
 /**
 /**
  * Extracts an unsigned 8-bit integer.
  * Extracts an unsigned 8-bit integer.
  */
  */
-INLINE PN_uint8 StreamReader::
+INLINE uint8_t StreamReader::
 get_uint8() {
 get_uint8() {
-  return (PN_uint8)_in->get();
+  return (uint8_t)_in->get();
 }
 }
 
 
 /**
 /**
  * Extracts a signed 16-bit integer.
  * Extracts a signed 16-bit integer.
  */
  */
-INLINE PN_int16 StreamReader::
+INLINE int16_t StreamReader::
 get_int16() {
 get_int16() {
-  PN_int16 readval, retval;
+  int16_t readval, retval;
   _in->read((char *)&readval, sizeof(readval));
   _in->read((char *)&readval, sizeof(readval));
   LittleEndian s(&readval, 0, sizeof(readval));
   LittleEndian s(&readval, 0, sizeof(readval));
   s.store_value(&retval, sizeof(retval));
   s.store_value(&retval, sizeof(retval));
@@ -111,9 +111,9 @@ get_int16() {
 /**
 /**
  * Extracts a signed 32-bit integer.
  * Extracts a signed 32-bit integer.
  */
  */
-INLINE PN_int32 StreamReader::
+INLINE int32_t StreamReader::
 get_int32() {
 get_int32() {
-  PN_int32 readval, retval;
+  int32_t readval, retval;
   _in->read((char *)&readval, sizeof(readval));
   _in->read((char *)&readval, sizeof(readval));
   LittleEndian s(&readval, 0, sizeof(readval));
   LittleEndian s(&readval, 0, sizeof(readval));
   s.store_value(&retval, sizeof(retval));
   s.store_value(&retval, sizeof(retval));
@@ -123,9 +123,9 @@ get_int32() {
 /**
 /**
  * Extracts a signed 64-bit integer.
  * Extracts a signed 64-bit integer.
  */
  */
-INLINE PN_int64 StreamReader::
+INLINE int64_t StreamReader::
 get_int64() {
 get_int64() {
-  PN_int64 readval, retval;
+  int64_t readval, retval;
   _in->read((char *)&readval, sizeof(readval));
   _in->read((char *)&readval, sizeof(readval));
   LittleEndian s(&readval, 0, sizeof(readval));
   LittleEndian s(&readval, 0, sizeof(readval));
   s.store_value(&retval, sizeof(retval));
   s.store_value(&retval, sizeof(retval));
@@ -135,9 +135,9 @@ get_int64() {
 /**
 /**
  * Extracts an unsigned 16-bit integer.
  * Extracts an unsigned 16-bit integer.
  */
  */
-INLINE PN_uint16 StreamReader::
+INLINE uint16_t StreamReader::
 get_uint16() {
 get_uint16() {
-  PN_uint16 readval, retval;
+  uint16_t readval, retval;
   _in->read((char *)&readval, sizeof(readval));
   _in->read((char *)&readval, sizeof(readval));
   LittleEndian s(&readval, 0, sizeof(readval));
   LittleEndian s(&readval, 0, sizeof(readval));
   s.store_value(&retval, sizeof(retval));
   s.store_value(&retval, sizeof(retval));
@@ -147,9 +147,9 @@ get_uint16() {
 /**
 /**
  * Extracts an unsigned 32-bit integer.
  * Extracts an unsigned 32-bit integer.
  */
  */
-INLINE PN_uint32 StreamReader::
+INLINE uint32_t StreamReader::
 get_uint32() {
 get_uint32() {
-  PN_uint32 readval, retval;
+  uint32_t readval, retval;
   _in->read((char *)&readval, sizeof(readval));
   _in->read((char *)&readval, sizeof(readval));
   LittleEndian s(&readval, 0, sizeof(readval));
   LittleEndian s(&readval, 0, sizeof(readval));
   s.store_value(&retval, sizeof(retval));
   s.store_value(&retval, sizeof(retval));
@@ -159,9 +159,9 @@ get_uint32() {
 /**
 /**
  * Extracts an unsigned 64-bit integer.
  * Extracts an unsigned 64-bit integer.
  */
  */
-INLINE PN_uint64 StreamReader::
+INLINE uint64_t StreamReader::
 get_uint64() {
 get_uint64() {
-  PN_uint64 readval, retval;
+  uint64_t readval, retval;
   _in->read((char *)&readval, sizeof(readval));
   _in->read((char *)&readval, sizeof(readval));
   LittleEndian s(&readval, 0, sizeof(readval));
   LittleEndian s(&readval, 0, sizeof(readval));
   s.store_value(&retval, sizeof(retval));
   s.store_value(&retval, sizeof(retval));
@@ -202,9 +202,9 @@ get_float64() {
 /**
 /**
  * Extracts a signed big-endian 16-bit integer.
  * Extracts a signed big-endian 16-bit integer.
  */
  */
-INLINE PN_int16 StreamReader::
+INLINE int16_t StreamReader::
 get_be_int16() {
 get_be_int16() {
-  PN_int16 readval, retval;
+  int16_t readval, retval;
   _in->read((char *)&readval, sizeof(readval));
   _in->read((char *)&readval, sizeof(readval));
   BigEndian s(&readval, 0, sizeof(readval));
   BigEndian s(&readval, 0, sizeof(readval));
   s.store_value(&retval, sizeof(retval));
   s.store_value(&retval, sizeof(retval));
@@ -214,9 +214,9 @@ get_be_int16() {
 /**
 /**
  * Extracts a signed big-endian 32-bit integer.
  * Extracts a signed big-endian 32-bit integer.
  */
  */
-INLINE PN_int32 StreamReader::
+INLINE int32_t StreamReader::
 get_be_int32() {
 get_be_int32() {
-  PN_int32 readval, retval;
+  int32_t readval, retval;
   _in->read((char *)&readval, sizeof(readval));
   _in->read((char *)&readval, sizeof(readval));
   BigEndian s(&readval, 0, sizeof(readval));
   BigEndian s(&readval, 0, sizeof(readval));
   s.store_value(&retval, sizeof(retval));
   s.store_value(&retval, sizeof(retval));
@@ -226,9 +226,9 @@ get_be_int32() {
 /**
 /**
  * Extracts a signed big-endian 64-bit integer.
  * Extracts a signed big-endian 64-bit integer.
  */
  */
-INLINE PN_int64 StreamReader::
+INLINE int64_t StreamReader::
 get_be_int64() {
 get_be_int64() {
-  PN_int64 readval, retval;
+  int64_t readval, retval;
   _in->read((char *)&readval, sizeof(readval));
   _in->read((char *)&readval, sizeof(readval));
   BigEndian s(&readval, 0, sizeof(readval));
   BigEndian s(&readval, 0, sizeof(readval));
   s.store_value(&retval, sizeof(retval));
   s.store_value(&retval, sizeof(retval));
@@ -238,9 +238,9 @@ get_be_int64() {
 /**
 /**
  * Extracts an unsigned big-endian 16-bit integer.
  * Extracts an unsigned big-endian 16-bit integer.
  */
  */
-INLINE PN_uint16 StreamReader::
+INLINE uint16_t StreamReader::
 get_be_uint16() {
 get_be_uint16() {
-  PN_uint16 readval, retval;
+  uint16_t readval, retval;
   _in->read((char *)&readval, sizeof(readval));
   _in->read((char *)&readval, sizeof(readval));
   BigEndian s(&readval, 0, sizeof(readval));
   BigEndian s(&readval, 0, sizeof(readval));
   s.store_value(&retval, sizeof(retval));
   s.store_value(&retval, sizeof(retval));
@@ -250,9 +250,9 @@ get_be_uint16() {
 /**
 /**
  * Extracts an unsigned big-endian 32-bit integer.
  * Extracts an unsigned big-endian 32-bit integer.
  */
  */
-INLINE PN_uint32 StreamReader::
+INLINE uint32_t StreamReader::
 get_be_uint32() {
 get_be_uint32() {
-  PN_uint32 readval, retval;
+  uint32_t readval, retval;
   _in->read((char *)&readval, sizeof(readval));
   _in->read((char *)&readval, sizeof(readval));
   BigEndian s(&readval, 0, sizeof(readval));
   BigEndian s(&readval, 0, sizeof(readval));
   s.store_value(&retval, sizeof(retval));
   s.store_value(&retval, sizeof(retval));
@@ -262,9 +262,9 @@ get_be_uint32() {
 /**
 /**
  * Extracts an unsigned big-endian 64-bit integer.
  * Extracts an unsigned big-endian 64-bit integer.
  */
  */
-INLINE PN_uint64 StreamReader::
+INLINE uint64_t StreamReader::
 get_be_uint64() {
 get_be_uint64() {
-  PN_uint64 readval, retval;
+  uint64_t readval, retval;
   _in->read((char *)&readval, sizeof(readval));
   _in->read((char *)&readval, sizeof(readval));
   BigEndian s(&readval, 0, sizeof(readval));
   BigEndian s(&readval, 0, sizeof(readval));
   s.store_value(&retval, sizeof(retval));
   s.store_value(&retval, sizeof(retval));

+ 15 - 14
dtool/src/prc/streamReader.h

@@ -34,26 +34,27 @@ PUBLISHED:
   INLINE ~StreamReader();
   INLINE ~StreamReader();
 
 
   INLINE istream *get_istream() const;
   INLINE istream *get_istream() const;
+  MAKE_PROPERTY(istream, get_istream);
 
 
   BLOCKING INLINE bool get_bool();
   BLOCKING INLINE bool get_bool();
-  BLOCKING INLINE PN_int8 get_int8();
-  BLOCKING INLINE PN_uint8 get_uint8();
+  BLOCKING INLINE int8_t get_int8();
+  BLOCKING INLINE uint8_t get_uint8();
 
 
-  BLOCKING INLINE PN_int16 get_int16();
-  BLOCKING INLINE PN_int32 get_int32();
-  BLOCKING INLINE PN_int64 get_int64();
-  BLOCKING INLINE PN_uint16 get_uint16();
-  BLOCKING INLINE PN_uint32 get_uint32();
-  BLOCKING INLINE PN_uint64 get_uint64();
+  BLOCKING INLINE int16_t get_int16();
+  BLOCKING INLINE int32_t get_int32();
+  BLOCKING INLINE int64_t get_int64();
+  BLOCKING INLINE uint16_t get_uint16();
+  BLOCKING INLINE uint32_t get_uint32();
+  BLOCKING INLINE uint64_t get_uint64();
   BLOCKING INLINE float get_float32();
   BLOCKING INLINE float get_float32();
   BLOCKING INLINE PN_float64 get_float64();
   BLOCKING INLINE PN_float64 get_float64();
 
 
-  BLOCKING INLINE PN_int16 get_be_int16();
-  BLOCKING INLINE PN_int32 get_be_int32();
-  BLOCKING INLINE PN_int64 get_be_int64();
-  BLOCKING INLINE PN_uint16 get_be_uint16();
-  BLOCKING INLINE PN_uint32 get_be_uint32();
-  BLOCKING INLINE PN_uint64 get_be_uint64();
+  BLOCKING INLINE int16_t get_be_int16();
+  BLOCKING INLINE int32_t get_be_int32();
+  BLOCKING INLINE int64_t get_be_int64();
+  BLOCKING INLINE uint16_t get_be_uint16();
+  BLOCKING INLINE uint32_t get_be_uint32();
+  BLOCKING INLINE uint64_t get_be_uint64();
   BLOCKING INLINE float get_be_float32();
   BLOCKING INLINE float get_be_float32();
   BLOCKING INLINE PN_float64 get_be_float64();
   BLOCKING INLINE PN_float64 get_be_float64();
 
 

+ 3 - 0
dtool/src/prc/streamWrapper.h

@@ -53,6 +53,7 @@ PUBLISHED:
   ~IStreamWrapper();
   ~IStreamWrapper();
 
 
   INLINE istream *get_istream() const;
   INLINE istream *get_istream() const;
+  MAKE_PROPERTY(istream, get_istream);
 
 
 public:
 public:
   void read(char *buffer, streamsize num_bytes);
   void read(char *buffer, streamsize num_bytes);
@@ -79,6 +80,7 @@ PUBLISHED:
   ~OStreamWrapper();
   ~OStreamWrapper();
 
 
   INLINE ostream *get_ostream() const;
   INLINE ostream *get_ostream() const;
+  MAKE_PROPERTY(ostream, get_ostream);
 
 
 public:
 public:
   void write(const char *buffer, streamsize num_bytes);
   void write(const char *buffer, streamsize num_bytes);
@@ -114,6 +116,7 @@ PUBLISHED:
   ~StreamWrapper();
   ~StreamWrapper();
 
 
   INLINE iostream *get_iostream() const;
   INLINE iostream *get_iostream() const;
+  MAKE_PROPERTY(iostream, get_iostream);
 
 
 private:
 private:
   iostream *_iostream;
   iostream *_iostream;

+ 17 - 17
dtool/src/prc/streamWriter.I

@@ -92,7 +92,7 @@ add_bool(bool b) {
  * Adds a signed 8-bit integer to the stream.
  * Adds a signed 8-bit integer to the stream.
  */
  */
 INLINE void StreamWriter::
 INLINE void StreamWriter::
-add_int8(PN_int8 value) {
+add_int8(int8_t value) {
   append_data(&value, 1);
   append_data(&value, 1);
 }
 }
 
 
@@ -100,7 +100,7 @@ add_int8(PN_int8 value) {
  * Adds an unsigned 8-bit integer to the stream.
  * Adds an unsigned 8-bit integer to the stream.
  */
  */
 INLINE void StreamWriter::
 INLINE void StreamWriter::
-add_uint8(PN_uint8 value) {
+add_uint8(uint8_t value) {
   append_data(&value, 1);
   append_data(&value, 1);
 }
 }
 
 
@@ -108,7 +108,7 @@ add_uint8(PN_uint8 value) {
  * Adds a signed 16-bit integer to the stream.
  * Adds a signed 16-bit integer to the stream.
  */
  */
 INLINE void StreamWriter::
 INLINE void StreamWriter::
-add_int16(PN_int16 value) {
+add_int16(int16_t value) {
   LittleEndian s(&value, sizeof(value));
   LittleEndian s(&value, sizeof(value));
   append_data(s.get_data(), sizeof(value));
   append_data(s.get_data(), sizeof(value));
 }
 }
@@ -117,7 +117,7 @@ add_int16(PN_int16 value) {
  * Adds a signed 32-bit integer to the stream.
  * Adds a signed 32-bit integer to the stream.
  */
  */
 INLINE void StreamWriter::
 INLINE void StreamWriter::
-add_int32(PN_int32 value) {
+add_int32(int32_t value) {
   LittleEndian s(&value, sizeof(value));
   LittleEndian s(&value, sizeof(value));
   append_data(s.get_data(), sizeof(value));
   append_data(s.get_data(), sizeof(value));
 }
 }
@@ -126,7 +126,7 @@ add_int32(PN_int32 value) {
  * Adds a signed 64-bit integer to the stream.
  * Adds a signed 64-bit integer to the stream.
  */
  */
 INLINE void StreamWriter::
 INLINE void StreamWriter::
-add_int64(PN_int64 value) {
+add_int64(int64_t value) {
   LittleEndian s(&value, sizeof(value));
   LittleEndian s(&value, sizeof(value));
   append_data(s.get_data(), sizeof(value));
   append_data(s.get_data(), sizeof(value));
 }
 }
@@ -135,7 +135,7 @@ add_int64(PN_int64 value) {
  * Adds an unsigned 16-bit integer to the stream.
  * Adds an unsigned 16-bit integer to the stream.
  */
  */
 INLINE void StreamWriter::
 INLINE void StreamWriter::
-add_uint16(PN_uint16 value) {
+add_uint16(uint16_t value) {
   LittleEndian s(&value, sizeof(value));
   LittleEndian s(&value, sizeof(value));
   append_data(s.get_data(), sizeof(value));
   append_data(s.get_data(), sizeof(value));
 }
 }
@@ -144,7 +144,7 @@ add_uint16(PN_uint16 value) {
  * Adds an unsigned 32-bit integer to the stream.
  * Adds an unsigned 32-bit integer to the stream.
  */
  */
 INLINE void StreamWriter::
 INLINE void StreamWriter::
-add_uint32(PN_uint32 value) {
+add_uint32(uint32_t value) {
   LittleEndian s(&value, sizeof(value));
   LittleEndian s(&value, sizeof(value));
   append_data(s.get_data(), sizeof(value));
   append_data(s.get_data(), sizeof(value));
 }
 }
@@ -153,7 +153,7 @@ add_uint32(PN_uint32 value) {
  * Adds an unsigned 64-bit integer to the stream.
  * Adds an unsigned 64-bit integer to the stream.
  */
  */
 INLINE void StreamWriter::
 INLINE void StreamWriter::
-add_uint64(PN_uint64 value) {
+add_uint64(uint64_t value) {
   LittleEndian s(&value, sizeof(value));
   LittleEndian s(&value, sizeof(value));
   append_data(s.get_data(), sizeof(value));
   append_data(s.get_data(), sizeof(value));
 }
 }
@@ -186,7 +186,7 @@ add_float64(PN_float64 value) {
  * Adds a signed 16-bit big-endian integer to the streamWriter.
  * Adds a signed 16-bit big-endian integer to the streamWriter.
  */
  */
 INLINE void StreamWriter::
 INLINE void StreamWriter::
-add_be_int16(PN_int16 value) {
+add_be_int16(int16_t value) {
   BigEndian s(&value, sizeof(value));
   BigEndian s(&value, sizeof(value));
   append_data(s.get_data(), sizeof(value));
   append_data(s.get_data(), sizeof(value));
 }
 }
@@ -195,7 +195,7 @@ add_be_int16(PN_int16 value) {
  * Adds a signed 32-bit big-endian integer to the streamWriter.
  * Adds a signed 32-bit big-endian integer to the streamWriter.
  */
  */
 INLINE void StreamWriter::
 INLINE void StreamWriter::
-add_be_int32(PN_int32 value) {
+add_be_int32(int32_t value) {
   BigEndian s(&value, sizeof(value));
   BigEndian s(&value, sizeof(value));
   append_data(s.get_data(), sizeof(value));
   append_data(s.get_data(), sizeof(value));
 }
 }
@@ -204,7 +204,7 @@ add_be_int32(PN_int32 value) {
  * Adds a signed 64-bit big-endian integer to the streamWriter.
  * Adds a signed 64-bit big-endian integer to the streamWriter.
  */
  */
 INLINE void StreamWriter::
 INLINE void StreamWriter::
-add_be_int64(PN_int64 value) {
+add_be_int64(int64_t value) {
   BigEndian s(&value, sizeof(value));
   BigEndian s(&value, sizeof(value));
   append_data(s.get_data(), sizeof(value));
   append_data(s.get_data(), sizeof(value));
 }
 }
@@ -213,7 +213,7 @@ add_be_int64(PN_int64 value) {
  * Adds an unsigned 16-bit big-endian integer to the streamWriter.
  * Adds an unsigned 16-bit big-endian integer to the streamWriter.
  */
  */
 INLINE void StreamWriter::
 INLINE void StreamWriter::
-add_be_uint16(PN_uint16 value) {
+add_be_uint16(uint16_t value) {
   BigEndian s(&value, sizeof(value));
   BigEndian s(&value, sizeof(value));
   append_data(s.get_data(), sizeof(value));
   append_data(s.get_data(), sizeof(value));
 }
 }
@@ -222,7 +222,7 @@ add_be_uint16(PN_uint16 value) {
  * Adds an unsigned 32-bit big-endian integer to the streamWriter.
  * Adds an unsigned 32-bit big-endian integer to the streamWriter.
  */
  */
 INLINE void StreamWriter::
 INLINE void StreamWriter::
-add_be_uint32(PN_uint32 value) {
+add_be_uint32(uint32_t value) {
   BigEndian s(&value, sizeof(value));
   BigEndian s(&value, sizeof(value));
   append_data(s.get_data(), sizeof(value));
   append_data(s.get_data(), sizeof(value));
 }
 }
@@ -231,7 +231,7 @@ add_be_uint32(PN_uint32 value) {
  * Adds an unsigned 64-bit big-endian integer to the streamWriter.
  * Adds an unsigned 64-bit big-endian integer to the streamWriter.
  */
  */
 INLINE void StreamWriter::
 INLINE void StreamWriter::
-add_be_uint64(PN_uint64 value) {
+add_be_uint64(uint64_t value) {
   BigEndian s(&value, sizeof(value));
   BigEndian s(&value, sizeof(value));
   append_data(s.get_data(), sizeof(value));
   append_data(s.get_data(), sizeof(value));
 }
 }
@@ -267,10 +267,10 @@ add_be_float64(PN_float64 value) {
 INLINE void StreamWriter::
 INLINE void StreamWriter::
 add_string(const string &str) {
 add_string(const string &str) {
   // The max sendable length for a string is 2^16.
   // The max sendable length for a string is 2^16.
-  nassertv(str.length() <= (PN_uint16)0xffff);
+  nassertv(str.length() <= (uint16_t)0xffff);
 
 
   // Strings always are preceded by their length
   // Strings always are preceded by their length
-  add_uint16((PN_uint16)str.length());
+  add_uint16((uint16_t)str.length());
 
 
   // Add the string
   // Add the string
   append_data(str);
   append_data(str);
@@ -282,7 +282,7 @@ add_string(const string &str) {
 INLINE void StreamWriter::
 INLINE void StreamWriter::
 add_string32(const string &str) {
 add_string32(const string &str) {
   // Strings always are preceded by their length
   // Strings always are preceded by their length
-  add_uint32((PN_uint32)str.length());
+  add_uint32((uint32_t)str.length());
 
 
   // Add the string
   // Add the string
   append_data(str);
   append_data(str);

+ 15 - 14
dtool/src/prc/streamWriter.h

@@ -36,28 +36,29 @@ PUBLISHED:
   INLINE ~StreamWriter();
   INLINE ~StreamWriter();
 
 
   INLINE ostream *get_ostream() const;
   INLINE ostream *get_ostream() const;
+  MAKE_PROPERTY(ostream, get_ostream);
 
 
   BLOCKING INLINE void add_bool(bool value);
   BLOCKING INLINE void add_bool(bool value);
-  BLOCKING INLINE void add_int8(PN_int8 value);
-  BLOCKING INLINE void add_uint8(PN_uint8 value);
+  BLOCKING INLINE void add_int8(int8_t value);
+  BLOCKING INLINE void add_uint8(uint8_t value);
 
 
   // The default numeric packing is little-endian.
   // The default numeric packing is little-endian.
-  BLOCKING INLINE void add_int16(PN_int16 value);
-  BLOCKING INLINE void add_int32(PN_int32 value);
-  BLOCKING INLINE void add_int64(PN_int64 value);
-  BLOCKING INLINE void add_uint16(PN_uint16 value);
-  BLOCKING INLINE void add_uint32(PN_uint32 value);
-  BLOCKING INLINE void add_uint64(PN_uint64 value);
+  BLOCKING INLINE void add_int16(int16_t value);
+  BLOCKING INLINE void add_int32(int32_t value);
+  BLOCKING INLINE void add_int64(int64_t value);
+  BLOCKING INLINE void add_uint16(uint16_t value);
+  BLOCKING INLINE void add_uint32(uint32_t value);
+  BLOCKING INLINE void add_uint64(uint64_t value);
   BLOCKING INLINE void add_float32(float value);
   BLOCKING INLINE void add_float32(float value);
   BLOCKING INLINE void add_float64(PN_float64 value);
   BLOCKING INLINE void add_float64(PN_float64 value);
 
 
   // These functions pack numbers big-endian, in case that's desired.
   // These functions pack numbers big-endian, in case that's desired.
-  BLOCKING INLINE void add_be_int16(PN_int16 value);
-  BLOCKING INLINE void add_be_int32(PN_int32 value);
-  BLOCKING INLINE void add_be_int64(PN_int64 value);
-  BLOCKING INLINE void add_be_uint16(PN_uint16 value);
-  BLOCKING INLINE void add_be_uint32(PN_uint32 value);
-  BLOCKING INLINE void add_be_uint64(PN_uint64 value);
+  BLOCKING INLINE void add_be_int16(int16_t value);
+  BLOCKING INLINE void add_be_int32(int32_t value);
+  BLOCKING INLINE void add_be_int64(int64_t value);
+  BLOCKING INLINE void add_be_uint16(uint16_t value);
+  BLOCKING INLINE void add_be_uint32(uint32_t value);
+  BLOCKING INLINE void add_be_uint64(uint64_t value);
   BLOCKING INLINE void add_be_float32(float value);
   BLOCKING INLINE void add_be_float32(float value);
   BLOCKING INLINE void add_be_float64(PN_float64 value);
   BLOCKING INLINE void add_be_float64(PN_float64 value);
 
 

+ 20 - 10
makepanda/makepanda.py

@@ -609,10 +609,14 @@ if (COMPILER == "MSVC"):
         else:
         else:
             LibName("TIFF", GetThirdpartyDir() + "tiff/lib/tiff.lib")
             LibName("TIFF", GetThirdpartyDir() + "tiff/lib/tiff.lib")
     if (PkgSkip("OPENEXR")==0):
     if (PkgSkip("OPENEXR")==0):
-        LibName("OPENEXR",     GetThirdpartyDir() + "openexr/lib/IlmImf-2_2.lib")
-        LibName("OPENEXR",     GetThirdpartyDir() + "openexr/lib/IlmThread-2_2.lib")
-        LibName("OPENEXR",     GetThirdpartyDir() + "openexr/lib/Iex-2_2.lib")
-        LibName("OPENEXR",     GetThirdpartyDir() + "openexr/lib/Half.lib")
+        suffix = ""
+        if os.path.isfile(GetThirdpartyDir() + "openexr/lib/IlmImf-2_2.lib"):
+            suffix = "-2_2"
+        LibName("OPENEXR", GetThirdpartyDir() + "openexr/lib/IlmImf" + suffix + ".lib")
+        LibName("OPENEXR", GetThirdpartyDir() + "openexr/lib/IlmThread" + suffix + ".lib")
+        LibName("OPENEXR", GetThirdpartyDir() + "openexr/lib/Iex" + suffix + ".lib")
+        LibName("OPENEXR", GetThirdpartyDir() + "openexr/lib/Half.lib")
+        IncDirectory("OPENEXR", GetThirdpartyDir() + "openexr/include/OpenEXR")
     if (PkgSkip("JPEG")==0):     LibName("JPEG",     GetThirdpartyDir() + "jpeg/lib/jpeg-static.lib")
     if (PkgSkip("JPEG")==0):     LibName("JPEG",     GetThirdpartyDir() + "jpeg/lib/jpeg-static.lib")
     if (PkgSkip("ZLIB")==0):     LibName("ZLIB",     GetThirdpartyDir() + "zlib/lib/zlibstatic.lib")
     if (PkgSkip("ZLIB")==0):     LibName("ZLIB",     GetThirdpartyDir() + "zlib/lib/zlibstatic.lib")
     if (PkgSkip("VRPN")==0):     LibName("VRPN",     GetThirdpartyDir() + "vrpn/lib/vrpn.lib")
     if (PkgSkip("VRPN")==0):     LibName("VRPN",     GetThirdpartyDir() + "vrpn/lib/vrpn.lib")
@@ -624,7 +628,6 @@ if (COMPILER == "MSVC"):
     if (PkgSkip("FFTW")==0):     LibName("FFTW",     GetThirdpartyDir() + "fftw/lib/rfftw.lib")
     if (PkgSkip("FFTW")==0):     LibName("FFTW",     GetThirdpartyDir() + "fftw/lib/rfftw.lib")
     if (PkgSkip("FFTW")==0):     LibName("FFTW",     GetThirdpartyDir() + "fftw/lib/fftw.lib")
     if (PkgSkip("FFTW")==0):     LibName("FFTW",     GetThirdpartyDir() + "fftw/lib/fftw.lib")
     if (PkgSkip("ARTOOLKIT")==0):LibName("ARTOOLKIT",GetThirdpartyDir() + "artoolkit/lib/libAR.lib")
     if (PkgSkip("ARTOOLKIT")==0):LibName("ARTOOLKIT",GetThirdpartyDir() + "artoolkit/lib/libAR.lib")
-    if (PkgSkip("FCOLLADA")==0): LibName("FCOLLADA", GetThirdpartyDir() + "fcollada/lib/FCollada.lib")
     if (PkgSkip("ASSIMP")==0):   PkgDisable("ASSIMP")  # Not yet supported
     if (PkgSkip("ASSIMP")==0):   PkgDisable("ASSIMP")  # Not yet supported
     if (PkgSkip("OPENCV")==0):   LibName("OPENCV",   GetThirdpartyDir() + "opencv/lib/cv.lib")
     if (PkgSkip("OPENCV")==0):   LibName("OPENCV",   GetThirdpartyDir() + "opencv/lib/cv.lib")
     if (PkgSkip("OPENCV")==0):   LibName("OPENCV",   GetThirdpartyDir() + "opencv/lib/highgui.lib")
     if (PkgSkip("OPENCV")==0):   LibName("OPENCV",   GetThirdpartyDir() + "opencv/lib/highgui.lib")
@@ -637,6 +640,9 @@ if (COMPILER == "MSVC"):
     if (PkgSkip("FFMPEG")==0):   LibName("FFMPEG",   GetThirdpartyDir() + "ffmpeg/lib/avutil.lib")
     if (PkgSkip("FFMPEG")==0):   LibName("FFMPEG",   GetThirdpartyDir() + "ffmpeg/lib/avutil.lib")
     if (PkgSkip("SWSCALE")==0):  LibName("SWSCALE",  GetThirdpartyDir() + "ffmpeg/lib/swscale.lib")
     if (PkgSkip("SWSCALE")==0):  LibName("SWSCALE",  GetThirdpartyDir() + "ffmpeg/lib/swscale.lib")
     if (PkgSkip("SWRESAMPLE")==0):LibName("SWRESAMPLE",GetThirdpartyDir() + "ffmpeg/lib/swresample.lib")
     if (PkgSkip("SWRESAMPLE")==0):LibName("SWRESAMPLE",GetThirdpartyDir() + "ffmpeg/lib/swresample.lib")
+    if (PkgSkip("FCOLLADA")==0):
+        LibName("FCOLLADA", GetThirdpartyDir() + "fcollada/lib/FCollada.lib")
+        IncDirectory("FCOLLADA", GetThirdpartyDir() + "fcollada/include/FCollada")
     if (PkgSkip("SQUISH")==0):
     if (PkgSkip("SQUISH")==0):
         if GetOptimize() <= 2:
         if GetOptimize() <= 2:
             LibName("SQUISH",   GetThirdpartyDir() + "squish/lib/squishd.lib")
             LibName("SQUISH",   GetThirdpartyDir() + "squish/lib/squishd.lib")
@@ -649,7 +655,11 @@ if (COMPILER == "MSVC"):
             LibName("ROCKET", GetThirdpartyDir() + "rocket/lib/" + SDK["PYTHONVERSION"] + "/boost_python-vc100-mt-1_54.lib")
             LibName("ROCKET", GetThirdpartyDir() + "rocket/lib/" + SDK["PYTHONVERSION"] + "/boost_python-vc100-mt-1_54.lib")
         if (GetOptimize() <= 3):
         if (GetOptimize() <= 3):
             LibName("ROCKET", GetThirdpartyDir() + "rocket/lib/RocketDebugger.lib")
             LibName("ROCKET", GetThirdpartyDir() + "rocket/lib/RocketDebugger.lib")
-    if (PkgSkip("OPENAL")==0):   LibName("OPENAL",   GetThirdpartyDir() + "openal/lib/OpenAL32.lib")
+    if (PkgSkip("OPENAL")==0):
+        LibName("OPENAL", GetThirdpartyDir() + "openal/lib/OpenAL32.lib")
+        if not os.path.isfile(GetThirdpartyDir() + "openal/bin/OpenAL32.dll"):
+            # Link OpenAL Soft statically.
+            DefSymbol("OPENAL", "AL_LIBTYPE_STATIC")
     if (PkgSkip("ODE")==0):
     if (PkgSkip("ODE")==0):
         LibName("ODE",      GetThirdpartyDir() + "ode/lib/ode_single.lib")
         LibName("ODE",      GetThirdpartyDir() + "ode/lib/ode_single.lib")
         DefSymbol("ODE",    "dSINGLE", "")
         DefSymbol("ODE",    "dSINGLE", "")
@@ -787,7 +797,7 @@ if (COMPILER=="GCC"):
         SmartPkgEnable("OPENAL",    "openal",    ("openal"), "AL/al.h", framework = "OpenAL")
         SmartPkgEnable("OPENAL",    "openal",    ("openal"), "AL/al.h", framework = "OpenAL")
         SmartPkgEnable("SQUISH",    "",          ("squish"), "squish.h")
         SmartPkgEnable("SQUISH",    "",          ("squish"), "squish.h")
         SmartPkgEnable("TIFF",      "libtiff-4", ("tiff"), "tiff.h")
         SmartPkgEnable("TIFF",      "libtiff-4", ("tiff"), "tiff.h")
-        SmartPkgEnable("OPENEXR",   "",          ("openexr"), "ImfOutputFile.h")
+        SmartPkgEnable("OPENEXR",   "OpenEXR",   ("IlmImf", "Imath", "Half", "Iex", "IexMath", "IlmThread"), ("OpenEXR", "OpenEXR/ImfOutputFile.h"))
         SmartPkgEnable("VRPN",      "",          ("vrpn", "quat"), ("vrpn", "quat.h", "vrpn/vrpn_Types.h"))
         SmartPkgEnable("VRPN",      "",          ("vrpn", "quat"), ("vrpn", "quat.h", "vrpn/vrpn_Types.h"))
         SmartPkgEnable("BULLET", "bullet", ("BulletSoftBody", "BulletDynamics", "BulletCollision", "LinearMath"), ("bullet", "bullet/btBulletDynamicsCommon.h"))
         SmartPkgEnable("BULLET", "bullet", ("BulletSoftBody", "BulletDynamics", "BulletCollision", "LinearMath"), ("bullet", "bullet/btBulletDynamicsCommon.h"))
         SmartPkgEnable("VORBIS",    "vorbisfile",("vorbisfile", "vorbis", "ogg"), ("ogg/ogg.h", "vorbis/vorbisfile.h"))
         SmartPkgEnable("VORBIS",    "vorbisfile",("vorbisfile", "vorbis", "ogg"), ("ogg/ogg.h", "vorbis/vorbisfile.h"))
@@ -2193,7 +2203,7 @@ DTOOL_CONFIG=[
     ("PHAVE_DIRENT_H",                 'UNDEF',                  '1'),
     ("PHAVE_DIRENT_H",                 'UNDEF',                  '1'),
     ("PHAVE_SYS_SOUNDCARD_H",          'UNDEF',                  '1'),
     ("PHAVE_SYS_SOUNDCARD_H",          'UNDEF',                  '1'),
     ("PHAVE_UCONTEXT_H",               'UNDEF',                  '1'),
     ("PHAVE_UCONTEXT_H",               'UNDEF',                  '1'),
-    ("PHAVE_STDINT_H",                 'UNDEF',                  '1'),
+    ("PHAVE_STDINT_H",                 '1',                      '1'),
     ("HAVE_RTTI",                      '1',                      '1'),
     ("HAVE_RTTI",                      '1',                      '1'),
     ("HAVE_X11",                       'UNDEF',                  '1'),
     ("HAVE_X11",                       'UNDEF',                  '1'),
     ("HAVE_XRANDR",                    'UNDEF',                  '1'),
     ("HAVE_XRANDR",                    'UNDEF',                  '1'),
@@ -3835,7 +3845,7 @@ if (not RUNTIME):
 #
 #
 
 
 if (not RUNTIME):
 if (not RUNTIME):
-  OPTS=['DIR:panda/src/pnmimagetypes', 'DIR:panda/src/pnmimage', 'BUILDING:PANDA', 'PNG', 'ZLIB', 'JPEG', 'TIFF', 'OPENEXR']
+  OPTS=['DIR:panda/src/pnmimagetypes', 'DIR:panda/src/pnmimage', 'BUILDING:PANDA', 'PNG', 'ZLIB', 'JPEG', 'TIFF', 'OPENEXR', 'EXCEPTIONS']
   TargetAdd('p3pnmimagetypes_composite1.obj', opts=OPTS, input='p3pnmimagetypes_composite1.cxx')
   TargetAdd('p3pnmimagetypes_composite1.obj', opts=OPTS, input='p3pnmimagetypes_composite1.cxx')
   TargetAdd('p3pnmimagetypes_composite2.obj', opts=OPTS, input='p3pnmimagetypes_composite2.cxx')
   TargetAdd('p3pnmimagetypes_composite2.obj', opts=OPTS, input='p3pnmimagetypes_composite2.cxx')
 
 
@@ -4264,7 +4274,7 @@ if PkgSkip("OPENAL") == 0 and not RUNTIME:
   TargetAdd('openal_audio_openal_audio_composite1.obj', opts=OPTS, input='openal_audio_composite1.cxx')
   TargetAdd('openal_audio_openal_audio_composite1.obj', opts=OPTS, input='openal_audio_composite1.cxx')
   TargetAdd('libp3openal_audio.dll', input='openal_audio_openal_audio_composite1.obj')
   TargetAdd('libp3openal_audio.dll', input='openal_audio_openal_audio_composite1.obj')
   TargetAdd('libp3openal_audio.dll', input=COMMON_PANDA_LIBS)
   TargetAdd('libp3openal_audio.dll', input=COMMON_PANDA_LIBS)
-  TargetAdd('libp3openal_audio.dll', opts=['MODULE', 'ADVAPI', 'WINUSER', 'WINMM', 'OPENAL'])
+  TargetAdd('libp3openal_audio.dll', opts=['MODULE', 'ADVAPI', 'WINUSER', 'WINMM', 'WINSHELL', 'WINOLE', 'OPENAL'])
 
 
 #
 #
 # DIRECTORY: panda/src/downloadertools/
 # DIRECTORY: panda/src/downloadertools/

+ 12 - 4
makepanda/makepandacore.py

@@ -2851,6 +2851,17 @@ def GetOrigExt(x):
 def SetOrigExt(x, v):
 def SetOrigExt(x, v):
     ORIG_EXT[x] = v
     ORIG_EXT[x] = v
 
 
+def GetExtensionSuffix():
+    if sys.version_info >= (3, 0):
+        suffix = sysconfig.get_config_var('EXT_SUFFIX')
+        if suffix:
+            return suffix
+    target = GetTarget()
+    if target == 'windows':
+        return '.pyd'
+    else:
+        return '.so'
+
 def CalcLocation(fn, ipath):
 def CalcLocation(fn, ipath):
     if fn.startswith("panda3d/") and fn.endswith(".py"):
     if fn.startswith("panda3d/") and fn.endswith(".py"):
         return OUTPUTDIR + "/" + fn
         return OUTPUTDIR + "/" + fn
@@ -2872,6 +2883,7 @@ def CalcLocation(fn, ipath):
     if (fn.endswith(".xml")): return CxxFindSource(fn, ipath)
     if (fn.endswith(".xml")): return CxxFindSource(fn, ipath)
     if (fn.endswith(".egg")): return OUTPUTDIR+"/models/"+fn
     if (fn.endswith(".egg")): return OUTPUTDIR+"/models/"+fn
     if (fn.endswith(".egg.pz")):return OUTPUTDIR+"/models/"+fn
     if (fn.endswith(".egg.pz")):return OUTPUTDIR+"/models/"+fn
+    if (fn.endswith(".pyd")): return OUTPUTDIR+"/panda3d/"+fn[:-4]+GetExtensionSuffix()
     if (target == 'windows'):
     if (target == 'windows'):
         if (fn.endswith(".def")):   return CxxFindSource(fn, ipath)
         if (fn.endswith(".def")):   return CxxFindSource(fn, ipath)
         if (fn.endswith(".rc")):    return CxxFindSource(fn, ipath)
         if (fn.endswith(".rc")):    return CxxFindSource(fn, ipath)
@@ -2880,7 +2892,6 @@ def CalcLocation(fn, ipath):
         if (fn.endswith(".res")):   return OUTPUTDIR+"/tmp/"+fn
         if (fn.endswith(".res")):   return OUTPUTDIR+"/tmp/"+fn
         if (fn.endswith(".tlb")):   return OUTPUTDIR+"/tmp/"+fn
         if (fn.endswith(".tlb")):   return OUTPUTDIR+"/tmp/"+fn
         if (fn.endswith(".dll")):   return OUTPUTDIR+"/bin/"+fn[:-4]+dllext+".dll"
         if (fn.endswith(".dll")):   return OUTPUTDIR+"/bin/"+fn[:-4]+dllext+".dll"
-        if (fn.endswith(".pyd")):   return OUTPUTDIR+"/panda3d/"+fn[:-4]+".pyd"
         if (fn.endswith(".ocx")):   return OUTPUTDIR+"/plugins/"+fn[:-4]+dllext+".ocx"
         if (fn.endswith(".ocx")):   return OUTPUTDIR+"/plugins/"+fn[:-4]+dllext+".ocx"
         if (fn.endswith(".mll")):   return OUTPUTDIR+"/plugins/"+fn[:-4]+dllext+".mll"
         if (fn.endswith(".mll")):   return OUTPUTDIR+"/plugins/"+fn[:-4]+dllext+".mll"
         if (fn.endswith(".dlo")):   return OUTPUTDIR+"/plugins/"+fn[:-4]+dllext+".dlo"
         if (fn.endswith(".dlo")):   return OUTPUTDIR+"/plugins/"+fn[:-4]+dllext+".dlo"
@@ -2897,7 +2908,6 @@ def CalcLocation(fn, ipath):
         if (fn.endswith(".plist")): return CxxFindSource(fn, ipath)
         if (fn.endswith(".plist")): return CxxFindSource(fn, ipath)
         if (fn.endswith(".obj")):   return OUTPUTDIR+"/tmp/"+fn[:-4]+".o"
         if (fn.endswith(".obj")):   return OUTPUTDIR+"/tmp/"+fn[:-4]+".o"
         if (fn.endswith(".dll")):   return OUTPUTDIR+"/lib/"+fn[:-4]+".dylib"
         if (fn.endswith(".dll")):   return OUTPUTDIR+"/lib/"+fn[:-4]+".dylib"
-        if (fn.endswith(".pyd")):   return OUTPUTDIR+"/panda3d/"+fn[:-4]+".so"
         if (fn.endswith(".mll")):   return OUTPUTDIR+"/plugins/"+fn
         if (fn.endswith(".mll")):   return OUTPUTDIR+"/plugins/"+fn
         if (fn.endswith(".exe")):   return OUTPUTDIR+"/bin/"+fn[:-4]
         if (fn.endswith(".exe")):   return OUTPUTDIR+"/bin/"+fn[:-4]
         if (fn.endswith(".p3d")):   return OUTPUTDIR+"/bin/"+fn[:-4]
         if (fn.endswith(".p3d")):   return OUTPUTDIR+"/bin/"+fn[:-4]
@@ -2910,7 +2920,6 @@ def CalcLocation(fn, ipath):
         # On Android, we build the libraries into built/tmp, then copy them.
         # On Android, we build the libraries into built/tmp, then copy them.
         if (fn.endswith(".obj")):   return OUTPUTDIR+"/tmp/"+fn[:-4]+".o"
         if (fn.endswith(".obj")):   return OUTPUTDIR+"/tmp/"+fn[:-4]+".o"
         if (fn.endswith(".dll")):   return OUTPUTDIR+"/tmp/"+fn[:-4]+".so"
         if (fn.endswith(".dll")):   return OUTPUTDIR+"/tmp/"+fn[:-4]+".so"
-        if (fn.endswith(".pyd")):   return OUTPUTDIR+"/tmp/"+fn[:-4]+".so"
         if (fn.endswith(".mll")):   return OUTPUTDIR+"/plugins/"+fn
         if (fn.endswith(".mll")):   return OUTPUTDIR+"/plugins/"+fn
         if (fn.endswith(".plugin")):return OUTPUTDIR+"/plugins/"+fn[:-7]+dllext+".so"
         if (fn.endswith(".plugin")):return OUTPUTDIR+"/plugins/"+fn[:-7]+dllext+".so"
         if (fn.endswith(".exe")):   return OUTPUTDIR+"/tmp/lib"+fn[:-4]+".so"
         if (fn.endswith(".exe")):   return OUTPUTDIR+"/tmp/lib"+fn[:-4]+".so"
@@ -2919,7 +2928,6 @@ def CalcLocation(fn, ipath):
     else:
     else:
         if (fn.endswith(".obj")):   return OUTPUTDIR+"/tmp/"+fn[:-4]+".o"
         if (fn.endswith(".obj")):   return OUTPUTDIR+"/tmp/"+fn[:-4]+".o"
         if (fn.endswith(".dll")):   return OUTPUTDIR+"/lib/"+fn[:-4]+".so"
         if (fn.endswith(".dll")):   return OUTPUTDIR+"/lib/"+fn[:-4]+".so"
-        if (fn.endswith(".pyd")):   return OUTPUTDIR+"/panda3d/"+fn[:-4]+".so"
         if (fn.endswith(".mll")):   return OUTPUTDIR+"/plugins/"+fn
         if (fn.endswith(".mll")):   return OUTPUTDIR+"/plugins/"+fn
         if (fn.endswith(".plugin")):return OUTPUTDIR+"/plugins/"+fn[:-7]+dllext+".so"
         if (fn.endswith(".plugin")):return OUTPUTDIR+"/plugins/"+fn[:-7]+dllext+".so"
         if (fn.endswith(".exe")):   return OUTPUTDIR+"/bin/"+fn[:-4]
         if (fn.endswith(".exe")):   return OUTPUTDIR+"/bin/"+fn[:-4]

+ 1 - 1
panda/src/audiotraits/openalAudioManager.cxx

@@ -438,7 +438,7 @@ get_sound_data(MovieAudio *movie, int mode) {
     }
     }
     int channels = stream->audio_channels();
     int channels = stream->audio_channels();
     int samples = (int)(stream->length() * stream->audio_rate());
     int samples = (int)(stream->length() * stream->audio_rate());
-    PN_int16 *data = new PN_int16[samples * channels];
+    int16_t *data = new int16_t[samples * channels];
     stream->read_samples(samples, data);
     stream->read_samples(samples, data);
     alBufferData(sd->_sample,
     alBufferData(sd->_sample,
                  (channels>1) ? AL_FORMAT_STEREO16 : AL_FORMAT_MONO16,
                  (channels>1) ? AL_FORMAT_STEREO16 : AL_FORMAT_MONO16,

+ 2 - 2
panda/src/audiotraits/openalAudioSound.cxx

@@ -383,8 +383,8 @@ read_stream_data(int bytelen, unsigned char *buffer) {
     if (samples > _sd->_stream->ready()) {
     if (samples > _sd->_stream->ready()) {
       samples = _sd->_stream->ready();
       samples = _sd->_stream->ready();
     }
     }
-    cursor->read_samples(samples, (PN_int16 *)buffer);
-    size_t hval = AddHash::add_hash(0, (PN_uint8*)buffer, samples*channels*2);
+    cursor->read_samples(samples, (int16_t *)buffer);
+    size_t hval = AddHash::add_hash(0, (uint8_t*)buffer, samples*channels*2);
     audio_debug("Streaming " << cursor->get_source()->get_name() << " at " << t << " hash " << hval);
     audio_debug("Streaming " << cursor->get_source()->get_name() << " at " << t << " hash " << hval);
     fill += samples;
     fill += samples;
     space -= samples;
     space -= samples;

+ 7 - 7
panda/src/bullet/bulletSoftBodyMaterial.I

@@ -20,7 +20,7 @@ INLINE BulletSoftBodyMaterial::
 }
 }
 
 
 /**
 /**
- * Named constructor intended to be used for asserts with have to return a
+ * Named constructor intended to be used for asserts which have to return a
  * concrete value.
  * concrete value.
  */
  */
 INLINE BulletSoftBodyMaterial BulletSoftBodyMaterial::
 INLINE BulletSoftBodyMaterial BulletSoftBodyMaterial::
@@ -44,7 +44,7 @@ get_material() const {
  * Getter for the property m_kLST.
  * Getter for the property m_kLST.
  */
  */
 INLINE PN_stdfloat BulletSoftBodyMaterial::
 INLINE PN_stdfloat BulletSoftBodyMaterial::
-getLinearStiffness() const {
+get_linear_stiffness() const {
 
 
   return (PN_stdfloat)_material.m_kLST;
   return (PN_stdfloat)_material.m_kLST;
 }
 }
@@ -53,7 +53,7 @@ getLinearStiffness() const {
  * Setter for the property m_kLST.
  * Setter for the property m_kLST.
  */
  */
 INLINE void BulletSoftBodyMaterial::
 INLINE void BulletSoftBodyMaterial::
-setLinearStiffness(PN_stdfloat value) {
+set_linear_stiffness(PN_stdfloat value) {
 
 
   _material.m_kLST = (btScalar)value;
   _material.m_kLST = (btScalar)value;
 }
 }
@@ -62,7 +62,7 @@ setLinearStiffness(PN_stdfloat value) {
  * Getter for the property m_kAST.
  * Getter for the property m_kAST.
  */
  */
 INLINE PN_stdfloat BulletSoftBodyMaterial::
 INLINE PN_stdfloat BulletSoftBodyMaterial::
-getAngularStiffness() const {
+get_angular_stiffness() const {
 
 
   return (PN_stdfloat)_material.m_kAST;
   return (PN_stdfloat)_material.m_kAST;
 }
 }
@@ -71,7 +71,7 @@ getAngularStiffness() const {
  * Setter for the property m_kAST.
  * Setter for the property m_kAST.
  */
  */
 INLINE void BulletSoftBodyMaterial::
 INLINE void BulletSoftBodyMaterial::
-setAngularStiffness(PN_stdfloat value) {
+set_angular_stiffness(PN_stdfloat value) {
 
 
   _material.m_kAST = (btScalar)value;
   _material.m_kAST = (btScalar)value;
 }
 }
@@ -80,7 +80,7 @@ setAngularStiffness(PN_stdfloat value) {
  * Getter for the property m_kVST.
  * Getter for the property m_kVST.
  */
  */
 INLINE PN_stdfloat BulletSoftBodyMaterial::
 INLINE PN_stdfloat BulletSoftBodyMaterial::
-getVolumePreservation() const {
+get_volume_preservation() const {
 
 
   return (PN_stdfloat)_material.m_kVST;
   return (PN_stdfloat)_material.m_kVST;
 }
 }
@@ -89,7 +89,7 @@ getVolumePreservation() const {
  * Setter for the property m_kVST.
  * Setter for the property m_kVST.
  */
  */
 INLINE void BulletSoftBodyMaterial::
 INLINE void BulletSoftBodyMaterial::
-setVolumePreservation(PN_stdfloat value) {
+set_volume_preservation(PN_stdfloat value) {
 
 
   _material.m_kVST = (btScalar)value;
   _material.m_kVST = (btScalar)value;
 }
 }

+ 11 - 7
panda/src/bullet/bulletSoftBodyMaterial.h

@@ -27,13 +27,17 @@ PUBLISHED:
   INLINE ~BulletSoftBodyMaterial();
   INLINE ~BulletSoftBodyMaterial();
   INLINE static BulletSoftBodyMaterial empty();
   INLINE static BulletSoftBodyMaterial empty();
 
 
-  INLINE void setLinearStiffness(PN_stdfloat value);
-  INLINE void setAngularStiffness(PN_stdfloat value);
-  INLINE void setVolumePreservation(PN_stdfloat value);
-
-  INLINE PN_stdfloat getLinearStiffness() const;
-  INLINE PN_stdfloat getAngularStiffness() const;
-  INLINE PN_stdfloat getVolumePreservation() const;
+  INLINE void set_linear_stiffness(PN_stdfloat value);
+  INLINE PN_stdfloat get_linear_stiffness() const;
+  MAKE_PROPERTY(linear_stiffness, get_linear_stiffness, set_linear_stiffness);
+  
+  INLINE void set_angular_stiffness(PN_stdfloat value);
+  INLINE PN_stdfloat get_angular_stiffness() const;
+  MAKE_PROPERTY(angular_stiffness, get_angular_stiffness, set_angular_stiffness);
+  
+  INLINE void set_volume_preservation(PN_stdfloat value);
+  INLINE PN_stdfloat get_volume_preservation() const;
+  MAKE_PROPERTY(volume_preservation, get_volume_preservation, set_volume_preservation);
 
 
 public:
 public:
   BulletSoftBodyMaterial(btSoftBody::Material &material);
   BulletSoftBodyMaterial(btSoftBody::Material &material);

+ 2 - 0
panda/src/chan/animGroup.h

@@ -44,6 +44,8 @@ PUBLISHED:
   AnimGroup *get_child(int n) const;
   AnimGroup *get_child(int n) const;
   MAKE_SEQ(get_children, get_num_children, get_child);
   MAKE_SEQ(get_children, get_num_children, get_child);
 
 
+  MAKE_SEQ_PROPERTY(children, get_num_children, get_child);
+
   AnimGroup *get_child_named(const string &name) const;
   AnimGroup *get_child_named(const string &name) const;
   AnimGroup *find_child(const string &name) const;
   AnimGroup *find_child(const string &name) const;
   void sort_descendants();
   void sort_descendants();

+ 6 - 0
panda/src/chan/partBundle.h

@@ -113,6 +113,12 @@ PUBLISHED:
   INLINE PartBundleNode *get_node(int n) const;
   INLINE PartBundleNode *get_node(int n) const;
   MAKE_SEQ(get_nodes, get_num_nodes, get_node);
   MAKE_SEQ(get_nodes, get_num_nodes, get_node);
 
 
+  MAKE_PROPERTY(blend_type, get_blend_type, set_blend_type);
+  MAKE_PROPERTY(anim_blend_flag, get_anim_blend_flag, set_anim_blend_flag);
+  MAKE_PROPERTY(frame_blend_flag, get_frame_blend_flag, set_frame_blend_flag);
+  MAKE_PROPERTY(root_xform, get_root_xform, set_root_xform);
+  MAKE_SEQ_PROPERTY(nodes, get_num_nodes, get_node);
+
   void clear_control_effects();
   void clear_control_effects();
   INLINE void set_control_effect(AnimControl *control, PN_stdfloat effect);
   INLINE void set_control_effect(AnimControl *control, PN_stdfloat effect);
   INLINE PN_stdfloat get_control_effect(AnimControl *control) const;
   INLINE PN_stdfloat get_control_effect(AnimControl *control) const;

+ 2 - 0
panda/src/chan/partBundleHandle.h

@@ -38,6 +38,8 @@ PUBLISHED:
   INLINE PartBundle *get_bundle();
   INLINE PartBundle *get_bundle();
   INLINE void set_bundle(PartBundle *bundle);
   INLINE void set_bundle(PartBundle *bundle);
 
 
+  MAKE_PROPERTY(bundle, get_bundle, set_bundle);
+
 private:
 private:
   PT(PartBundle) _bundle;
   PT(PartBundle) _bundle;
 };
 };

+ 3 - 0
panda/src/chan/partBundleNode.h

@@ -54,6 +54,9 @@ PUBLISHED:
   INLINE PartBundleHandle *get_bundle_handle(int n) const;
   INLINE PartBundleHandle *get_bundle_handle(int n) const;
   MAKE_SEQ(get_bundle_handles, get_num_bundles, get_bundle_handle);
   MAKE_SEQ(get_bundle_handles, get_num_bundles, get_bundle_handle);
 
 
+  MAKE_SEQ_PROPERTY(bundles, get_num_bundles, get_bundle);
+  MAKE_SEQ_PROPERTY(bundle_handles, get_num_bundles, get_bundle_handle);
+
 protected:
 protected:
   void add_bundle(PartBundle *bundle);
   void add_bundle(PartBundle *bundle);
   void add_bundle_handle(PartBundleHandle *handle);
   void add_bundle_handle(PartBundleHandle *handle);

+ 1 - 0
panda/src/chan/partGroup.h

@@ -70,6 +70,7 @@ PUBLISHED:
   int get_num_children() const;
   int get_num_children() const;
   PartGroup *get_child(int n) const;
   PartGroup *get_child(int n) const;
   MAKE_SEQ(get_children, get_num_children, get_child);
   MAKE_SEQ(get_children, get_num_children, get_child);
+  MAKE_SEQ_PROPERTY(children, get_num_children, get_child);
 
 
   PartGroup *get_child_named(const string &name) const;
   PartGroup *get_child_named(const string &name) const;
   PartGroup *find_child(const string &name) const;
   PartGroup *find_child(const string &name) const;

+ 4 - 1
panda/src/collide/collisionFloorMesh.h

@@ -40,7 +40,6 @@ public:
   } TriangleIndices;
   } TriangleIndices;
 
 
 PUBLISHED:
 PUBLISHED:
-
   INLINE CollisionFloorMesh();
   INLINE CollisionFloorMesh();
 
 
   INLINE void add_vertex(const LPoint3 &vert);
   INLINE void add_vertex(const LPoint3 &vert);
@@ -55,6 +54,10 @@ PUBLISHED:
 
 
   virtual LPoint3 get_collision_origin() const;
   virtual LPoint3 get_collision_origin() const;
 
 
+PUBLISHED:
+  MAKE_SEQ_PROPERTY(vertices, get_num_vertices, get_vertex);
+  MAKE_SEQ_PROPERTY(triangles, get_num_triangles, get_triangle);
+
 public:
 public:
   CollisionFloorMesh(const CollisionFloorMesh &copy);
   CollisionFloorMesh(const CollisionFloorMesh &copy);
   virtual CollisionSolid *make_copy();
   virtual CollisionSolid *make_copy();

+ 4 - 0
panda/src/collide/collisionHandlerEvent.h

@@ -60,6 +60,10 @@ PUBLISHED:
   INLINE string get_out_pattern(int n) const;
   INLINE string get_out_pattern(int n) const;
   MAKE_SEQ(get_out_patterns, get_num_out_patterns, get_out_pattern);
   MAKE_SEQ(get_out_patterns, get_num_out_patterns, get_out_pattern);
 
 
+  MAKE_SEQ_PROPERTY(in_patterns, get_num_in_patterns, get_in_pattern);
+  MAKE_SEQ_PROPERTY(again_patterns, get_num_again_patterns, get_out_pattern);
+  MAKE_SEQ_PROPERTY(out_patterns, get_num_out_patterns, get_out_pattern);
+
   void clear();
   void clear();
   void flush();
   void flush();
 
 

+ 1 - 0
panda/src/collide/collisionHandlerQueue.h

@@ -40,6 +40,7 @@ PUBLISHED:
   int get_num_entries() const;
   int get_num_entries() const;
   CollisionEntry *get_entry(int n) const;
   CollisionEntry *get_entry(int n) const;
   MAKE_SEQ(get_entries, get_num_entries, get_entry);
   MAKE_SEQ(get_entries, get_num_entries, get_entry);
+  MAKE_SEQ_PROPERTY(entries, get_num_entries, get_entry);
 
 
   void output(ostream &out) const;
   void output(ostream &out) const;
   void write(ostream &out, int indent_level = 0) const;
   void write(ostream &out, int indent_level = 0) const;

+ 1 - 0
panda/src/collide/collisionNode.h

@@ -68,6 +68,7 @@ PUBLISHED:
   INLINE void set_solid(int n, CollisionSolid *solid);
   INLINE void set_solid(int n, CollisionSolid *solid);
   INLINE void remove_solid(int n);
   INLINE void remove_solid(int n);
   INLINE int add_solid(const CollisionSolid *solid);
   INLINE int add_solid(const CollisionSolid *solid);
+  MAKE_SEQ_PROPERTY(solids, get_num_solids, get_solid, set_solid, remove_solid);
 
 
   INLINE int get_collider_sort() const;
   INLINE int get_collider_sort() const;
   INLINE void set_collider_sort(int sort);
   INLINE void set_collider_sort(int sort);

+ 1 - 0
panda/src/collide/collisionPolygon.h

@@ -60,6 +60,7 @@ PUBLISHED:
   bool is_concave() const;
   bool is_concave() const;
 
 
 PUBLISHED:
 PUBLISHED:
+  MAKE_SEQ_PROPERTY(points, get_num_points, get_point);
   MAKE_PROPERTY(valid, is_valid);
   MAKE_PROPERTY(valid, is_valid);
   MAKE_PROPERTY(concave, is_concave);
   MAKE_PROPERTY(concave, is_concave);
 
 

+ 1 - 0
panda/src/collide/collisionTraverser.h

@@ -60,6 +60,7 @@ PUBLISHED:
   MAKE_SEQ(get_colliders, get_num_colliders, get_collider);
   MAKE_SEQ(get_colliders, get_num_colliders, get_collider);
   CollisionHandler *get_handler(const NodePath &collider) const;
   CollisionHandler *get_handler(const NodePath &collider) const;
   void clear_colliders();
   void clear_colliders();
+  MAKE_SEQ_PROPERTY(colliders, get_num_colliders, get_collider);
 
 
   void traverse(const NodePath &root);
   void traverse(const NodePath &root);
 
 

Some files were not shown because too many files changed in this diff